]> git.meshlink.io Git - catta/blobdiff - avahi-dnsconfd/main.c
* strip glib from avahi-core
[catta] / avahi-dnsconfd / main.c
index 918beebb3816c15cefa19e5b5c45d62081ed1df3..a76aa71e018e37692f7be0d80adf49d90bf1b71b 100644 (file)
@@ -39,8 +39,7 @@
 
 #include <glib.h>
 
-#include <avahi-common/util.h>
-#include <avahi-core/llist.h>
+#include <avahi-common/llist.h>
 
 #include <libdaemon/dfork.h>
 #include <libdaemon/dsignal.h>
@@ -60,9 +59,10 @@ static gboolean quit = FALSE;
 static enum {
     DAEMON_RUN,
     DAEMON_KILL,
-    DAEMON_RELOAD,
+    DAEMON_REFRESH,
     DAEMON_VERSION,
-    DAEMON_HELP
+    DAEMON_HELP,
+    DAEMON_CHECK
 } command = DAEMON_RUN;
 
 static gboolean daemonize = FALSE;
@@ -115,6 +115,20 @@ static DNSServerInfo* new_server_info(gint interface, guchar protocol, const gch
     return i;
 }
 
+static int set_cloexec(int fd) {
+    int n;
+
+    assert(fd >= 0);
+    
+    if ((n = fcntl(fd, F_GETFD)) < 0)
+        return -1;
+
+    if (n & FD_CLOEXEC)
+        return 0;
+
+    return fcntl(fd, F_SETFD, n|FD_CLOEXEC);
+}
+
 static int open_socket(void) {
     int fd = -1;
     struct sockaddr_un sa;
@@ -124,7 +138,7 @@ static int open_socket(void) {
         goto fail;
     }
 
-    if (avahi_set_cloexec(fd) < 0) {
+    if (set_cloexec(fd) < 0) {
         daemon_log(LOG_ERR, "fcntl(): %s", strerror(errno));
         goto fail;
     }
@@ -163,7 +177,7 @@ static ssize_t loop_write(int fd, const void*data, size_t size) {
             break;
 
         ret += r;
-        data = (guint8*) data + r;
+        data = (const guint8*) data + r;
         size -= r;
     }
 
@@ -223,11 +237,12 @@ finish:
 
 static void run_script(gboolean new, gint interface, guchar protocol, const gchar *address) {
     gchar *p;
-    g_assert(interface > 0);
     gint ret;
     gchar ia[16], pa[16];
     gchar name[IFNAMSIZ+1];
 
+    g_assert(interface > 0);
+
     if (!getifname(interface, name, sizeof(name))) 
         return;
     
@@ -342,7 +357,8 @@ static void help(FILE *f, const gchar *argv0) {
             "    -h --help        Show this help\n"
             "    -D --daemonize   Daemonize after startup\n"
             "    -k --kill        Kill a running daemon\n"
-            "    -r --reload      Request a running daemon to reload static services\n"
+            "    -r --refresh     Request a running daemon to refresh DNS server data\n"
+            "    -c --check       Return 0 if a daemon is already running\n"
             "    -V --version     Show version\n",
             argv0);
 }
@@ -355,11 +371,12 @@ static gint parse_command_line(int argc, char *argv[]) {
         { "daemonize", no_argument,       NULL, 'D' },
         { "kill",      no_argument,       NULL, 'k' },
         { "version",   no_argument,       NULL, 'V' },
-        { "reload",    no_argument,       NULL, 'r' },
+        { "refresh",   no_argument,       NULL, 'r' },
+        { "check",     no_argument,       NULL, 'c' },
     };
 
     opterr = 0;
-    while ((c = getopt_long(argc, argv, "hDkVr", long_options, NULL)) >= 0) {
+    while ((c = getopt_long(argc, argv, "hDkVrc", long_options, NULL)) >= 0) {
 
         switch(c) {
             case 'h':
@@ -375,7 +392,10 @@ static gint parse_command_line(int argc, char *argv[]) {
                 command = DAEMON_VERSION;
                 break;
             case 'r':
-                command = DAEMON_RELOAD;
+                command = DAEMON_REFRESH;
+                break;
+            case 'c':
+                command = DAEMON_CHECK;
                 break;
             default:
                 fprintf(stderr, "Invalid command line argument: %c\n", c);
@@ -405,7 +425,9 @@ static int run_daemon(void) {
 
     if (daemonize)
         daemon_retval_send(0);
-    
+
+    ret = 0;
+
     while (!quit) {
         fd_set rfds, wfds;
 
@@ -448,7 +470,7 @@ static int run_daemon(void) {
                     break;
                     
                 case SIGHUP:
-                    daemon_log(LOG_INFO, "Rrefreshing DNS Server list");
+                    daemon_log(LOG_INFO, "Refreshing DNS Server list");
                     
                     close(fd);
                     free_dns_server_info_list();
@@ -492,8 +514,6 @@ static int run_daemon(void) {
             }
         }
     }
-
-    ret = 0;
     
 finish:
 
@@ -504,6 +524,9 @@ finish:
     
     daemon_signal_done();
 
+    if (ret != 0 && daemonize)
+        daemon_retval_send(1);
+    
     return ret;
 }
 
@@ -575,26 +598,33 @@ gint main(gint argc, gchar *argv[]) {
         if (run_daemon() < 0)
             goto finish;
 
+        r = 0;
     } else if (command == DAEMON_HELP) {
         help(stdout, argv0);
         
+        r = 0;
     } else if (command == DAEMON_VERSION) {
         printf("%s "PACKAGE_VERSION"\n", argv0);
         
+        r = 0;
     } else if (command == DAEMON_KILL) {
         if (daemon_pid_file_kill_wait(SIGTERM, 5) < 0) {
             daemon_log(LOG_WARNING, "Failed to kill daemon: %s", strerror(errno));
             goto finish;
         }
         
-    } else if (command == DAEMON_RELOAD) {
+        r = 0;
+    } else if (command == DAEMON_REFRESH) {
         if (daemon_pid_file_kill(SIGHUP) < 0) {
             daemon_log(LOG_WARNING, "Failed to kill daemon: %s", strerror(errno));
             goto finish;
         }
-    }
 
-    r = 0;
+        r = 0;
+    } else if (command == DAEMON_CHECK)
+        r = (daemon_pid_file_is_running() >= 0) ? 0 : 1;
+
+
     
 finish: