From c5120a914a51220de18345fcb19e8cf725bfb407 Mon Sep 17 00:00:00 2001 From: Giuseppe Bilotta Date: Mon, 5 Sep 2011 19:08:27 +0200 Subject: [PATCH] Implement first draft of DNS-SD support in git-daemon --- Makefile | 11 +++++++++++ daemon.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/Makefile b/Makefile index 840057cba7..7608290fc3 100644 --- a/Makefile +++ b/Makefile @@ -164,6 +164,8 @@ all:: # Notably on Solaris hstrerror resides in libresolv and on Solaris 7 # inet_ntop and inet_pton additionally reside there. # +# Define NO_DNSSD if you lack DNS-SD support. +# # Define NO_MMAP if you want to avoid mmap. # # Define NO_SYS_POLL_H if you don't have sys/poll.h. @@ -405,6 +407,8 @@ XGETTEXT = xgettext MSGFMT = msgfmt PTHREAD_LIBS = -lpthread PTHREAD_CFLAGS = +DNSSD_LIBS = -ldns_sd +DNSSD_CFLAGS = GCOV = gcov export TCL_PATH TCLTK_PATH @@ -1450,6 +1454,13 @@ else LIB_OBJS += thread-utils.o endif +ifdef NO_DNSSD + BASIC_CFLAGS += -DNO_DNSSD +else + BASIC_CFLAGS += $(DNSSD_CFLAGS) + EXTLIBS += $(DNSSD_LIBS) +endif + ifdef HAVE_PATHS_H BASIC_CFLAGS += -DHAVE_PATHS_H endif diff --git a/daemon.c b/daemon.c index 1eb6631723..260cf43e04 100644 --- a/daemon.c +++ b/daemon.c @@ -5,6 +5,14 @@ #include "strbuf.h" #include "string-list.h" +#ifndef NO_DNSSD +#include +static DNSServiceRef sdRef; +#endif + +static void dnssd_register(struct string_list *listen_addr, int listen_port); +static void dnssd_unregister(void); + #ifndef HOST_NAME_MAX #define HOST_NAME_MAX 256 #endif @@ -103,6 +111,7 @@ static void loginfo(const char *err, ...) static void NORETURN daemon_die(const char *err, va_list params) { logreport(LOG_ERR, err, params); + dnssd_unregister(); exit(1); } @@ -1094,6 +1103,55 @@ static struct credentials *prepare_credentials(const char *user_name, } #endif +#ifndef NO_DNSSD +static void register_dnssd_addr(const char *listen_addr, int listen_port) +{ + /* We can use if_nametoindex() to turn an interface name + into an index, but how do we turn a listen_addr into + an interface name? */ + unsigned if_idx = 0; + DNSServiceErrorType err = DNSServiceRegister(&sdRef, + 0, /* Default flags */ + if_idx, + "git daemon", /* TODO customize */ + "_git._tcp", + NULL, /* domain */ + NULL, /* host */ + listen_port, + 0, NULL, /* TODO customize TXT */ + NULL, NULL); + if (err != kDNSServiceErr_NoError) + logerror("failed to register service on DNS-SD (%d)\n", err); + else + loginfo("registered git service for port %d on DNS-SD\n", + listen_port); +} + +static void dnssd_register(struct string_list *listen_addr, int listen_port) +{ + if (!listen_addr->nr) + register_dnssd_addr("", listen_port); + else { + int i; + for (i = 0; i < listen_addr->nr; ++i) { + register_dnssd_addr(listen_addr->items[i].string, + listen_port); + } + } +} + +static void dnssd_unregister(void) +{ + DNSServiceRefDeallocate(sdRef); + sdRef = NULL; +} +#else +static void dnssd_register(struct string_list *listen_addr, int listen_port) +{}; +static void dnssd_unregister(void) +{}; +#endif + static void store_pid(const char *path) { FILE *f = fopen(path, "w"); @@ -1115,6 +1173,8 @@ static int serve(struct string_list *listen_addr, int listen_port, drop_privileges(cred); + dnssd_register(listen_addr, listen_port); + loginfo("Ready to rumble"); return service_loop(&socklist); -- 2.32.0.93.g670b81a890