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);
162a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley#if !defined(OPENSSL_IS_BORINGSSL)
163a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley    ENGINE *engine;
164a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley#endif
165a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley
166e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh    if (control != -1) {
1678f3b38855d8849959825acc45dd11144adc7d862Chia-chi Yeh        pname = "%p";
168c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh        monitor_fd(control, NULL);
169c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root
170a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley#if !defined(OPENSSL_IS_BORINGSSL)
171c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root        ENGINE_load_dynamic();
172a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley        engine = ENGINE_by_id("keystore");
173a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley        if (!engine || !ENGINE_init(engine)) {
174c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root            do_plog(LLV_ERROR, "ipsec-tools: cannot load keystore engine");
175c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root            exit(1);
176c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root        }
177a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley#endif
178e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh    }
179e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh#endif
180e9fc376dc7e9ee22358b872c3eb2808fa42160f0Chia-chi Yeh
181c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh    do_plog(LLV_INFO, "ipsec-tools 0.7.3 (http://ipsec-tools.sf.net)\n");
182837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh
1837197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh    signal(SIGHUP, terminate);
1847197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh    signal(SIGINT, terminate);
1857197eb77ef21feeedc5a47de31ded3a19c2af021Chia-chi Yeh    signal(SIGTERM, terminate);
186837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh    signal(SIGPIPE, SIG_IGN);
1879d271b685df5830e92a789119fe9b908da2f6c78Chia-chi Yeh    atexit(terminated);
188837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh
18912f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh    setup(argc, argv);
19012f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh
19112f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh#ifdef ANDROID_CHANGES
1923724e61c7fb7a792d36c4dbec826e06b1aabd039Chia-chi Yeh    shutdown(control, SHUT_WR);
19312f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh    setuid(AID_VPN);
19412f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh#endif
19512f449335c62c731f6eb33db7e27ce331f423f71Chia-chi Yeh
196837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh    while (1) {
197f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh        struct timeval *tv = schedular();
198f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh        int timeout = tv->tv_sec * 1000 + tv->tv_usec / 1000 + 1;
199f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh
200c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh        if (poll(pollfds, monitors, timeout) > 0) {
201f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh            int i;
202c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh            for (i = 0; i < monitors; ++i) {
203f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh                if (pollfds[i].revents & POLLHUP) {
20466d08f4f81c446015c03113bd86d1ef5121bab36Chia-chi Yeh                    do_plog(LLV_INFO, "Connection is closed\n", pollfds[i].fd);
20566d08f4f81c446015c03113bd86d1ef5121bab36Chia-chi Yeh                    /* Wait for few seconds to consume late messages. */
20666d08f4f81c446015c03113bd86d1ef5121bab36Chia-chi Yeh                    sleep(5);
207f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh                    exit(1);
208f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh                }
209f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh                if (pollfds[i].revents & POLLIN) {
210c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh                    callbacks[i](pollfds[i].fd);
211f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh                }
212837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh            }
213837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh        }
214837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh    }
215a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley
216a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley#if !defined(OPENSSL_IS_BORINGSSL)
217a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley    if (engine) {
218a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley        ENGINE_finish(engine);
219a029281fff6b28b379bd69602f8f5649f0a2740dAdam Langley        ENGINE_free(engine);
220c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root    }
221c1b51d45a7363d6fa58b59bf6f12182993a7c1d0Kenny Root#endif
222837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh    return 0;
223837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh}
224837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh
225837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh/* plog.h */
226837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh
227837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehvoid do_plog(int level, char *format, ...)
228837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{
229458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh    if (level >= 0 && level <= 5) {
230458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#ifdef ANDROID_CHANGES
231458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        static int levels[6] = {
232458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh            ANDROID_LOG_ERROR, ANDROID_LOG_WARN, ANDROID_LOG_INFO,
233458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh            ANDROID_LOG_INFO, ANDROID_LOG_DEBUG, ANDROID_LOG_VERBOSE
234458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        };
235458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        va_list ap;
236458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        va_start(ap, format);
237458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        __android_log_vprint(levels[level], "racoon", format, ap);
238458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        va_end(ap);
239458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#else
240458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        static char *levels = "EWNIDV";
241458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        fprintf(stderr, "%c: ", levels[level]);
242458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        va_list ap;
243458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        va_start(ap, format);
244458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        vfprintf(stderr, format, ap);
245458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh        va_end(ap);
246458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh#endif
247458fe1ef88671dfe580c488973d5573194839087Chia-chi Yeh    }
248837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh}
249837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh
250837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yehchar *binsanitize(char *data, size_t length)
251837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh{
252837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh    char *output = racoon_malloc(length + 1);
253837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh    if (output) {
254837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh        size_t i;
255837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh        for (i = 0; i < length; ++i) {
256c454954382b81262dc81ac54e147f4dc7fc0af75Chia-chi Yeh            output[i] = (data[i] < ' ' || data[i] > '~') ? '?' : data[i];
257837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh        }
258837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh        output[length] = '\0';
259837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh    }
260837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh    return output;
261837a1c77bab77bd62cccb33a15163a962f8dfb97Chia-chi Yeh}
262