diff options
author | San Mehat <san@google.com> | 2010-01-20 10:54:48 -0800 |
---|---|---|
committer | San Mehat <san@google.com> | 2010-01-20 10:55:28 -0800 |
commit | 33b344454b95ed99bad7d3fe4d493870923deaf6 (patch) | |
tree | 44dc7f7854a014e1db6dfa22d7684bdb8703e771 /src/dnsmasq.c | |
parent | 5658bcb797978c3472335d93554405aba8236f66 (diff) | |
download | android_external_dnsmasq-33b344454b95ed99bad7d3fe4d493870923deaf6.tar.gz android_external_dnsmasq-33b344454b95ed99bad7d3fe4d493870923deaf6.tar.bz2 android_external_dnsmasq-33b344454b95ed99bad7d3fe4d493870923deaf6.zip |
dnsmasq: Allow runtime changing of DNS servers via STDIN
Signed-off-by: San Mehat <san@google.com>
Diffstat (limited to 'src/dnsmasq.c')
-rwxr-xr-x | src/dnsmasq.c | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/src/dnsmasq.c b/src/dnsmasq.c index 5d05f28..1a9d808 100755 --- a/src/dnsmasq.c +++ b/src/dnsmasq.c @@ -64,6 +64,10 @@ static void sig_handler(int sig); static void async_event(int pipe, time_t now); static void fatal_event(struct event_desc *ev); static void poll_resolv(void); +#ifdef __ANDROID__ +static int set_android_listeners(fd_set *set, int *maxfdp); +static int check_android_listeners(fd_set *set); +#endif int main (int argc, char **argv) { @@ -278,7 +282,9 @@ int main (int argc, char **argv) if (!(daemon->options & OPT_DEBUG)) { +#ifndef __ANDROID__ int nullfd; +#endif /* The following code "daemonizes" the process. See Stevens section 12.4 */ @@ -344,13 +350,15 @@ int main (int argc, char **argv) _exit(0); } } - + +#ifndef __ANDROID__ /* open stdout etc to /dev/null */ nullfd = open("/dev/null", O_RDWR); dup2(nullfd, STDOUT_FILENO); dup2(nullfd, STDERR_FILENO); dup2(nullfd, STDIN_FILENO); close(nullfd); +#endif } log_err = log_start(ent_pw, err_pipe[1]); @@ -577,6 +585,9 @@ int main (int argc, char **argv) t.tv_usec = 0; tp = &t; } +#ifdef __ANDROID__ + set_android_listeners(&rset, &maxfd); +#endif /* Whilst polling for the dbus, or doing a tftp transfer, wake every quarter second */ if (daemon->tftp_trans || @@ -668,6 +679,10 @@ int main (int argc, char **argv) } check_dbus_listeners(&rset, &wset, &eset); #endif + +#ifdef __ANDROID__ + check_android_listeners(&rset); +#endif check_dns_listeners(&rset, now); @@ -960,6 +975,44 @@ void clear_cache_and_reload(time_t now) #endif } +#ifdef __ANDROID__ + +static int set_android_listeners(fd_set *set, int *maxfdp) { + FD_SET(STDIN_FILENO, set); + bump_maxfd(STDIN_FILENO, maxfdp); + return 0; +} + +static int check_android_listeners(fd_set *set) { + if (FD_ISSET(STDIN_FILENO, set)) { + char buffer[1024]; + int rc; + + if ((rc = read(STDIN_FILENO, buffer, sizeof(buffer) -1)) < 0) { + my_syslog(LOG_ERR, _("Error reading from stdin (%s)"), strerror(errno)); + return -1; + } + buffer[rc] = '\0'; + char *next = buffer; + char *cmd; + + if (!(cmd = strsep(&next, ":"))) { + my_syslog(LOG_ERR, _("Malformatted msg '%s'"), buffer); + return -1; + } + + if (!strcmp(buffer, "update_dns")) { + set_servers(&buffer[11]); + check_servers(); + } else { + my_syslog(LOG_ERR, _("Unknown cmd '%s'"), cmd); + return -1; + } + } + return 0; +} +#endif + static int set_dns_listeners(time_t now, fd_set *set, int *maxfdp) { struct serverfd *serverfdp; |