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