diff options
Diffstat (limited to 'net/avahi/files/patch-avahi-daemon_main.c')
| -rw-r--r-- | net/avahi/files/patch-avahi-daemon_main.c | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/net/avahi/files/patch-avahi-daemon_main.c b/net/avahi/files/patch-avahi-daemon_main.c new file mode 100644 index 000000000000..682927374476 --- /dev/null +++ b/net/avahi/files/patch-avahi-daemon_main.c @@ -0,0 +1,168 @@ +--- avahi-daemon/main.c.orig Sat Apr 14 20:34:33 2007 ++++ avahi-daemon/main.c Fri Apr 20 20:06:05 2007 +@@ -42,11 +42,19 @@ + #include <sys/resource.h> + #include <sys/socket.h> + ++#ifdef HAVE_INOTIFY + #ifdef HAVE_SYS_INOTIFY_H + #include <sys/inotify.h> + #else + #include "inotify-nosys.h" + #endif ++#endif ++ ++#ifdef HAVE_KQUEUE ++#include <sys/types.h> ++#include <sys/event.h> ++#include <unistd.h> ++#endif + + #include <libdaemon/dfork.h> + #include <libdaemon/dsignal.h> +@@ -681,6 +689,53 @@ static void add_inotify_watches(void) { + + #endif + ++#ifdef HAVE_KQUEUE ++ ++#define NUM_WATCHES 2 ++ ++static int kq = -1; ++static int kfds[NUM_WATCHES]; ++static int num_kfds = 0; ++ ++static void add_kqueue_watch(const char *dir); ++ ++static void add_kqueue_watches(void) { ++ int c = 0; ++ ++#ifdef ENABLE_CHROOT ++ c = config.use_chrott; ++#endif ++ ++ add_kqueue_watch(c ? "/" : AVAHI_CONFIG_DIR); ++ add_kqueue_watch(c ? "/services" : AVAHI_SERVICE_DIR); ++} ++ ++static void add_kqueue_watch(const char *dir) { ++ int fd; ++ struct kevent ev; ++ ++ if (kq < 0) ++ return; ++ ++ if (num_kfds >= NUM_WATCHES) ++ return; ++ ++ fd = open(dir, O_RDONLY); ++ if (fd < 0) ++ return; ++ EV_SET(&ev, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, ++ NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_RENAME, ++ 0, 0); ++ if (kevent(kq, &ev, 1, NULL, 0, NULL) == -1) { ++ close(fd); ++ return; ++ } ++ ++ kfds[num_kfds++] = fd; ++} ++ ++#endif ++ + static void reload_config(void) { + + #ifdef HAVE_INOTIFY +@@ -688,6 +743,10 @@ static void reload_config(void) { + add_inotify_watches(); + #endif + ++#ifdef HAVE_KQUEUE ++ add_kqueue_watches(); ++#endif ++ + #ifdef ENABLE_CHROOT + static_service_load(config.use_chroot); + static_hosts_load(config.use_chroot); +@@ -736,6 +795,31 @@ static void inotify_callback(AvahiWatch + + #endif + ++#ifdef HAVE_KQUEUE ++ ++static void kqueue_callback(AvahiWatch *watch, int fd, AVAHI_GCC_UNUSED AvahiWatchEvent event, AVAHI_GCC_UNUSED void *userdata) { ++ struct kevent ev; ++ struct timespec nullts = { 0, 0 }; ++ int res; ++ ++ assert(fd == kq); ++ assert(watch); ++ ++ res = kevent(kq, NULL, 0, &ev, 1, &nullts); ++ ++ if (res > 0) { ++ /* Sleep for a half-second to avoid potential races ++ * during install/uninstall. */ ++ usleep(500000); ++ avahi_log_info("Files changed, reloading."); ++ reload_config(); ++ } else { ++ avahi_log_error("Failed to read kqueue event: %s", avahi_strerror(errno)); ++ } ++} ++ ++#endif ++ + static void signal_callback(AvahiWatch *watch, AVAHI_GCC_UNUSED int fd, AVAHI_GCC_UNUSED AvahiWatchEvent event, AVAHI_GCC_UNUSED void *userdata) { + int sig; + const AvahiPoll *poll_api; +@@ -791,6 +875,10 @@ static int run_server(DaemonConfig *c) { + #ifdef HAVE_INOTIFY + AvahiWatch *inotify_watch = NULL; + #endif ++#ifdef HAVE_KQUEUE ++ int i; ++ AvahiWatch *kqueue_watch = NULL; ++#endif + + assert(c); + +@@ -866,6 +954,19 @@ static int run_server(DaemonConfig *c) { + } + #endif + ++#ifdef HAVE_KQUEUE ++ if ((kq = kqueue()) < 0) ++ avahi_log_warn( "Failed to initialize kqueue: %s", strerror(errno)); ++ else { ++ add_kqueue_watches(); ++ ++ if (!(kqueue_watch = poll_api->watch_new(poll_api, kq, AVAHI_WATCH_IN, kqueue_callback, NULL))) { ++ avahi_log_error( "Failed to create kqueue watcher"); ++ goto finish; ++ } ++ } ++#endif ++ + load_resolv_conf(); + #ifdef ENABLE_CHROOT + static_service_load(config.use_chroot); +@@ -934,6 +1035,17 @@ finish: + poll_api->watch_free(inotify_watch); + if (inotify_fd >= 0) + close(inotify_fd); ++#endif ++ ++#ifdef HAVE_KQUEUE ++ if (kqueue_watch) ++ poll_api->watch_free(kqueue_watch); ++ if (kq >= 0) ++ close(kq); ++ for (i = 0; i < num_kfds; i++) { ++ if (kfds[i] >= 0) ++ close(kfds[i]); ++ } + #endif + + if (simple_poll_api) { |
