Ticket #149: avahi.diff
| File avahi.diff, 4.6 kB (added by marcus, 2 years ago) |
|---|
-
configure.ac
old new 384 384 AC_DEFINE([HAVE_INOTIFY], 1, [Enable Linux inotify() usage]) 385 385 fi 386 386 387 have_kqueue=no 388 AC_CHECK_FUNCS([kqueue],,have_kqueue=yes) 389 390 AM_CONDITIONAL(HAVE_KQUEUE, test "x$have_kqueue" = "xyes") 391 392 if test "x$have_kqueue" = "xyes" ; then 393 AC_DEFINE([HAVE_KQUEUE], 1, [Enable BSD kqueue() usage]) 394 fi 395 387 396 # Check for pkg-config manually first, as if its not installed the 388 397 # PKG_PROG_PKG_CONFIG macro won't be defined. 389 398 AC_CHECK_PROG(have_pkg_config, pkg-config, yes, no) -
avahi-daemon/main.c
old new 50 50 #endif 51 51 #endif 52 52 53 #ifdef HAVE_KQUEUE 54 #include <sys/types.h> 55 #include <sys/event.h> 56 #include <unistd.h> 57 #endif 58 53 59 #include <libdaemon/dfork.h> 54 60 #include <libdaemon/dsignal.h> 55 61 #include <libdaemon/dlog.h> … … 691 697 692 698 #endif 693 699 700 #ifdef HAVE_KQUEUE 701 702 #define NUM_WATCHES 2 703 704 static int kq = -1; 705 static int kfds[NUM_WATCHES]; 706 static int num_kfds = 0; 707 708 static void add_kqueue_watch(const char *dir); 709 710 static void add_kqueue_watches(void) { 711 int c = 0; 712 713 #ifdef ENABLE_CHROOT 714 c = config.use_chroot; 715 #endif 716 717 add_kqueue_watch(c ? "/" : AVAHI_CONFIG_DIR); 718 add_kqueue_watch(c ? "/services" : AVAHI_SERVICE_DIR); 719 } 720 721 static void add_kqueue_watch(const char *dir) { 722 int fd; 723 struct kevent ev; 724 725 if (kq < 0) 726 return; 727 728 if (num_kfds >= NUM_WATCHES) 729 return; 730 731 fd = open(dir, O_RDONLY); 732 if (fd < 0) 733 return; 734 EV_SET(&ev, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, 735 NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_RENAME, 736 0, 0); 737 if (kevent(kq, &ev, 1, NULL, 0, NULL) == -1) { 738 close(fd); 739 return; 740 } 741 742 kfds[num_kfds++] = fd; 743 } 744 745 #endif 746 694 747 static void reload_config(void) { 695 748 696 749 #ifdef HAVE_INOTIFY … … 698 751 add_inotify_watches(); 699 752 #endif 700 753 754 #ifdef HAVE_KQUEUE 755 add_kqueue_watches(); 756 #endif 757 701 758 #ifdef ENABLE_CHROOT 702 759 static_service_load(config.use_chroot); 703 760 static_hosts_load(config.use_chroot); … … 746 803 747 804 #endif 748 805 806 #ifdef HAVE_KQUEUE 807 808 static void kqueue_callback(AvahiWatch *watch, int fd, AVAHI_GCC_UNUSED AvahiWatchEvent event, AVAHI_GCC_UNUSED void *userdata) { 809 struct kevent ev; 810 struct timespec nullts = { 0, 0 }; 811 int res; 812 813 assert(fd == kq); 814 assert(watch); 815 816 res = kevent(kq, NULL, 0, &ev, 1, &nullts); 817 818 if (res > 0) { 819 /* Sleep for a half-second to avoid potential races 820 * during install/uninstall. */ 821 usleep(500000); 822 avahi_log_info("Files changed, reloading."); 823 reload_config(); 824 } else { 825 avahi_log_error("Failed to read kqueue event: %s", avahi_strerror(errno)); 826 } 827 } 828 829 #endif 830 749 831 static void signal_callback(AvahiWatch *watch, AVAHI_GCC_UNUSED int fd, AVAHI_GCC_UNUSED AvahiWatchEvent event, AVAHI_GCC_UNUSED void *userdata) { 750 832 int sig; 751 833 const AvahiPoll *poll_api; … … 801 883 #ifdef HAVE_INOTIFY 802 884 AvahiWatch *inotify_watch = NULL; 803 885 #endif 886 #ifdef HAVE_KQUEUE 887 int i; 888 AvahiWatch *kqueue_watch = NULL; 889 #endif 804 890 805 891 assert(c); 806 892 … … 876 962 } 877 963 #endif 878 964 965 #ifdef HAVE_KQUEUE 966 if ((kq = kqueue()) < 0) 967 avahi_log_warn( "Failed to initialize kqueue: %s", strerror(errno)); 968 else { 969 add_kqueue_watches(); 970 971 if (!(kqueue_watch = poll_api->watch_new(poll_api, kq, AVAHI_WATCH_IN, kqueue_callback, NULL))) { 972 avahi_log_error( "Failed to create kqueue watcher"); 973 goto finish; 974 } 975 } 976 #endif 977 879 978 load_resolv_conf(); 880 979 #ifdef ENABLE_CHROOT 881 980 static_service_load(config.use_chroot); … … 944 1043 poll_api->watch_free(inotify_watch); 945 1044 if (inotify_fd >= 0) 946 1045 close(inotify_fd); 1046 #endif 1047 1048 #ifdef HAVE_KQUEUE 1049 if (kqueue_watch) 1050 poll_api->watch_free(kqueue_watch); 1051 if (kq >= 0) 1052 close(kq); 1053 for (i = 0; i < num_kfds; i++) { 1054 if (kfds[i] >= 0) 1055 close(kfds[i]); 1056 } 947 1057 #endif 948 1058 949 1059 if (simple_poll_api) {
