{"thread":{"id":"21754","subject":"[PATCH/RFC 00/11] daemon-win32","startedAt":"2009-11-26T00:39:07Z","lastAt":"2009-11-26T00:43:04Z","messageCount":13,"participants":["Erik Faye-Lund"],"isPatch":true,"patchVersion":1,"patchTotal":11},"messages":[{"id":"128386","messageId":"1259195958-2372-1-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":null,"subject":"[PATCH/RFC 00/11] daemon-win32","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:07Z","receivedAt":"2009-11-26T00:39:07Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"This is my stab at cleaning up Mike Pape's patches for git-daemon\non Windows for submission, plus some of my own.\n\n* Patch 1-4 originate from Mike Pape, but have been cleaned up quite\n  a lot by me. I hope Mike won't hate me. Credit have been retained,\n  as all important code here were written by Mike. The commit\n  messages were written mostly by me.\n\n* Patch 5 is a trivial old-style function declaration fix.\n\n* Patch 6 introduces two new functions to the run-command API,\n  kill_async() and is_async_alive().\n\n* Patch 7-8 removes the stdin/stdout redirection for the service\n  functions, as redirecting won't work for the threaded version.\n\n* Patch 9 converts the daemon-code to use the run-command API. This\n  is the patch I expect to be the most controversial.\n\n* Patch 10 is about using line-buffered mode instead of full-buffered\n  mode for stderr.\n\n* Patch 11 finally enables compilation of git-daemon on MinGW.\n\nLet the flames begin!\n\nErik Faye-Lund (7):\n  inet_ntop: fix a couple of old-style decls\n  run-command: add kill_async() and is_async_alive()\n  run-command: support input-fd\n  daemon: use explicit file descriptor\n  daemon: use run-command api for async serving\n  daemon: use full buffered mode for stderr\n  mingw: compile git-daemon\n\nMike Pape (4):\n  mingw: add network-wrappers for daemon\n  strbuf: add non-variadic function strbuf_vaddf()\n  mingw: implement syslog\n  compat: add inet_pton and inet_ntop prototypes\n\n Makefile           |    8 ++-\n compat/inet_ntop.c |   22 ++------\n compat/inet_pton.c |    8 ++-\n compat/mingw.c     |  111 +++++++++++++++++++++++++++++++++++++++++--\n compat/mingw.h     |   32 ++++++++++++\n daemon.c           |  134 ++++++++++++++++++++++++++--------------------------\n git-compat-util.h  |    9 ++++\n run-command.c      |   32 ++++++++++++-\n run-command.h      |    2 +\n strbuf.c           |   15 ++++--\n strbuf.h           |    1 +\n 11 files changed, 274 insertions(+), 100 deletions(-)\n"},{"id":"128388","messageId":"1259195958-2372-2-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-1-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 01/11] mingw: add network-wrappers for daemon","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:08Z","receivedAt":"2009-11-26T00:39:08Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"From: Mike Pape <dotzenlabs@gmail.com>\n\ngit-daemon requires some socket-functionality that is not yet\nsupported in the Windows-port. This patch adds said functionality,\nand makes sure WSAStartup gets called by socket(), since it is the\nfirst network-call in git-daemon. In addition, a check is added to\nprevent WSAStartup (and WSACleanup, though atexit) from being\ncalled more than once, since git-daemon calls both socket() and\ngethostbyname().\n\nSigned-off-by: Mike Pape <dotzenlabs@gmail.com>\nSigned-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n compat/mingw.c |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++---\n compat/mingw.h |   16 ++++++++++++++\n 2 files changed, 72 insertions(+), 4 deletions(-)\n\ndiff --git a/compat/mingw.c b/compat/mingw.c\nindex 10d6796..458021b 100644\n--- a/compat/mingw.c\n+++ b/compat/mingw.c\n@@ -983,23 +983,37 @@ char **make_augmented_environ(const char *const *vars)\n \treturn env;\n }\n \n-/* this is the first function to call into WS_32; initialize it */\n-#undef gethostbyname\n-struct hostent *mingw_gethostbyname(const char *host)\n+static void wsa_init(void)\n {\n+\tstatic int initialized = 0;\n \tWSADATA wsa;\n \n+\tif (initialized)\n+\t\treturn;\n+\n \tif (WSAStartup(MAKEWORD(2,2), &wsa))\n \t\tdie(\"unable to initialize winsock subsystem, error %d\",\n \t\t\tWSAGetLastError());\n \tatexit((void(*)(void)) WSACleanup);\n+\tinitialized = 1;\n+}\n+\n+/* this can be the first function to call into WS_32; initialize it */\n+#undef gethostbyname\n+struct hostent *mingw_gethostbyname(const char *host)\n+{\n+\twsa_init();\n \treturn gethostbyname(host);\n }\n \n+/* this can be the first function to call into WS_32; initialize it */\n int mingw_socket(int domain, int type, int protocol)\n {\n+\tSOCKET s;\n \tint sockfd;\n-\tSOCKET s = WSASocket(domain, type, protocol, NULL, 0, 0);\n+\n+\twsa_init();\n+\ts = WSASocket(domain, type, protocol, NULL, 0, 0);\n \tif (s == INVALID_SOCKET) {\n \t\t/*\n \t\t * WSAGetLastError() values are regular BSD error codes\n@@ -1029,6 +1043,44 @@ int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz)\n \treturn connect(s, sa, sz);\n }\n \n+#undef bind\n+int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz)\n+{\n+\tSOCKET s = (SOCKET)_get_osfhandle(sockfd);\n+\treturn bind(s, sa, sz);\n+}\n+\n+#undef setsockopt\n+int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen)\n+{\n+\tSOCKET s = (SOCKET)_get_osfhandle(sockfd);\n+\treturn setsockopt(s, lvl, optname, (const char*)optval, optlen);\n+}\n+\n+#undef listen\n+int mingw_listen(int sockfd, int backlog)\n+{\n+\tSOCKET s = (SOCKET)_get_osfhandle(sockfd);\n+\treturn listen(s, backlog);\n+}\n+\n+#undef accept\n+int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz)\n+{\n+\tint sockfd2;\n+\n+\tSOCKET s1 = (SOCKET)_get_osfhandle(sockfd1);\n+\tSOCKET s2 = accept(s1, sa, sz);\n+\n+\t/* convert into a file descriptor */\n+\tif ((sockfd2 = _open_osfhandle(s2, O_RDWR|O_BINARY)) < 0) {\n+\t\tclosesocket(s2);\n+\t\treturn error(\"unable to make a socket file descriptor: %s\",\n+\t\t\tstrerror(errno));\n+\t}\n+\treturn sockfd2;\n+}\n+\n #undef rename\n int mingw_rename(const char *pold, const char *pnew)\n {\ndiff --git a/compat/mingw.h b/compat/mingw.h\nindex 1978f8a..f362f61 100644\n--- a/compat/mingw.h\n+++ b/compat/mingw.h\n@@ -5,6 +5,7 @@\n  */\n \n typedef int pid_t;\n+typedef int socklen_t;\n #define hstrerror strerror\n \n #define S_IFLNK    0120000 /* Symbolic link */\n@@ -33,6 +34,9 @@ typedef int pid_t;\n #define F_SETFD 2\n #define FD_CLOEXEC 0x1\n \n+#define EAFNOSUPPORT WSAEAFNOSUPPORT\n+#define ECONNABORTED WSAECONNABORTED\n+\n struct passwd {\n \tchar *pw_name;\n \tchar *pw_gecos;\n@@ -182,6 +186,18 @@ int mingw_socket(int domain, int type, int protocol);\n int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz);\n #define connect mingw_connect\n \n+int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz);\n+#define bind mingw_bind\n+\n+int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen);\n+#define setsockopt mingw_setsockopt\n+\n+int mingw_listen(int sockfd, int backlog);\n+#define listen mingw_listen\n+\n+int mingw_accept(int sockfd, struct sockaddr *sa, socklen_t *sz);\n+#define accept mingw_accept\n+\n int mingw_rename(const char*, const char*);\n #define rename mingw_rename\n \n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128387","messageId":"1259195958-2372-3-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-2-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 02/11] strbuf: add non-variadic function strbuf_vaddf()","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:09Z","receivedAt":"2009-11-26T00:39:09Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"From: Mike Pape <dotzenlabs@gmail.com>\n\nThis patch adds strbuf_vaddf, which takes a va_list as input\ninstead of the variadic input that strbuf_addf takes. This\nis useful for fowarding varargs to strbuf_addf.\n\nSigned-off-by: Mike Pape <dotzenlabs@gmail.com>\nSigned-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n strbuf.c |   15 +++++++++------\n strbuf.h |    1 +\n 2 files changed, 10 insertions(+), 6 deletions(-)\n\ndiff --git a/strbuf.c b/strbuf.c\nindex a6153dc..e1833fb 100644\n--- a/strbuf.c\n+++ b/strbuf.c\n@@ -190,23 +190,18 @@ void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len)\n \tstrbuf_setlen(sb, sb->len + len);\n }\n \n-void strbuf_addf(struct strbuf *sb, const char *fmt, ...)\n+void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap)\n {\n \tint len;\n-\tva_list ap;\n \n \tif (!strbuf_avail(sb))\n \t\tstrbuf_grow(sb, 64);\n-\tva_start(ap, fmt);\n \tlen = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);\n-\tva_end(ap);\n \tif (len < 0)\n \t\tdie(\"your vsnprintf is broken\");\n \tif (len > strbuf_avail(sb)) {\n \t\tstrbuf_grow(sb, len);\n-\t\tva_start(ap, fmt);\n \t\tlen = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);\n-\t\tva_end(ap);\n \t\tif (len > strbuf_avail(sb)) {\n \t\t\tdie(\"this should not happen, your snprintf is broken\");\n \t\t}\n@@ -214,6 +209,14 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)\n \tstrbuf_setlen(sb, sb->len + len);\n }\n \n+void strbuf_addf(struct strbuf *sb, const char *fmt, ...)\n+{\n+\tva_list va;\n+\tva_start(va, fmt);\n+\tstrbuf_vaddf(sb, fmt, va);\n+\tva_end(va);\n+}\n+\n void strbuf_expand(struct strbuf *sb, const char *format, expand_fn_t fn,\n \t\t   void *context)\n {\ndiff --git a/strbuf.h b/strbuf.h\nindex d05e056..8686bcb 100644\n--- a/strbuf.h\n+++ b/strbuf.h\n@@ -119,6 +119,7 @@ extern size_t strbuf_expand_dict_cb(struct strbuf *sb, const char *placeholder,\n \n __attribute__((format(printf,2,3)))\n extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...);\n+extern void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap);\n \n extern size_t strbuf_fread(struct strbuf *, size_t, FILE *);\n /* XXX: if read fails, any partial read is undone */\n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128389","messageId":"1259195958-2372-4-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-3-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 03/11] mingw: implement syslog","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:10Z","receivedAt":"2009-11-26T00:39:10Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"From: Mike Pape <dotzenlabs@gmail.com>\n\nSyslog does not usually exist on Windows, so we implement our own\nusing Window's ReportEvent mechanism.\n\nSigned-off-by: Mike Pape <dotzenlabs@gmail.com>\nSigned-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n compat/mingw.c    |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++\n compat/mingw.h    |   15 +++++++++++++++\n daemon.c          |    2 --\n git-compat-util.h |    1 +\n 4 files changed, 67 insertions(+), 2 deletions(-)\n\ndiff --git a/compat/mingw.c b/compat/mingw.c\nindex 458021b..68116ac 100644\n--- a/compat/mingw.c\n+++ b/compat/mingw.c\n@@ -1255,6 +1255,57 @@ int sigaction(int sig, struct sigaction *in, struct sigaction *out)\n \treturn 0;\n }\n \n+static HANDLE ms_eventlog;\n+\n+void openlog(const char *ident, int logopt, int facility) {\n+\tif (ms_eventlog)\n+\t\treturn;\n+\tms_eventlog = RegisterEventSourceA(NULL, ident);\n+}\n+\n+void syslog(int priority, const char *fmt, ...) {\n+\tstruct strbuf msg;\n+\tva_list va;\n+\tWORD logtype;\n+\n+\tstrbuf_init(&msg, 0);\n+\tva_start(va, fmt);\n+\tstrbuf_vaddf(&msg, fmt, va);\n+\tva_end(va);\n+\n+\tswitch (priority) {\n+\t\tcase LOG_EMERG:\n+\t\tcase LOG_ALERT:\n+\t\tcase LOG_CRIT:\n+\t\tcase LOG_ERR:\n+\t\t\tlogtype = EVENTLOG_ERROR_TYPE;\n+\t\t\tbreak;\n+\n+\t\tcase LOG_WARNING:\n+\t\t\tlogtype = EVENTLOG_WARNING_TYPE;\n+\t\t\tbreak;\n+\n+\t\tcase LOG_NOTICE:\n+\t\tcase LOG_INFO:\n+\t\tcase LOG_DEBUG:\n+\t\tdefault:\n+\t\t\tlogtype = EVENTLOG_INFORMATION_TYPE;\n+\t\t\tbreak;\n+\t}\n+\n+\tReportEventA(ms_eventlog,\n+\t    logtype,\n+\t    (WORD)NULL,\n+\t    (DWORD)NULL,\n+\t    NULL,\n+\t    1,\n+\t    0,\n+\t    (const char **)&msg.buf,\n+\t    NULL);\n+\n+\tstrbuf_release(&msg);\n+}\n+\n #undef signal\n sig_handler_t mingw_signal(int sig, sig_handler_t handler)\n {\ndiff --git a/compat/mingw.h b/compat/mingw.h\nindex f362f61..576b1a1 100644\n--- a/compat/mingw.h\n+++ b/compat/mingw.h\n@@ -37,6 +37,19 @@ typedef int socklen_t;\n #define EAFNOSUPPORT WSAEAFNOSUPPORT\n #define ECONNABORTED WSAECONNABORTED\n \n+#define LOG_PID     0x01\n+\n+#define LOG_EMERG   0\n+#define LOG_ALERT   1\n+#define LOG_CRIT    2\n+#define LOG_ERR     3\n+#define LOG_WARNING 4\n+#define LOG_NOTICE  5\n+#define LOG_INFO    6\n+#define LOG_DEBUG   7\n+\n+#define LOG_DAEMON  (3<<3)\n+\n struct passwd {\n \tchar *pw_name;\n \tchar *pw_gecos;\n@@ -157,6 +170,8 @@ int sigaction(int sig, struct sigaction *in, struct sigaction *out);\n int link(const char *oldpath, const char *newpath);\n int symlink(const char *oldpath, const char *newpath);\n int readlink(const char *path, char *buf, size_t bufsiz);\n+void openlog(const char *ident, int logopt, int facility);\n+void syslog(int priority, const char *fmt, ...);\n \n /*\n  * replacements of existing functions\ndiff --git a/daemon.c b/daemon.c\nindex 1b5ada6..07d7356 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -4,8 +4,6 @@\n #include \"run-command.h\"\n #include \"strbuf.h\"\n \n-#include <syslog.h>\n-\n #ifndef HOST_NAME_MAX\n #define HOST_NAME_MAX 256\n #endif\ndiff --git a/git-compat-util.h b/git-compat-util.h\nindex ef60803..33a8e33 100644\n--- a/git-compat-util.h\n+++ b/git-compat-util.h\n@@ -105,6 +105,7 @@\n #include <netdb.h>\n #include <pwd.h>\n #include <inttypes.h>\n+#include <syslog.h>\n #if defined(__CYGWIN__)\n #undef _XOPEN_SOURCE\n #include <grp.h>\n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128390","messageId":"1259195958-2372-5-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-4-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 04/11] compat: add inet_pton and inet_ntop prototypes","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:11Z","receivedAt":"2009-11-26T00:39:11Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"From: Mike Pape <dotzenlabs@gmail.com>\n\nWindows doesn't have inet_pton and inet_ntop, so\nadd prototypes in git-compat-util.h for them.\n\nAt the same time include git-compat-util.h in\nthe sources for these functions, so they use the\nnetwork-wrappers from there on Windows.\n\nSigned-off-by: Mike Pape <dotzenlabs@gmail.com>\nSigned-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n Makefile           |    2 ++\n compat/inet_ntop.c |    6 +++---\n compat/inet_pton.c |    8 +++++---\n git-compat-util.h  |    8 ++++++++\n 4 files changed, 18 insertions(+), 6 deletions(-)\n\ndiff --git a/Makefile b/Makefile\nindex 70cee6d..3b01694 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -1227,9 +1227,11 @@ endif\n endif\n ifdef NO_INET_NTOP\n \tLIB_OBJS += compat/inet_ntop.o\n+\tBASIC_CFLAGS += -DNO_INET_NTOP\n endif\n ifdef NO_INET_PTON\n \tLIB_OBJS += compat/inet_pton.o\n+\tBASIC_CFLAGS += -DNO_INET_PTON\n endif\n \n ifdef NO_ICONV\ndiff --git a/compat/inet_ntop.c b/compat/inet_ntop.c\nindex f444982..e5b46a0 100644\n--- a/compat/inet_ntop.c\n+++ b/compat/inet_ntop.c\n@@ -17,9 +17,9 @@\n \n #include <errno.h>\n #include <sys/types.h>\n-#include <sys/socket.h>\n-#include <netinet/in.h>\n-#include <arpa/inet.h>\n+\n+#include \"../git-compat-util.h\"\n+\n #include <stdio.h>\n #include <string.h>\n \ndiff --git a/compat/inet_pton.c b/compat/inet_pton.c\nindex 4078fc0..2ec995e 100644\n--- a/compat/inet_pton.c\n+++ b/compat/inet_pton.c\n@@ -17,9 +17,9 @@\n \n #include <errno.h>\n #include <sys/types.h>\n-#include <sys/socket.h>\n-#include <netinet/in.h>\n-#include <arpa/inet.h>\n+\n+#include \"../git-compat-util.h\"\n+\n #include <stdio.h>\n #include <string.h>\n \n@@ -41,7 +41,9 @@\n  */\n \n static int inet_pton4(const char *src, unsigned char *dst);\n+#ifndef NO_IPV6\n static int inet_pton6(const char *src, unsigned char *dst);\n+#endif\n \n /* int\n  * inet_pton4(src, dst)\ndiff --git a/git-compat-util.h b/git-compat-util.h\nindex 33a8e33..27fa601 100644\n--- a/git-compat-util.h\n+++ b/git-compat-util.h\n@@ -340,6 +340,14 @@ static inline char *gitstrchrnul(const char *s, int c)\n }\n #endif\n \n+#ifdef NO_INET_PTON\n+int inet_pton(int af, const char *src, void *dst);\n+#endif\n+\n+#ifdef NO_INET_NTOP\n+const char *inet_ntop(int af, const void *src, char *dst, size_t size);\n+#endif\n+\n extern void release_pack_memory(size_t, int);\n \n extern char *xstrdup(const char *str);\n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128391","messageId":"1259195958-2372-6-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-5-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 05/11] inet_ntop: fix a couple of old-style decls","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:12Z","receivedAt":"2009-11-26T00:39:12Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n compat/inet_ntop.c |   16 +++-------------\n 1 files changed, 3 insertions(+), 13 deletions(-)\n\ndiff --git a/compat/inet_ntop.c b/compat/inet_ntop.c\nindex e5b46a0..ea249c6 100644\n--- a/compat/inet_ntop.c\n+++ b/compat/inet_ntop.c\n@@ -50,10 +50,7 @@\n  *\tPaul Vixie, 1996.\n  */\n static const char *\n-inet_ntop4(src, dst, size)\n-\tconst u_char *src;\n-\tchar *dst;\n-\tsize_t size;\n+inet_ntop4(const u_char *src, char *dst, size_t size)\n {\n \tstatic const char fmt[] = \"%u.%u.%u.%u\";\n \tchar tmp[sizeof \"255.255.255.255\"];\n@@ -78,10 +75,7 @@ inet_ntop4(src, dst, size)\n  *\tPaul Vixie, 1996.\n  */\n static const char *\n-inet_ntop6(src, dst, size)\n-\tconst u_char *src;\n-\tchar *dst;\n-\tsize_t size;\n+inet_ntop6(const u_char *src, char *dst, size_t size)\n {\n \t/*\n \t * Note that int32_t and int16_t need only be \"at least\" large enough\n@@ -178,11 +172,7 @@ inet_ntop6(src, dst, size)\n  *\tPaul Vixie, 1996.\n  */\n const char *\n-inet_ntop(af, src, dst, size)\n-\tint af;\n-\tconst void *src;\n-\tchar *dst;\n-\tsize_t size;\n+inet_ntop(int af, const void *src, char *dst, size_t size)\n {\n \tswitch (af) {\n \tcase AF_INET:\n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128392","messageId":"1259195958-2372-7-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-6-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 06/11] run-command: add kill_async() and is_async_alive()","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:13Z","receivedAt":"2009-11-26T00:39:13Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"These functions will aid the Windows port of git-daemon.\n\nSigned-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n run-command.c |   27 +++++++++++++++++++++++++++\n run-command.h |    2 ++\n 2 files changed, 29 insertions(+), 0 deletions(-)\n\ndiff --git a/run-command.c b/run-command.c\nindex cf2d8f7..e5a0e06 100644\n--- a/run-command.c\n+++ b/run-command.c\n@@ -373,6 +373,33 @@ int finish_async(struct async *async)\n \treturn ret;\n }\n \n+int kill_async(struct async *async)\n+{\n+#ifndef WIN32\n+\treturn kill(async->pid, SIGTERM);\n+#else\n+\tDWORD ret = 0;\n+\tif (!TerminateThread(async->tid, 0))\n+\t\tret = error(\"killing thread failed: %lu\", GetLastError());\n+\telse if (!GetExitCodeThread(async->tid, &ret))\n+\t\tret = error(\"cannot get thread exit code: %lu\", GetLastError());\n+\treturn ret;\n+#endif\n+}\n+\n+int is_async_alive(struct async *async)\n+{\n+#ifndef WIN32\n+\tint dummy;\n+\treturn waitpid(async->pid, &dummy, WNOHANG);\n+#else\n+\tint ret = WaitForSingleObject(async->tid, 0);\n+\tif (ret == WAIT_FAILED)\n+\t\treturn error(\"checking thread state failed: %lu\", GetLastError());\n+\treturn ret != WAIT_OBJECT_0;\n+#endif\n+}\n+\n int run_hook(const char *index_file, const char *name, ...)\n {\n \tstruct child_process hook;\ndiff --git a/run-command.h b/run-command.h\nindex fb34209..955b0bd 100644\n--- a/run-command.h\n+++ b/run-command.h\n@@ -80,5 +80,7 @@ struct async {\n \n int start_async(struct async *async);\n int finish_async(struct async *async);\n+int kill_async(struct async *async);\n+int is_async_alive(struct async *async);\n \n #endif\n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128394","messageId":"1259195958-2372-8-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-7-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 07/11] run-command: support input-fd","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:14Z","receivedAt":"2009-11-26T00:39:14Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"This patch adds the possibility to supply a non-0\nfile descriptor for communucation, instead of the\ndefault-created pipe. The pipe gets duplicated, so\nthe caller can free it's handles.\n\nThis is usefull for async communication over sockets.\n\nSigned-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n run-command.c |    5 ++++-\n 1 files changed, 4 insertions(+), 1 deletions(-)\n\ndiff --git a/run-command.c b/run-command.c\nindex e5a0e06..98771ef 100644\n--- a/run-command.c\n+++ b/run-command.c\n@@ -327,7 +327,10 @@ int start_async(struct async *async)\n {\n \tint pipe_out[2];\n \n-\tif (pipe(pipe_out) < 0)\n+\tif (async->out) {\n+\t\tpipe_out[0] = dup(async->out);\n+\t\tpipe_out[1] = dup(async->out);\n+\t} else if (pipe(pipe_out) < 0)\n \t\treturn error(\"cannot create pipe: %s\", strerror(errno));\n \tasync->out = pipe_out[0];\n \n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128393","messageId":"1259195958-2372-9-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-8-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 08/11] daemon: use explicit file descriptor","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:15Z","receivedAt":"2009-11-26T00:39:15Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"This patch adds support to specify an explicit file\ndescriotor for communication with the client, instead\nof using stdin/stdout.\n\nThis will be useful for the Windows port, because it\nwill use threads instead of fork() to serve multiple\nclients, making it impossible to reuse stdin/stdout.\n\nSigned-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n daemon.c |   34 ++++++++++++++++------------------\n 1 files changed, 16 insertions(+), 18 deletions(-)\n\ndiff --git a/daemon.c b/daemon.c\nindex 07d7356..a0aead5 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -263,7 +263,7 @@ static char *path_ok(char *directory)\n \treturn NULL;\t\t/* Fallthrough. Deny by default */\n }\n \n-typedef int (*daemon_service_fn)(void);\n+typedef int (*daemon_service_fn)(int);\n struct daemon_service {\n \tconst char *name;\n \tconst char *config_name;\n@@ -287,7 +287,7 @@ static int git_daemon_config(const char *var, const char *value, void *cb)\n \treturn 0;\n }\n \n-static int run_service(char *dir, struct daemon_service *service)\n+static int run_service(int fd, char *dir, struct daemon_service *service)\n {\n \tconst char *path;\n \tint enabled = service->enabled;\n@@ -340,7 +340,7 @@ static int run_service(char *dir, struct daemon_service *service)\n \t */\n \tsignal(SIGTERM, SIG_IGN);\n \n-\treturn service->fn();\n+\treturn service->fn(fd);\n }\n \n static void copy_to_log(int fd)\n@@ -364,7 +364,7 @@ static void copy_to_log(int fd)\n \tfclose(fp);\n }\n \n-static int run_service_command(const char **argv)\n+static int run_service_command(int fd, const char **argv)\n {\n \tstruct child_process cld;\n \n@@ -372,37 +372,35 @@ static int run_service_command(const char **argv)\n \tcld.argv = argv;\n \tcld.git_cmd = 1;\n \tcld.err = -1;\n+\tcld.in = cld.out = fd;\n \tif (start_command(&cld))\n \t\treturn -1;\n \n-\tclose(0);\n-\tclose(1);\n-\n \tcopy_to_log(cld.err);\n \n \treturn finish_command(&cld);\n }\n \n-static int upload_pack(void)\n+static int upload_pack(int fd)\n {\n \t/* Timeout as string */\n \tchar timeout_buf[64];\n \tconst char *argv[] = { \"upload-pack\", \"--strict\", timeout_buf, \".\", NULL };\n \n \tsnprintf(timeout_buf, sizeof timeout_buf, \"--timeout=%u\", timeout);\n-\treturn run_service_command(argv);\n+\treturn run_service_command(fd, argv);\n }\n \n-static int upload_archive(void)\n+static int upload_archive(int fd)\n {\n \tstatic const char *argv[] = { \"upload-archive\", \".\", NULL };\n-\treturn run_service_command(argv);\n+\treturn run_service_command(fd, argv);\n }\n \n-static int receive_pack(void)\n+static int receive_pack(int fd)\n {\n \tstatic const char *argv[] = { \"receive-pack\", \".\", NULL };\n-\treturn run_service_command(argv);\n+\treturn run_service_command(fd, argv);\n }\n \n static struct daemon_service daemon_service[] = {\n@@ -532,7 +530,7 @@ static void parse_host_arg(char *extra_args, int buflen)\n }\n \n \n-static int execute(struct sockaddr *addr)\n+static int execute(int fd, struct sockaddr *addr)\n {\n \tstatic char line[1000];\n \tint pktlen, len, i;\n@@ -565,7 +563,7 @@ static int execute(struct sockaddr *addr)\n \t}\n \n \talarm(init_timeout ? init_timeout : timeout);\n-\tpktlen = packet_read_line(0, line, sizeof(line));\n+\tpktlen = packet_read_line(fd, line, sizeof(line));\n \talarm(0);\n \n \tlen = strlen(line);\n@@ -597,7 +595,7 @@ static int execute(struct sockaddr *addr)\n \t\t\t * Note: The directory here is probably context sensitive,\n \t\t\t * and might depend on the actual service being performed.\n \t\t\t */\n-\t\t\treturn run_service(line + namelen + 5, s);\n+\t\t\treturn run_service(fd, line + namelen + 5, s);\n \t\t}\n \t}\n \n@@ -713,7 +711,7 @@ static void handle(int incoming, struct sockaddr *addr, int addrlen)\n \tdup2(incoming, 1);\n \tclose(incoming);\n \n-\texit(execute(addr));\n+\texit(execute(0, addr));\n }\n \n static void child_handler(int signo)\n@@ -1150,7 +1148,7 @@ int main(int argc, char **argv)\n \t\tif (getpeername(0, peer, &slen))\n \t\t\tpeer = NULL;\n \n-\t\treturn execute(peer);\n+\t\treturn execute(0, peer);\n \t}\n \n \tif (detach) {\n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128395","messageId":"1259195958-2372-10-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-9-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 09/11] daemon: use run-command api for async serving","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:16Z","receivedAt":"2009-11-26T00:39:16Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"fork() is only available on POSIX, so to support git-daemon\non Windows we have to use something else. Conveniently\nenough, we have an API for async operation already.\n\nSigned-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n daemon.c |   79 ++++++++++++++++++++++++++++---------------------------------\n 1 files changed, 36 insertions(+), 43 deletions(-)\n\ndiff --git a/daemon.c b/daemon.c\nindex a0aead5..1b0e290 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -372,7 +372,8 @@ static int run_service_command(int fd, const char **argv)\n \tcld.argv = argv;\n \tcld.git_cmd = 1;\n \tcld.err = -1;\n-\tcld.in = cld.out = fd;\n+\tcld.in = dup(fd);\n+\tcld.out = fd;\n \tif (start_command(&cld))\n \t\treturn -1;\n \n@@ -609,11 +610,11 @@ static unsigned int live_children;\n \n static struct child {\n \tstruct child *next;\n-\tpid_t pid;\n+\tstruct async async;\n \tstruct sockaddr_storage address;\n } *firstborn;\n \n-static void add_child(pid_t pid, struct sockaddr *addr, int addrlen)\n+static void add_child(struct async *async, struct sockaddr *addr, int addrlen)\n {\n \tstruct child *newborn, **cradle;\n \n@@ -623,7 +624,7 @@ static void add_child(pid_t pid, struct sockaddr *addr, int addrlen)\n \t */\n \tnewborn = xcalloc(1, sizeof(*newborn));\n \tlive_children++;\n-\tnewborn->pid = pid;\n+\tmemcpy(&newborn->async, async, sizeof(struct async));\n \tmemcpy(&newborn->address, addr, addrlen);\n \tfor (cradle = &firstborn; *cradle; cradle = &(*cradle)->next)\n \t\tif (!memcmp(&(*cradle)->address, &newborn->address,\n@@ -633,19 +634,6 @@ static void add_child(pid_t pid, struct sockaddr *addr, int addrlen)\n \t*cradle = newborn;\n }\n \n-static void remove_child(pid_t pid)\n-{\n-\tstruct child **cradle, *blanket;\n-\n-\tfor (cradle = &firstborn; (blanket = *cradle); cradle = &blanket->next)\n-\t\tif (blanket->pid == pid) {\n-\t\t\t*cradle = blanket->next;\n-\t\t\tlive_children--;\n-\t\t\tfree(blanket);\n-\t\t\tbreak;\n-\t\t}\n-}\n-\n /*\n  * This gets called if the number of connections grows\n  * past \"max_connections\".\n@@ -654,7 +642,7 @@ static void remove_child(pid_t pid)\n  */\n static void kill_some_child(void)\n {\n-\tconst struct child *blanket, *next;\n+\tstruct child *blanket, *next;\n \n \tif (!(blanket = firstborn))\n \t\treturn;\n@@ -662,28 +650,37 @@ static void kill_some_child(void)\n \tfor (; (next = blanket->next); blanket = next)\n \t\tif (!memcmp(&blanket->address, &next->address,\n \t\t\t    sizeof(next->address))) {\n-\t\t\tkill(blanket->pid, SIGTERM);\n+\t\t\tkill_async(&blanket->async);\n \t\t\tbreak;\n \t\t}\n }\n \n static void check_dead_children(void)\n {\n-\tint status;\n-\tpid_t pid;\n-\n-\twhile ((pid = waitpid(-1, &status, WNOHANG)) > 0) {\n-\t\tconst char *dead = \"\";\n-\t\tremove_child(pid);\n-\t\tif (!WIFEXITED(status) || (WEXITSTATUS(status) > 0))\n-\t\t\tdead = \" (with error)\";\n-\t\tloginfo(\"[%\"PRIuMAX\"] Disconnected%s\", (uintmax_t)pid, dead);\n-\t}\n+\tstruct child **cradle, *blanket;\n+\tfor (cradle = &firstborn; (blanket = *cradle);)\n+\t\tif (!is_async_alive(&blanket->async)) {\n+\t\t\t*cradle = blanket->next;\n+\t\t\tloginfo(\"Disconnected\\n\");\n+\t\t\tlive_children--;\n+\t\t\tclose(blanket->async.out);\n+\t\t\tfree(blanket);\n+\t\t} else\n+\t\t\tcradle = &blanket->next;\n+}\n+\n+int async_execute(int fd, void *data)\n+{\n+\tint ret = execute(fd, data);\n+\tclose(fd);\n+\tfree(data);\n+\treturn ret;\n }\n \n static void handle(int incoming, struct sockaddr *addr, int addrlen)\n {\n-\tpid_t pid;\n+\tstruct sockaddr_storage *ss;\n+\tstruct async async = { 0 };\n \n \tif (max_connections && live_children >= max_connections) {\n \t\tkill_some_child();\n@@ -696,22 +693,18 @@ static void handle(int incoming, struct sockaddr *addr, int addrlen)\n \t\t}\n \t}\n \n-\tif ((pid = fork())) {\n-\t\tclose(incoming);\n-\t\tif (pid < 0) {\n-\t\t\tlogerror(\"Couldn't fork %s\", strerror(errno));\n-\t\t\treturn;\n-\t\t}\n+\tss = xmalloc(sizeof(*ss));\n+\tmemcpy(ss, addr, addrlen);\n \n-\t\tadd_child(pid, addr, addrlen);\n-\t\treturn;\n-\t}\n+\tasync.proc = async_execute;\n+\tasync.data = ss;\n+\tasync.out = incoming;\n \n-\tdup2(incoming, 0);\n-\tdup2(incoming, 1);\n+\tif (start_async(&async))\n+\t\tlogerror(\"unable to fork\");\n+\telse\n+\t\tadd_child(&async, addr, addrlen);\n \tclose(incoming);\n-\n-\texit(execute(0, addr));\n }\n \n static void child_handler(int signo)\n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128396","messageId":"1259195958-2372-11-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-10-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 10/11] daemon: use full buffered mode for stderr","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:17Z","receivedAt":"2009-11-26T00:39:17Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"Windows doesn't support line buffered mode for file\nstreams, so let's just use full buffered mode with\na big buffer (\"4096 should be enough for everyone\")\nand add explicit flushing.\n\nSigned-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n daemon.c |    6 ++++--\n 1 files changed, 4 insertions(+), 2 deletions(-)\n\ndiff --git a/daemon.c b/daemon.c\nindex 1b0e290..130e951 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -66,12 +66,14 @@ static void logreport(int priority, const char *err, va_list params)\n \t\tsyslog(priority, \"%s\", buf);\n \t} else {\n \t\t/*\n-\t\t * Since stderr is set to linebuffered mode, the\n+\t\t * Since stderr is set to buffered mode, the\n \t\t * logging of different processes will not overlap\n+\t\t * unless they overflow the (rather big) buffers.\n \t\t */\n \t\tfprintf(stderr, \"[%\"PRIuMAX\"] \", (uintmax_t)getpid());\n \t\tvfprintf(stderr, err, params);\n \t\tfputc('\\n', stderr);\n+\t\tfflush(stderr);\n \t}\n }\n \n@@ -1094,7 +1096,7 @@ int main(int argc, char **argv)\n \t\tset_die_routine(daemon_die);\n \t} else\n \t\t/* avoid splitting a message in the middle */\n-\t\tsetvbuf(stderr, NULL, _IOLBF, 0);\n+\t\tsetvbuf(stderr, NULL, _IOFBF, 4096);\n \n \tif (inetd_mode && (group_name || user_name))\n \t\tdie(\"--user and --group are incompatible with --inetd\");\n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128397","messageId":"1259195958-2372-12-git-send-email-kusmabite@gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-11-git-send-email-kusmabite@gmail.com","subject":"[PATCH/RFC 11/11] mingw: compile git-daemon","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:39:18Z","receivedAt":"2009-11-26T00:39:18Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"--user and --detach are disabled on Windows due to lack of\nfork(), setuid(), setgid(), setsid() and initgroups().\n\nSigned-off-by: Erik Faye-Lund <kusmabite@gmail.com>\n---\n Makefile       |    6 +++---\n compat/mingw.h |    1 +\n daemon.c       |   19 ++++++++++++++-----\n 3 files changed, 18 insertions(+), 8 deletions(-)\n\ndiff --git a/Makefile b/Makefile\nindex 3b01694..406ca81 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -352,6 +352,7 @@ EXTRA_PROGRAMS =\n \n # ... and all the rest that could be moved out of bindir to gitexecdir\n PROGRAMS += $(EXTRA_PROGRAMS)\n+PROGRAMS += git-daemon$X\n PROGRAMS += git-fast-import$X\n PROGRAMS += git-hash-object$X\n PROGRAMS += git-imap-send$X\n@@ -981,6 +982,8 @@ ifneq (,$(findstring MINGW,$(uname_S)))\n \tOBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo\n \tNO_REGEX = YesPlease\n \tBLK_SHA1 = YesPlease\n+\tNO_INET_PTON = YesPlease\n+\tNO_INET_NTOP = YesPlease\n \tCOMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/fnmatch\n \tCOMPAT_CFLAGS += -DSTRIP_EXTENSION=\\\".exe\\\"\n \t# We have GCC, so let's make use of those nice options\n@@ -1079,9 +1082,6 @@ ifdef ZLIB_PATH\n endif\n EXTLIBS += -lz\n \n-ifndef NO_POSIX_ONLY_PROGRAMS\n-\tPROGRAMS += git-daemon$X\n-endif\n ifndef NO_OPENSSL\n \tOPENSSL_LIBSSL = -lssl\n \tifdef OPENSSLDIR\ndiff --git a/compat/mingw.h b/compat/mingw.h\nindex 576b1a1..1b0dd5b 100644\n--- a/compat/mingw.h\n+++ b/compat/mingw.h\n@@ -6,6 +6,7 @@\n \n typedef int pid_t;\n typedef int socklen_t;\n+typedef unsigned int gid_t;\n #define hstrerror strerror\n \n #define S_IFLNK    0120000 /* Symbolic link */\ndiff --git a/daemon.c b/daemon.c\nindex 130e951..5872ec7 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -616,7 +616,7 @@ static struct child {\n \tstruct sockaddr_storage address;\n } *firstborn;\n \n-static void add_child(struct async *async, struct sockaddr *addr, int addrlen)\n+static void add_child(struct async *async, struct sockaddr *addr, socklen_t addrlen)\n {\n \tstruct child *newborn, **cradle;\n \n@@ -679,7 +679,7 @@ int async_execute(int fd, void *data)\n \treturn ret;\n }\n \n-static void handle(int incoming, struct sockaddr *addr, int addrlen)\n+static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)\n {\n \tstruct sockaddr_storage *ss;\n \tstruct async async = { 0 };\n@@ -884,7 +884,7 @@ static int service_loop(int socknum, int *socklist)\n \t\tfor (i = 0; i < socknum; i++) {\n \t\t\tif (pfd[i].revents & POLLIN) {\n \t\t\t\tstruct sockaddr_storage ss;\n-\t\t\t\tunsigned int sslen = sizeof(ss);\n+\t\t\t\tsocklen_t sslen = sizeof(ss);\n \t\t\t\tint incoming = accept(pfd[i].fd, (struct sockaddr *)&ss, &sslen);\n \t\t\t\tif (incoming < 0) {\n \t\t\t\t\tswitch (errno) {\n@@ -916,6 +916,7 @@ static void sanitize_stdfds(void)\n \n static void daemonize(void)\n {\n+#ifndef WIN32\n \tswitch (fork()) {\n \t\tcase 0:\n \t\t\tbreak;\n@@ -930,6 +931,9 @@ static void daemonize(void)\n \tclose(1);\n \tclose(2);\n \tsanitize_stdfds();\n+#else\n+\tdie(\"--detach is not supported on Windows\");\n+#endif\n }\n \n static void store_pid(const char *path)\n@@ -950,10 +954,12 @@ static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t\n \t\tdie(\"unable to allocate any listen sockets on host %s port %u\",\n \t\t    listen_addr, listen_port);\n \n+#ifndef WIN32\n \tif (pass && gid &&\n \t    (initgroups(pass->pw_name, gid) || setgid (gid) ||\n \t     setuid(pass->pw_uid)))\n \t\tdie(\"cannot drop privileges\");\n+#endif\n \n \treturn service_loop(socknum, socklist);\n }\n@@ -966,7 +972,6 @@ int main(int argc, char **argv)\n \tconst char *pid_file = NULL, *user_name = NULL, *group_name = NULL;\n \tint detach = 0;\n \tstruct passwd *pass = NULL;\n-\tstruct group *group;\n \tgid_t gid = 0;\n \tint i;\n \n@@ -1110,6 +1115,7 @@ int main(int argc, char **argv)\n \t\tdie(\"--group supplied without --user\");\n \n \tif (user_name) {\n+#ifndef WIN32\n \t\tpass = getpwnam(user_name);\n \t\tif (!pass)\n \t\t\tdie(\"user not found - %s\", user_name);\n@@ -1117,12 +1123,15 @@ int main(int argc, char **argv)\n \t\tif (!group_name)\n \t\t\tgid = pass->pw_gid;\n \t\telse {\n-\t\t\tgroup = getgrnam(group_name);\n+\t\t\tstruct group *group = getgrnam(group_name);\n \t\t\tif (!group)\n \t\t\t\tdie(\"group not found - %s\", group_name);\n \n \t\t\tgid = group->gr_gid;\n \t\t}\n+#else\n+\t\tdie(\"--user is not supported on Windows\");\n+#endif\n \t}\n \n \tif (strict_paths && (!ok_paths || !*ok_paths))\n-- \n1.6.5.rc2.7.g4f8d3\n"},{"id":"128398","messageId":"40aa078e0911251643m7837cd82g8ea9d631c012d62@mail.gmail.com","threadId":"21754","inReplyTo":"1259195958-2372-1-git-send-email-kusmabite@gmail.com","subject":"Re: [PATCH/RFC 00/11] daemon-win32","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@googlemail.com","sentAt":"2009-11-26T00:43:04Z","receivedAt":"2009-11-26T00:43:04Z","isPatch":true,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"Awww, sorry people. I managed to send this one to the wrong\nmsysgit-account. I'll repost, as I think it's important to get that\nlist involved as well.\n\nOn Thu, Nov 26, 2009 at 1:39 AM, Erik Faye-Lund\n<kusmabite@googlemail.com> wrote:\n> This is my stab at cleaning up Mike Pape's patches for git-daemon\n> on Windows for submission, plus some of my own.\n>\n> * Patch 1-4 originate from Mike Pape, but have been cleaned up quite\n>  a lot by me. I hope Mike won't hate me. Credit have been retained,\n>  as all important code here were written by Mike. The commit\n>  messages were written mostly by me.\n>\n> * Patch 5 is a trivial old-style function declaration fix.\n>\n> * Patch 6 introduces two new functions to the run-command API,\n>  kill_async() and is_async_alive().\n>\n> * Patch 7-8 removes the stdin/stdout redirection for the service\n>  functions, as redirecting won't work for the threaded version.\n>\n> * Patch 9 converts the daemon-code to use the run-command API. This\n>  is the patch I expect to be the most controversial.\n>\n> * Patch 10 is about using line-buffered mode instead of full-buffered\n>  mode for stderr.\n>\n> * Patch 11 finally enables compilation of git-daemon on MinGW.\n>\n> Let the flames begin!\n>\n> Erik Faye-Lund (7):\n>  inet_ntop: fix a couple of old-style decls\n>  run-command: add kill_async() and is_async_alive()\n>  run-command: support input-fd\n>  daemon: use explicit file descriptor\n>  daemon: use run-command api for async serving\n>  daemon: use full buffered mode for stderr\n>  mingw: compile git-daemon\n>\n> Mike Pape (4):\n>  mingw: add network-wrappers for daemon\n>  strbuf: add non-variadic function strbuf_vaddf()\n>  mingw: implement syslog\n>  compat: add inet_pton and inet_ntop prototypes\n>\n>  Makefile           |    8 ++-\n>  compat/inet_ntop.c |   22 ++------\n>  compat/inet_pton.c |    8 ++-\n>  compat/mingw.c     |  111 +++++++++++++++++++++++++++++++++++++++++--\n>  compat/mingw.h     |   32 ++++++++++++\n>  daemon.c           |  134 ++++++++++++++++++++++++++--------------------------\n>  git-compat-util.h  |    9 ++++\n>  run-command.c      |   32 ++++++++++++-\n>  run-command.h      |    2 +\n>  strbuf.c           |   15 ++++--\n>  strbuf.h           |    1 +\n>  11 files changed, 274 insertions(+), 100 deletions(-)\n>\n>\n\n\n\n-- \nErik \"kusma\" Faye-Lund\n"}]}