X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-dnsconfd%2Fmain.c;h=a76aa71e018e37692f7be0d80adf49d90bf1b71b;hb=4f0a5e7572a4257894b4bfede42c26d65152609e;hp=918beebb3816c15cefa19e5b5c45d62081ed1df3;hpb=9f9f4f6ea2405edc642d322c19f6f13e31920046;p=catta diff --git a/avahi-dnsconfd/main.c b/avahi-dnsconfd/main.c index 918beeb..a76aa71 100644 --- a/avahi-dnsconfd/main.c +++ b/avahi-dnsconfd/main.c @@ -39,8 +39,7 @@ #include -#include -#include +#include #include #include @@ -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: