main.c revision 3724e61c7fb7a792d36c4dbec826e06b1aabd039
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> 22f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 23837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "config.h" 24837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh#include "gcmalloc.h" 25f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh#include "session.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 311070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <string.h> 321070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <sys/types.h> 331070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <sys/socket.h> 341070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <sys/ioctl.h> 351070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <sys/stat.h> 361070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <fcntl.h> 371070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <errno.h> 381070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <linux/if.h> 391070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <linux/if_tun.h> 401070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh 411070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <android/log.h> 421070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <cutils/sockets.h> 431070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh#include <private/android_filesystem_config.h> 441070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh 454dd8f6be6496fc7cb7b7351c79f6a90be7be8991Chia-chi Yehstatic int android_get_control_and_arguments(int *argc, char ***argv) 46458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh{ 47c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh static char *args[32]; 48458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int control; 49458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int i; 50458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 51458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if ((i = android_get_control_socket("racoon")) == -1) { 52e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh return -1; 53458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 54458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_DEBUG, "Waiting for control socket"); 55458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if (listen(i, 1) == -1 || (control = accept(i, NULL, 0)) == -1) { 56458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_ERROR, "Cannot get control socket"); 57f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh exit(1); 58458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 59458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh close(i); 603724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh fcntl(control, F_SETFD, FD_CLOEXEC); 61458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 62458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh args[0] = (*argv)[0]; 63c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh for (i = 1; i < 32; ++i) { 64c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh unsigned char bytes[2]; 653724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh if (recv(control, &bytes[0], 1, 0) != 1 || 663724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh recv(control, &bytes[1], 1, 0) != 1) { 67458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_ERROR, "Cannot get argument length"); 68f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh exit(1); 69458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } else { 703724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh int length = bytes[0] << 8 | bytes[1]; 71458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int offset = 0; 72c9ac7d2fae3a233f928fd3f643ffa20b6ea602d3Chia-chi Yeh 733724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh if (length == 0xFFFF) { 743724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh break; 753724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh } 76458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh args[i] = malloc(length + 1); 77458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh while (offset < length) { 78458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh int n = recv(control, &args[i][offset], length - offset, 0); 79458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if (n > 0) { 80458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh offset += n; 81458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } else { 82458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_ERROR, "Cannot get argument value"); 83f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh exit(1); 84458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 85458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 86458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh args[i][length] = 0; 87458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 88458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 89458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh do_plog(LLV_DEBUG, "Received %d arguments", i - 1); 90458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 91458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh *argc = i; 92458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh *argv = args; 93e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh return control; 94c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh} 95c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 96a9a07aca7cd1e611f2d73582f20623cd62b917baChia-chi Yehconst char *android_hook(char **envp) 971070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh{ 981070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh struct ifreq ifr = {.ifr_flags = IFF_TUN}; 99dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh int tun = open("/dev/tun", 0); 1001070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh 101a9a07aca7cd1e611f2d73582f20623cd62b917baChia-chi Yeh /* Android does not support INTERNAL_WINS4_LIST, so we just use it. */ 102dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh while (*envp && strncmp(*envp, "INTERNAL_WINS4_LIST=", 20)) { 103dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh ++envp; 104dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh } 105dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh if (!*envp) { 106dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh do_plog(LLV_ERROR, "Cannot find environment variable\n"); 107dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh exit(1); 108dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh } 1091070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh if (ioctl(tun, TUNSETIFF, &ifr)) { 1101070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh do_plog(LLV_ERROR, "Cannot allocate TUN: %s\n", strerror(errno)); 1111070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh exit(1); 1121070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh } 113dc6f5b944434891dabd1aed297676349b58cb893Chia-chi Yeh sprintf(*envp, "INTERFACE=%s", ifr.ifr_name); 114a9a07aca7cd1e611f2d73582f20623cd62b917baChia-chi Yeh return "/etc/ppp/ip-up-vpn"; 1151070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh} 1161070097bb11002f8b5e289982cee9e324ea2f153Chia-chi Yeh 117458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#endif 118458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh 119c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yehextern void setup(int argc, char **argv); 120f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 1218f3b38855d8849959825acc45dd11144adc7d862Chia-chi Yehchar *pname; 1228f3b38855d8849959825acc45dd11144adc7d862Chia-chi Yeh 123f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yehstatic int monitor_count; 124f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yehstatic struct { 125f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh int (*callback)(void *ctx, int fd); 126f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh void *ctx; 127f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh} monitors[10]; 128f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yehstatic struct pollfd pollfds[10]; 129c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 130c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yehstatic void terminate(int signal) 131c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh{ 132c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh exit(1); 133c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh} 134c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 135c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yehstatic void terminated() 136c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh{ 137c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh do_plog(LLV_INFO, "Bye\n"); 138c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh} 139c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh 140837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehint main(int argc, char **argv) 141837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 142e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh#ifdef ANDROID_CHANGES 1434dd8f6be6496fc7cb7b7351c79f6a90be7be8991Chia-chi Yeh int control = android_get_control_and_arguments(&argc, &argv); 144e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh if (control != -1) { 1458f3b38855d8849959825acc45dd11144adc7d862Chia-chi Yeh pname = "%p"; 1463724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh monitor_fd(control, NULL, NULL, 0); 147e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh } 148e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh#endif 149e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh 150f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh do_plog(LLV_INFO, "ipsec-tools 0.8.0 (http://ipsec-tools.sf.net)\n"); 151837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 1527197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh signal(SIGHUP, terminate); 1537197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh signal(SIGINT, terminate); 1547197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh signal(SIGTERM, terminate); 155837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh signal(SIGPIPE, SIG_IGN); 1569d271b685df5830e92a789119fe9b908da2f6c78Chia-chi Yeh atexit(terminated); 157837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 15812f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh setup(argc, argv); 15912f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh 16012f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh#ifdef ANDROID_CHANGES 1613724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh shutdown(control, SHUT_WR); 16212f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh setuid(AID_VPN); 16312f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh#endif 16412f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh 165837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh while (1) { 166f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh struct timeval *tv = schedular(); 167f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh int timeout = tv->tv_sec * 1000 + tv->tv_usec / 1000 + 1; 168f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 169f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh if (poll(pollfds, monitor_count, timeout) > 0) { 170f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh int i; 171f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh for (i = 0; i < monitor_count; ++i) { 172f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh if (pollfds[i].revents & POLLHUP) { 1733724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh do_plog(LLV_ERROR, "Connection is closed\n", pollfds[i].fd); 174f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh exit(1); 175f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh } 176f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh if (pollfds[i].revents & POLLIN) { 177f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh monitors[i].callback(monitors[i].ctx, pollfds[i].fd); 178f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh } 179837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 180837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 181837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 182837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh return 0; 183837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 184837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 185f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh/* session.h */ 186f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 187f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yehvoid monitor_fd(int fd, int (*callback)(void *, int), void *ctx, int priority) 188f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh{ 189f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh if (fd < 0 || monitor_count == 10) { 190f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh do_plog(LLV_ERROR, "Cannot monitor fd"); 191f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh exit(1); 192f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh } 193f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh monitors[monitor_count].callback = callback; 194f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh monitors[monitor_count].ctx = ctx; 195f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh pollfds[monitor_count].fd = fd; 1963724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh pollfds[monitor_count].events = callback ? POLLIN : 0; 197f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh ++monitor_count; 198f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh} 199f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 200f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yehvoid unmonitor_fd(int fd) 201f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh{ 202f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh exit(1); 203f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh} 204f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 205837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh/* plog.h */ 206837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 207837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehvoid do_plog(int level, char *format, ...) 208837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 209458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh if (level >= 0 && level <= 5) { 210458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#ifdef ANDROID_CHANGES 211458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh static int levels[6] = { 212458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh ANDROID_LOG_ERROR, ANDROID_LOG_WARN, ANDROID_LOG_INFO, 213458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh ANDROID_LOG_INFO, ANDROID_LOG_DEBUG, ANDROID_LOG_VERBOSE 214458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh }; 215458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_list ap; 216458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_start(ap, format); 217458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh __android_log_vprint(levels[level], "racoon", format, ap); 218458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_end(ap); 219458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#else 220458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh static char *levels = "EWNIDV"; 221458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh fprintf(stderr, "%c: ", levels[level]); 222458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_list ap; 223458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_start(ap, format); 224458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh vfprintf(stderr, format, ap); 225458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh va_end(ap); 226458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#endif 227458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh } 228837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 229837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh 230837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehchar *binsanitize(char *data, size_t length) 231837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{ 232837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh char *output = racoon_malloc(length + 1); 233837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh if (output) { 234837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh size_t i; 235837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh for (i = 0; i < length; ++i) { 236c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh output[i] = (data[i] < ' ' || data[i] > '~') ? '?' : data[i]; 237837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 238837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh output[length] = '\0'; 239837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh } 240837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh return output; 241837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh} 242