X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-dnsconfd%2Fmain.c;h=719fbebc46ed725ad1552a65454fb3e69d5656e5;hb=7a5b2f69af7d36d6cd4153142f125fa011784e03;hp=dafa718b5cfecc410716a8f6217ed2104505faee;hpb=5be3898b65a4090f22de65751735138e6662f845;p=catta diff --git a/avahi-dnsconfd/main.c b/avahi-dnsconfd/main.c index dafa718..719fbeb 100644 --- a/avahi-dnsconfd/main.c +++ b/avahi-dnsconfd/main.c @@ -1,18 +1,16 @@ -/* $Id$ */ - /*** This file is part of avahi. - + avahi is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + avahi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with avahi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 @@ -72,6 +70,7 @@ static enum { static int quit = 0; static int daemonize = 0; +static int use_syslog = 0; #if !HAVE_DECL_ENVIRON extern char **environ; @@ -92,7 +91,7 @@ static void server_info_free(DNSServerInfo *i) { assert(i); avahi_free(i->address); - + AVAHI_LLIST_REMOVE(DNSServerInfo, servers, servers, i); avahi_free(i); } @@ -112,7 +111,7 @@ static DNSServerInfo* get_server_info(AvahiIfIndex interface, AvahiProtocol prot static DNSServerInfo* new_server_info(AvahiIfIndex interface, AvahiProtocol protocol, const char *address) { DNSServerInfo *i; - + assert(address); i = avahi_new(DNSServerInfo, 1); @@ -121,7 +120,7 @@ static DNSServerInfo* new_server_info(AvahiIfIndex interface, AvahiProtocol prot i->address = avahi_strdup(address); AVAHI_LLIST_PREPEND(DNSServerInfo, servers, servers, i); - + return i; } @@ -129,7 +128,7 @@ static int set_cloexec(int fd) { int n; assert(fd >= 0); - + if ((n = fcntl(fd, F_GETFD)) < 0) return -1; @@ -152,7 +151,7 @@ static int open_socket(void) { daemon_log(LOG_ERR, "fcntl(): %s", strerror(errno)); goto fail; } - + memset(&sa, 0, sizeof(sa)); sa.sun_family = AF_UNIX; strncpy(sa.sun_path, AVAHI_SOCKET, sizeof(sa.sun_path)-1); @@ -160,13 +159,13 @@ static int open_socket(void) { if (connect(fd, (struct sockaddr*) &sa, sizeof(sa)) < 0) { daemon_log(LOG_ERR, "connect(): %s", strerror(errno)); - daemon_log(LOG_INFO, "Failed to connect to the daemon. This probably means that you"); - daemon_log(LOG_INFO, "didn't start avahi-daemon before avahi-dnsconfd."); + daemon_log(LOG_INFO, "Failed to connect to the daemon. This probably means that you"); + daemon_log(LOG_INFO, "didn't start avahi-daemon before avahi-dnsconfd."); goto fail; } return fd; - + fail: if (fd >= 0) close(fd); @@ -199,7 +198,7 @@ static ssize_t loop_write(int fd, const void*data, size_t size) { static char *concat_dns_servers(AvahiIfIndex interface) { DNSServerInfo *i; char *r = NULL; - + for (i = servers; i; i = i->servers_next) if (i->interface == interface || interface <= 0) { DNSServerInfo *j; @@ -213,7 +212,7 @@ static char *concat_dns_servers(AvahiIfIndex interface) { if (j != i) continue; - + if (!r) t = avahi_strdup(i->address); else @@ -229,7 +228,7 @@ static char *concat_dns_servers(AvahiIfIndex interface) { static void set_env(const char *name, const char *value) { char **e; size_t l; - + assert(name); assert(value); @@ -239,7 +238,7 @@ static void set_env(const char *name, const char *value) { /* Search for the variable */ if (strlen(*e) < l+1) continue; - + if (strncmp(*e, name, l) != 0 || (*e)[l] != '=') continue; @@ -260,19 +259,19 @@ static void run_script(int new, AvahiIfIndex interface, AvahiProtocol protocol, assert(interface > 0); - if (!if_indextoname(interface, name)) + if (!if_indextoname(interface, name)) return; - + p = concat_dns_servers(interface); set_env(ENV_INTERFACE_DNS_SERVERS, p ? p : ""); - avahi_free(p); + avahi_free(p); p = concat_dns_servers(-1); set_env(ENV_DNS_SERVERS, p ? p : ""); - avahi_free(p); + avahi_free(p); set_env(ENV_INTERFACE, name); - + snprintf(ia, sizeof(ia), "%i", (int) interface); snprintf(pa, sizeof(pa), "%i", (int) protocol); @@ -298,8 +297,8 @@ static int new_line(const char *l) { AvahiProtocol protocol; int i_interface, i_protocol, port; char a[AVAHI_ADDRESS_STR_MAX]; - - assert(state == BROWSING); + + assert(state == BROWSING); if (*l != '<' && *l != '>') { daemon_log(LOG_ERR, "Avahi sent us an invalid browsing line: %s", l); @@ -325,7 +324,7 @@ static int new_line(const char *l) { } else { DNSServerInfo *i; - if (port == 53) + if (port == 53) if ((i = get_server_info(interface, protocol, a))) { daemon_log(LOG_INFO, "DNS Server %s removed (interface: %i.%s)", a, interface, avahi_proto_to_string(protocol)); server_info_free(i); @@ -334,13 +333,13 @@ static int new_line(const char *l) { } } - + return 0; } static int do_connect(void) { int fd = -1; - + if ((fd = open_socket()) < 0) goto fail; @@ -355,7 +354,7 @@ static int do_connect(void) { fail: if (fd >= 0) close(fd); - + return -1; } @@ -365,7 +364,7 @@ static void free_dns_server_info_list(void) { AvahiProtocol protocol = servers->protocol; char *address = avahi_strdup(servers->address); server_info_free(servers); - + run_script(0, interface, protocol, address); avahi_free(address); } @@ -376,6 +375,7 @@ static void help(FILE *f, const char *argv0) { "%s [options]\n" " -h --help Show this help\n" " -D --daemonize Daemonize after startup\n" + " -s --syslog Write log messages to syslog(3) instead of STDERR\n" " -k --kill Kill a running daemon\n" " -r --refresh Request a running daemon to refresh DNS server data\n" " -c --check Return 0 if a daemon is already running\n" @@ -385,18 +385,19 @@ static void help(FILE *f, const char *argv0) { static int parse_command_line(int argc, char *argv[]) { int c; - + static const struct option long_options[] = { { "help", no_argument, NULL, 'h' }, { "daemonize", no_argument, NULL, 'D' }, + { "syslog", no_argument, NULL, 's' }, { "kill", no_argument, NULL, 'k' }, { "version", no_argument, NULL, 'V' }, { "refresh", no_argument, NULL, 'r' }, { "check", no_argument, NULL, 'c' }, + { NULL, 0, NULL, 0 } }; - opterr = 0; - while ((c = getopt_long(argc, argv, "hDkVrc", long_options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hDkVrcs", long_options, NULL)) >= 0) { switch(c) { case 'h': @@ -405,6 +406,9 @@ static int parse_command_line(int argc, char *argv[]) { case 'D': daemonize = 1; break; + case 's': + use_syslog = 1; + break; case 'k': command = DAEMON_KILL; break; @@ -418,7 +422,6 @@ static int parse_command_line(int argc, char *argv[]) { command = DAEMON_CHECK; break; default: - fprintf(stderr, "Invalid command line argument: %c\n", c); return -1; } } @@ -427,7 +430,7 @@ static int parse_command_line(int argc, char *argv[]) { fprintf(stderr, "Too many arguments\n"); return -1; } - + return 0; } @@ -437,14 +440,14 @@ static int run_daemon(void) { size_t buflen = 0; AVAHI_LLIST_HEAD_INIT(DNSServerInfo, servers); - + daemon_signal_init(SIGINT, SIGTERM, SIGCHLD, SIGHUP, 0); /* Allocate some memory for our environment variables */ putenv(avahi_strdup(ENV_INTERFACE"=")); putenv(avahi_strdup(ENV_DNS_SERVERS"=")); putenv(avahi_strdup(ENV_INTERFACE_DNS_SERVERS"=")); - + if ((fd = do_connect()) < 0) goto finish; @@ -493,19 +496,19 @@ static int run_daemon(void) { case SIGCHLD: waitpid(-1, NULL, WNOHANG); break; - + case SIGHUP: daemon_log(LOG_INFO, "Refreshing DNS Server list"); - + close(fd); free_dns_server_info_list(); - + if ((fd = do_connect()) < 0) goto finish; - + break; } - + } else if (FD_ISSET(fd, &rfds)) { ssize_t r; char *n; @@ -531,27 +534,27 @@ static int run_daemon(void) { if (buflen >= sizeof(buf)-1) { /* The incoming line is horribly long */ buf[sizeof(buf)-1] = 0; - + if (new_line(buf) < 0) goto finish; - + buflen = 0; } } } - + finish: free_dns_server_info_list(); if (fd >= 0) close(fd); - + daemon_signal_done(); if (ret != 0 && daemonize) daemon_retval_send(1); - + return ret; } @@ -571,7 +574,7 @@ int main(int argc, char *argv[]) { daemon_pid_file_ident = daemon_log_ident = argv0; daemon_pid_file_proc = pid_file_proc; - + if (parse_command_line(argc, argv) < 0) goto finish; @@ -590,7 +593,7 @@ int main(int argc, char *argv[]) { if (daemonize) { daemon_retval_init(); - + if ((pid = daemon_fork()) < 0) goto finish; else if (pid != 0) { @@ -609,6 +612,9 @@ int main(int argc, char *argv[]) { /* Child */ } + if (use_syslog || daemonize) + daemon_log_use = DAEMON_LOG_SYSLOG; + chdir("/"); if (daemon_pid_file_create() < 0) { @@ -626,18 +632,18 @@ int main(int argc, char *argv[]) { 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; } - + r = 0; } else if (command == DAEMON_REFRESH) { if (daemon_pid_file_kill(SIGHUP) < 0) { @@ -654,7 +660,7 @@ finish: if (daemonize) daemon_retval_done(); - + if (wrote_pid_file) daemon_pid_file_remove();