main.c revision 66d08f4f81c446015c03113bd86d1ef5121bab36
1837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh/* 2e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh * Copyright (C) 2011 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> 19bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh#include <stdarg.h> 20837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include <signal.h> 21f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh#include <poll.h> 2266d08f4f81c446015c03113bd86d1ef5121bab36Chia-chi Yeh#include <unistd.h> 23f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 24837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "config.h" 25837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "gcmalloc.h" 26837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "schedule.h" 27bd5fa3c99638830d3fa1ae5b4fc4988de5ee0f4dChia-chi Yeh#include "plog.h" 28837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 29458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#ifdef ANDROID_CHANGES 30458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 31c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root#include <openssl/engine.h> 32c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root 331070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <string.h> 341070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <sys/types.h> 351070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <sys/socket.h> 361070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <sys/ioctl.h> 371070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <sys/stat.h> 381070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <fcntl.h> 391070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <errno.h> 401070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <linux/if.h> 411070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <linux/if_tun.h> 421070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh 431070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <android/log.h> 441070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <cutils/sockets.h> 451070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <private/android_filesystem_config.h> 461070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh 47cadace43df20e28cc98c2068b327ec3ebe119418Chia-chi Yehstatic void notify_death() 48cadace43df20e28cc98c2068b327ec3ebe119418Chia-chi Yeh{ 49cadace43df20e28cc98c2068b327ec3ebe119418Chia-chi Yeh creat("/data/misc/vpn/abort", 0); 50cadace43df20e28cc98c2068b327ec3ebe119418Chia-chi Yeh} 51cadace43df20e28cc98c2068b327ec3ebe119418Chia-chi Yeh 524dd8f6be6496fc7cb7b7351c79f6a90be7be8991Chia-chi Yehstatic int android_get_control_and_arguments(int *argc, char ***argv) 53458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh{ 54c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh static char *args[32]; 55458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int control; 56458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int i; 57458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 58cadace43df20e28cc98c2068b327ec3ebe119418Chia-chi Yeh atexit(notify_death); 59cadace43df20e28cc98c2068b327ec3ebe119418Chia-chi Yeh 60458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if ((i = android_get_control_socket("racoon")) == -1) { 61e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh return -1; 62458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 63458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_DEBUG, "Waiting for control socket"); 64458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if (listen(i, 1) == -1 || (control = accept(i, NULL, 0)) == -1) { 65458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_ERROR, "Cannot get control socket"); 66f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh exit(1); 67458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 68458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh close(i); 693724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh fcntl(control, F_SETFD, FD_CLOEXEC); 70458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 71458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh args[0] = (*argv)[0]; 72c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh for (i = 1; i < 32; ++i) { 73c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh unsigned char bytes[2]; 743724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh if (recv(control, &bytes[0], 1, 0) != 1 || 753724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh recv(control, &bytes[1], 1, 0) != 1) { 76458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_ERROR, "Cannot get argument length"); 77f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh exit(1); 78458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } else { 793724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh int length = bytes[0] << 8 | bytes[1]; 80458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int offset = 0; 81c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh 823724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh if (length == 0xFFFF) { 833724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh break; 843724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh } 85458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh args[i] = malloc(length + 1); 86458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh while (offset < length) { 87458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int n = recv(control, &args[i][offset], length - offset, 0); 88458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if (n > 0) { 89458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh offset += n; 90458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } else { 91458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_ERROR, "Cannot get argument value"); 92f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh exit(1); 93458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 94458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 95458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh args[i][length] = 0; 96458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 97458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 98458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_DEBUG, "Received %d arguments", i - 1); 99458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 100458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh *argc = i; 101458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh *argv = args; 102e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh return control; 103c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh} 104c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 105a9a07aca7cd1e611f2d73582f20623cd62b917baChia-chi Yehconst char *android_hook(char **envp) 1061070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh{ 1071070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh struct ifreq ifr = {.ifr_flags = IFF_TUN}; 108dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh int tun = open("/dev/tun", 0); 1091070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh 110a9a07aca7cd1e611f2d73582f20623cd62b917baChia-chi Yeh /* Android does not support INTERNAL_WINS4_LIST, so we just use it. */ 111dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh while (*envp && strncmp(*envp, "INTERNAL_WINS4_LIST=", 20)) { 112dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh ++envp; 113dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh } 114dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh if (!*envp) { 115dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh do_plog(LLV_ERROR, "Cannot find environment variable\n"); 116dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh exit(1); 117dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh } 1181070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh if (ioctl(tun, TUNSETIFF, &ifr)) { 1191070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh do_plog(LLV_ERROR, "Cannot allocate TUN: %s\n", strerror(errno)); 1201070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh exit(1); 1211070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh } 122dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh sprintf(*envp, "INTERFACE=%s", ifr.ifr_name); 123a9a07aca7cd1e611f2d73582f20623cd62b917baChia-chi Yeh return "/etc/ppp/ip-up-vpn"; 1241070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh} 1251070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh 126458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#endif 127458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 128c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yehextern void setup(int argc, char **argv); 129f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 130c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehstatic int monitors; 131c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehstatic void (*callbacks[10])(int fd); 132f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yehstatic struct pollfd pollfds[10]; 133c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 134c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehchar *pname; 135c91307af2622f6625525f3c1f9c954376df950adChia-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 146c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid monitor_fd(int fd, void (*callback)(int)) 147c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh{ 148c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (fd < 0 || monitors == 10) { 149c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh do_plog(LLV_ERROR, "Cannot monitor fd"); 150c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh exit(1); 151c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 152c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh callbacks[monitors] = callback; 153c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh pollfds[monitors].fd = fd; 154c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh pollfds[monitors].events = callback ? POLLIN : 0; 155c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh ++monitors; 156c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh} 157c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 158837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehint main(int argc, char **argv) 159837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 160e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh#ifdef ANDROID_CHANGES 1614dd8f6be6496fc7cb7b7351c79f6a90be7be8991Chia-chi Yeh int control = android_get_control_and_arguments(&argc, &argv); 162c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root ENGINE *e; 163e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh if (control != -1) { 1648f3b38855d8849959825acc45dd11144adc7d862Chia-chi Yeh pname = "%p"; 165c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh monitor_fd(control, NULL); 166c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root 167c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root ENGINE_load_dynamic(); 168c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root e = ENGINE_by_id("keystore"); 169c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root if (!e || !ENGINE_init(e)) { 170c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root do_plog(LLV_ERROR, "ipsec-tools: cannot load keystore engine"); 171c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root exit(1); 172c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root } 173e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh } 174e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh#endif 175e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh 176c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh do_plog(LLV_INFO, "ipsec-tools 0.7.3 (http://ipsec-tools.sf.net)\n"); 177837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 1787197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh signal(SIGHUP, terminate); 1797197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh signal(SIGINT, terminate); 1807197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh signal(SIGTERM, terminate); 181837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh signal(SIGPIPE, SIG_IGN); 1829d271b685df5830e92a789119fe9b908da2f6c78Chia-chi Yeh atexit(terminated); 183837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 18412f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh setup(argc, argv); 18512f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh 18612f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh#ifdef ANDROID_CHANGES 1873724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh shutdown(control, SHUT_WR); 18812f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh setuid(AID_VPN); 18912f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh#endif 19012f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh 191837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh while (1) { 192f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh struct timeval *tv = schedular(); 193f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh int timeout = tv->tv_sec * 1000 + tv->tv_usec / 1000 + 1; 194f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 195c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (poll(pollfds, monitors, timeout) > 0) { 196f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh int i; 197c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh for (i = 0; i < monitors; ++i) { 198f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh if (pollfds[i].revents & POLLHUP) { 19966d08f4f81c446015c03113bd86d1ef5121bab36Chia-chi Yeh do_plog(LLV_INFO, "Connection is closed\n", pollfds[i].fd); 20066d08f4f81c446015c03113bd86d1ef5121bab36Chia-chi Yeh /* Wait for few seconds to consume late messages. */ 20166d08f4f81c446015c03113bd86d1ef5121bab36Chia-chi Yeh sleep(5); 202f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh exit(1); 203f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh } 204f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh if (pollfds[i].revents & POLLIN) { 205c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh callbacks[i](pollfds[i].fd); 206f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh } 207837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 208837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 209837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 210c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root#ifdef ANDROID_CHANGES 211c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root if (e) { 212c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root ENGINE_finish(e); 213c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root ENGINE_free(e); 214c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root } 215c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root#endif 216837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh return 0; 217837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 218837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 219837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh/* plog.h */ 220837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 221837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehvoid do_plog(int level, char *format, ...) 222837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 223458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if (level >= 0 && level <= 5) { 224458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#ifdef ANDROID_CHANGES 225458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh static int levels[6] = { 226458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh ANDROID_LOG_ERROR, ANDROID_LOG_WARN, ANDROID_LOG_INFO, 227458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh ANDROID_LOG_INFO, ANDROID_LOG_DEBUG, ANDROID_LOG_VERBOSE 228458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh }; 229458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_list ap; 230458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_start(ap, format); 231458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh __android_log_vprint(levels[level], "racoon", format, ap); 232458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_end(ap); 233458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#else 234458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh static char *levels = "EWNIDV"; 235458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh fprintf(stderr, "%c: ", levels[level]); 236458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_list ap; 237458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_start(ap, format); 238458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh vfprintf(stderr, format, ap); 239458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_end(ap); 240458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#endif 241458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 242837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 243837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 244837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehchar *binsanitize(char *data, size_t length) 245837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 246837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh char *output = racoon_malloc(length + 1); 247837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh if (output) { 248837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh size_t i; 249837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh for (i = 0; i < length; ++i) { 250c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh output[i] = (data[i] < ' ' || data[i] > '~') ? '?' : data[i]; 251837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 252837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh output[length] = '\0'; 253837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 254837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh return output; 255837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 256