diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2013-03-04 00:44:51 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-03-04 00:44:51 +0000 |
commit | 89c05b9344eb0bdc52fc0d69bb3724bae7dbc90c (patch) | |
tree | 158928ba27aaec13a5ccea1a9abade7c219e51e2 /clatd.c | |
parent | 2edb7567d3d5373617c236801766e928c6a3dbcb (diff) | |
parent | baf62997b598ac38a99fd30419ccf7c109ffb3bc (diff) | |
download | android_external_android-clat-89c05b9344eb0bdc52fc0d69bb3724bae7dbc90c.tar.gz android_external_android-clat-89c05b9344eb0bdc52fc0d69bb3724bae7dbc90c.tar.bz2 android_external_android-clat-89c05b9344eb0bdc52fc0d69bb3724bae7dbc90c.zip |
Merge "Make clatd a bit more robust when started by netd." into jb-mr2-dev
Diffstat (limited to 'clatd.c')
-rw-r--r-- | clatd.c | 22 |
1 files changed, 14 insertions, 8 deletions
@@ -109,10 +109,10 @@ void set_accept_ra() { } } -/* function: got_sigterm - * signal handler: mark it time to clean up +/* function: stop_loop + * signal handler: stop the event loop */ -void got_sigterm(int signal) { +void stop_loop(int signal) { running = 0; } @@ -474,6 +474,7 @@ int main(int argc, char **argv) { printf("I need an interface\n"); exit(1); } + logmsg(ANDROID_LOG_INFO,"Starting clat on %s", uplink_interface); // open the tunnel device before dropping privs tunnel.fd6 = tun_open(); @@ -502,10 +503,9 @@ int main(int argc, char **argv) { // run under a regular user drop_root(); - if(signal(SIGTERM, got_sigterm) == SIG_ERR) { - logmsg(ANDROID_LOG_FATAL, "sigterm handler failed: %s", strerror(errno)); - exit(1); - } + // When run from netd, the environment variable ANDROID_DNS_MODE is set to + // "local", but that only works for the netd process itself. + unsetenv("ANDROID_DNS_MODE"); configure_interface(uplink_interface, plat_prefix, &tunnel); @@ -514,9 +514,15 @@ int main(int argc, char **argv) { set_default_ipv6_route(uplink_interface); set_forwarding(forwarding_fd,"1\n"); - event_loop(&tunnel); // event_loop returns if someone sets the tun interface down manually + // Loop until someone sends us a signal or brings down the tun interface. + if(signal(SIGTERM, stop_loop) == SIG_ERR) { + logmsg(ANDROID_LOG_FATAL, "sigterm handler failed: %s", strerror(errno)); + exit(1); + } + event_loop(&tunnel); set_forwarding(forwarding_fd,"0\n"); + logmsg(ANDROID_LOG_INFO,"Shutting down clat on %s", uplink_interface); return 0; } |