summaryrefslogtreecommitdiffstats
path: root/src/dnsmasq.c
diff options
context:
space:
mode:
authorSan Mehat <san@google.com>2010-01-20 10:54:48 -0800
committerSan Mehat <san@google.com>2010-01-20 10:55:28 -0800
commit33b344454b95ed99bad7d3fe4d493870923deaf6 (patch)
tree44dc7f7854a014e1db6dfa22d7684bdb8703e771 /src/dnsmasq.c
parent5658bcb797978c3472335d93554405aba8236f66 (diff)
downloadandroid_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-xsrc/dnsmasq.c55
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;