main.c revision c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3
1837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh/* 2837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * Copyright (C) 2009 The Android Open Source Project 3837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * 4837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 5837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * you may not use this file except in compliance with the License. 6837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * You may obtain a copy of the License at 7837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * 8837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * http://www.apache.org/licenses/LICENSE-2.0 9837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * 10837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software 11837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS, 12837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * See the License for the specific language governing permissions and 14837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh * limitations under the License. 15837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh */ 16837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 17837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include <stdio.h> 18837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include <stdlib.h> 19837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include <string.h> 20bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh#include <stdarg.h> 21837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include <signal.h> 22837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include <unistd.h> 23837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include <sys/types.h> 24837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include <sys/socket.h> 25837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include <sys/select.h> 26837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 27458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#ifdef ANDROID_CHANGES 28c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh#include <sys/ioctl.h> 29c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh#include <linux/if.h> 30458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#include <android/log.h> 31458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#include <cutils/sockets.h> 32ac4023a6627737df5866f2c773059ba42e14a357Chia-chi Yeh#include <private/android_filesystem_config.h> 33b880c6609b0f748abe0ce19fea3b1b2fdfd991beChia-chi Yeh#include "keystore_get.h" 34458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#endif 35458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 36837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "config.h" 37837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "libpfkey.h" 38837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "gcmalloc.h" 39837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "vmbuf.h" 40837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "crypto_openssl.h" 41837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "oakley.h" 42837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "pfkey.h" 43837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "schedule.h" 44837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "isakmp_var.h" 45837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "nattraversal.h" 46837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "localconf.h" 47837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "sockmisc.h" 48bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh#include "grabmyaddr.h" 49bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh#include "plog.h" 50837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "admin.h" 51837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "privsep.h" 52837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "misc.h" 53837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 54458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#ifdef ANDROID_CHANGES 55458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 56458fe1ef88671dfe580c488973d5573194839087Chia-chi Yehstatic int get_control_and_arguments(int *argc, char ***argv) 57458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh{ 58c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh static char *args[32]; 59458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int control; 60458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int i; 61458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 62458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if ((i = android_get_control_socket("racoon")) == -1) { 63458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh return -1; 64458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 65458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_DEBUG, "Waiting for control socket"); 66458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if (listen(i, 1) == -1 || (control = accept(i, NULL, 0)) == -1) { 67458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_ERROR, "Cannot get control socket"); 68458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh exit(-1); 69458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 70458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh close(i); 71458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 72458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh args[0] = (*argv)[0]; 73c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh for (i = 1; i < 32; ++i) { 74c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh unsigned char bytes[2]; 75c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh if (recv(control, &bytes[0], 1, 0) != 1 76c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh || recv(control, &bytes[1], 1, 0) != 1) { 77458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_ERROR, "Cannot get argument length"); 78458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh exit(-1); 79458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } else { 80c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh int length = bytes[0] << 8 | bytes[1]; 81458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int offset = 0; 82c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh 83c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh if (length == 0xFFFF) { 84c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh break; 85c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh } 86458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh args[i] = malloc(length + 1); 87458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh while (offset < length) { 88458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int n = recv(control, &args[i][offset], length - offset, 0); 89458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if (n > 0) { 90458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh offset += n; 91458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } else { 92458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_ERROR, "Cannot get argument value"); 93458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh exit(-1); 94458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 95458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 96458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh args[i][length] = 0; 97458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 98458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 99458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_DEBUG, "Received %d arguments", i - 1); 100458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 101458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh *argc = i; 102458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh *argv = args; 103458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh return control; 104458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh} 105458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 106c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yehstatic void bind_interface() 107c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh{ 108c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh struct ifreq ifreqs[64]; 109c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh struct ifconf ifconf = {.ifc_len = sizeof(ifreqs), .ifc_req = ifreqs}; 110c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh struct myaddrs *p = lcconf->myaddrs; 111c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 112c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh if (ioctl(p->sock, SIOCGIFCONF, &ifconf) == -1) { 113c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh do_plog(LLV_WARNING, "Cannot list interfaces"); 114c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh return; 115c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh } 116c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 117c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh while (p) { 118c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh int i = ifconf.ifc_len / sizeof(struct ifreq) - 1; 119c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh while (i >= 0 && cmpsaddrwop(p->addr, &ifreqs[i].ifr_addr)) { 120c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh --i; 121c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh } 122c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh if (i < 0 || setsockopt(p->sock, SOL_SOCKET, SO_BINDTODEVICE, 123c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh ifreqs[i].ifr_name, IFNAMSIZ) == -1) { 124c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh do_plog(LLV_WARNING, "Cannot bind socket %d to proper interface", 125c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh p->sock); 126c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh } 127c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh p = p->next; 128c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh } 129c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh} 130c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 131458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#endif 132458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 133c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yehextern void setup(int argc, char **argv); 134c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yehint f_local = 0; 135c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 136c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yehstatic void terminate(int signal) 137c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh{ 138c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh exit(1); 139c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh} 140c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 141c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yehstatic void terminated() 142c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh{ 143c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh do_plog(LLV_INFO, "Bye\n"); 144c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh} 145c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 146837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehint main(int argc, char **argv) 147837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 148837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh fd_set fdset; 149837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh int fdset_size; 150837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh struct myaddrs *p; 151458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#ifdef ANDROID_CHANGES 152458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int control = get_control_and_arguments(&argc, &argv); 153458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#endif 154837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 1557197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh signal(SIGHUP, terminate); 1567197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh signal(SIGINT, terminate); 1577197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh signal(SIGTERM, terminate); 158837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh signal(SIGPIPE, SIG_IGN); 1599d271b685df5830e92a789119fe9b908da2f6c78Chia-chi Yeh setup(argc, argv); 1609d271b685df5830e92a789119fe9b908da2f6c78Chia-chi Yeh 161051f86dfca525c160855397f7b6a4fb5ef8df2b5Chia-chi Yeh do_plog(LLV_INFO, "ipsec-tools 0.7.3 (http://ipsec-tools.sf.net)\n"); 1629d271b685df5830e92a789119fe9b908da2f6c78Chia-chi Yeh atexit(terminated); 163837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 164837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh eay_init(); 165837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh oakley_dhinit(); 166837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh compute_vendorids(); 167837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh sched_init(); 168837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 1697197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh if (pfkey_init() < 0 || isakmp_init() < 0) { 170837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh exit(1); 171837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 172837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 1739d271b685df5830e92a789119fe9b908da2f6c78Chia-chi Yeh#ifdef ENABLE_NATT 1749d271b685df5830e92a789119fe9b908da2f6c78Chia-chi Yeh natt_keepalive_init(); 1759d271b685df5830e92a789119fe9b908da2f6c78Chia-chi Yeh#endif 1769d271b685df5830e92a789119fe9b908da2f6c78Chia-chi Yeh 177458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#ifdef ANDROID_CHANGES 178c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh bind_interface(); 179ac4023a6627737df5866f2c773059ba42e14a357Chia-chi Yeh setuid(AID_VPN); 180458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#endif 181458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 182837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh FD_ZERO(&fdset); 183837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh FD_SET(lcconf->sock_pfkey, &fdset); 184837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh fdset_size = lcconf->sock_pfkey; 185837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh for (p = lcconf->myaddrs; p; p = p->next) { 186837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh FD_SET(p->sock, &fdset); 187837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh if (fdset_size < p->sock) { 188837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh fdset_size = p->sock; 189837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 190837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 191837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh ++fdset_size; 192837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 193837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh while (1) { 194837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh fd_set readset = fdset; 195837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh struct timeval *timeout = schedular(); 196837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh if (select(fdset_size, &readset, NULL, NULL, timeout) < 0) { 197837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh exit(1); 198837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 199837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh if (FD_ISSET(lcconf->sock_pfkey, &readset)) { 200837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh pfkey_handler(); 201837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 202837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh for (p = lcconf->myaddrs; p; p = p->next) { 203837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh if (FD_ISSET(p->sock, &readset)) { 204837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh isakmp_handler(p->sock); 205837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 206837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 207837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 208837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh return 0; 209837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 210837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 211837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh/* plog.h */ 212837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 213837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehvoid do_plog(int level, char *format, ...) 214837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 215458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if (level >= 0 && level <= 5) { 216458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#ifdef ANDROID_CHANGES 217458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh static int levels[6] = { 218458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh ANDROID_LOG_ERROR, ANDROID_LOG_WARN, ANDROID_LOG_INFO, 219458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh ANDROID_LOG_INFO, ANDROID_LOG_DEBUG, ANDROID_LOG_VERBOSE 220458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh }; 221458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_list ap; 222458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_start(ap, format); 223458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh __android_log_vprint(levels[level], "racoon", format, ap); 224458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_end(ap); 225458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#else 226458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh static char *levels = "EWNIDV"; 227458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh fprintf(stderr, "%c: ", levels[level]); 228458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_list ap; 229458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_start(ap, format); 230458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh vfprintf(stderr, format, ap); 231458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_end(ap); 232458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#endif 233458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 234837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 235837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 236837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehchar *binsanitize(char *data, size_t length) 237837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 238837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh char *output = racoon_malloc(length + 1); 239837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh if (output) { 240837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh size_t i; 241837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh for (i = 0; i < length; ++i) { 242c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh output[i] = (data[i] < ' ' || data[i] > '~') ? '?' : data[i]; 243837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 244837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh output[length] = '\0'; 245837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 246837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh return output; 247837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 248837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 249837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh/* privsep.h */ 250837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 251837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehint privsep_pfkey_open() 252837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 253837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh return pfkey_open(); 254837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 255837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 256837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehvoid privsep_pfkey_close(int key) 257837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 258837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh pfkey_close(key); 259837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 260837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 261837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehvchar_t *privsep_eay_get_pkcs1privkey(char *file) 262837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 263837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh return eay_get_pkcs1privkey(file); 264837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 265837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 266bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yehvchar_t *privsep_getpsk(const char *key, int size) 267bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh{ 268bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh vchar_t *p = NULL; 269bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh if (key && (p = vmalloc(size)) != NULL) { 270bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh memcpy(p->v, key, p->l); 271bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh } 272bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh return p; 273bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh} 274bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh 275837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehint privsep_script_exec(char *script, int name, char * const *environ) 276837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 277837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh return 0; 278837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 279837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 280c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh/* grabmyaddr.h */ 281c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 282c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yehint getsockmyaddr(struct sockaddr *addr) 283c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh{ 284c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh struct myaddrs *p; 285c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh for (p = lcconf->myaddrs; p; p = p->next) { 286c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh if (cmpsaddrstrict(addr, p->addr) == 0) { 287c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh return p->sock; 288c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh } 289c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh } 290c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh return -1; 291c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh} 292c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 293837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh/* misc.h */ 294837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 295837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehint racoon_hexdump(void *data, size_t length) 296837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 297837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh return 0; 298837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 299