{"thread":{"id":"24836","subject":"added possibility to supply more than one --listen argument to git-daemon","startedAt":"2010-08-23T16:54:34Z","lastAt":"2010-08-30T12:58:02Z","messageCount":18,"participants":["Alexander Sulfrian","Junio C Hamano","Erik Faye-Lund","AlexanderS"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"148763","messageId":"1282582475-3545-1-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":null,"subject":"added possibility to supply more than one --listen argument to git-daemon","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-23T16:54:34Z","receivedAt":"2010-08-23T16:54:34Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"Hi list,\n\nI have written a patch to allow more than one --listen argument to the\ngit daemon. The current situation is, that the daemon silently ignores\nall --listen arguments beside the last one. So there is no possibility\nto let on server listen on many addresses without let it bind to all.\n\nEven if that is currently not a problem with ipv4 addresses, in the\nfuture that problem gets even worse. I wanted git-daemon to listen on\nan ipv4 address and an ipv6 address. That is currently not possible\nwithout running two instances. So I created that patch.\n\nI already send this patch as [PATCH/RFC] to the list earlier. But\nbecause nobody has send any reply yet, I am resending it as [PATCH]\nready for inclusion now.\n\nThanks,\nAlex\n"},{"id":"148764","messageId":"1282582475-3545-2-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":"1282582475-3545-1-git-send-email-alexander@sulfrian.net","subject":"[PATCH] added possibility to supply more than one --listen argument to git-daemon","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-23T16:54:35Z","receivedAt":"2010-08-23T16:54:35Z","isPatch":true,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"--listen arguments are gathered in a string_list\nserve and socksetup get listen_addr as string_list\nsocketsetup creates a listen socket for each host in that string_list\n\nSigned-off-by: Alexander Sulfrian <alexander@sulfrian.net>\n---\n daemon.c |  183 ++++++++++++++++++++++++++++++++++++--------------------------\n 1 files changed, 107 insertions(+), 76 deletions(-)\n\ndiff --git a/daemon.c b/daemon.c\nindex e22a2b7..f4492fe 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -3,6 +3,7 @@\n #include \"exec_cmd.h\"\n #include \"run-command.h\"\n #include \"strbuf.h\"\n+#include \"string-list.h\"\n \n #include <syslog.h>\n \n@@ -736,7 +737,7 @@ static int set_reuse_addr(int sockfd)\n \n #ifndef NO_IPV6\n \n-static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+static int socksetup(struct string_list *listen_addr, int listen_port, int **socklist_p)\n {\n \tint socknum = 0, *socklist = NULL;\n \tint maxfd = -1;\n@@ -744,6 +745,7 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \tstruct addrinfo hints, *ai0, *ai;\n \tint gai;\n \tlong flags;\n+\tint i;\n \n \tsprintf(pbuf, \"%d\", listen_port);\n \tmemset(&hints, 0, sizeof(hints));\n@@ -752,57 +754,69 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \thints.ai_protocol = IPPROTO_TCP;\n \thints.ai_flags = AI_PASSIVE;\n \n-\tgai = getaddrinfo(listen_addr, pbuf, &hints, &ai0);\n-\tif (gai)\n-\t\tdie(\"getaddrinfo() failed: %s\", gai_strerror(gai));\n+\ti = 0;\n+\tdo {\n+\t\tif (listen_addr->nr > 0) {\n+\t\t\tgai = getaddrinfo(listen_addr->items[i].string, pbuf,\n+\t\t\t\t\t  &hints, &ai0);\n+\t\t}\n+\t\telse {\n+\t\t\tgai = getaddrinfo(NULL, pbuf, &hints, &ai0);\n+\t\t}\n \n-\tfor (ai = ai0; ai; ai = ai->ai_next) {\n-\t\tint sockfd;\n+\t\tif (gai)\n+\t\t\tdie(\"getaddrinfo() failed: %s\", gai_strerror(gai));\n \n-\t\tsockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);\n-\t\tif (sockfd < 0)\n-\t\t\tcontinue;\n-\t\tif (sockfd >= FD_SETSIZE) {\n-\t\t\tlogerror(\"Socket descriptor too large\");\n-\t\t\tclose(sockfd);\n-\t\t\tcontinue;\n-\t\t}\n+\t\tfor (ai = ai0; ai; ai = ai->ai_next) {\n+\t\t\tint sockfd;\n+\n+\t\t\tsockfd = socket(ai->ai_family, ai->ai_socktype,\n+\t\t\t\t\tai->ai_protocol);\n+\t\t\tif (sockfd < 0)\n+\t\t\t\tcontinue;\n+\t\t\tif (sockfd >= FD_SETSIZE) {\n+\t\t\t\tlogerror(\"Socket descriptor too large\");\n+\t\t\t\tclose(sockfd);\n+\t\t\t\tcontinue;\n+\t\t\t}\n \n #ifdef IPV6_V6ONLY\n-\t\tif (ai->ai_family == AF_INET6) {\n-\t\t\tint on = 1;\n-\t\t\tsetsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY,\n-\t\t\t\t   &on, sizeof(on));\n-\t\t\t/* Note: error is not fatal */\n-\t\t}\n+\t\t\tif (ai->ai_family == AF_INET6) {\n+\t\t\t\tint on = 1;\n+\t\t\t\tsetsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY,\n+\t\t\t\t\t   &on, sizeof(on));\n+\t\t\t\t/* Note: error is not fatal */\n+\t\t\t}\n #endif\n \n-\t\tif (set_reuse_addr(sockfd)) {\n-\t\t\tclose(sockfd);\n-\t\t\tcontinue;\n-\t\t}\n+\t\t\tif (set_reuse_addr(sockfd)) {\n+\t\t\t\tclose(sockfd);\n+\t\t\t\tcontinue;\n+\t\t\t}\n \n-\t\tif (bind(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {\n-\t\t\tclose(sockfd);\n-\t\t\tcontinue;\t/* not fatal */\n-\t\t}\n-\t\tif (listen(sockfd, 5) < 0) {\n-\t\t\tclose(sockfd);\n-\t\t\tcontinue;\t/* not fatal */\n-\t\t}\n+\t\t\tif (bind(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {\n+\t\t\t\tclose(sockfd);\n+\t\t\t\tcontinue;\t/* not fatal */\n+\t\t\t}\n+\t\t\tif (listen(sockfd, 5) < 0) {\n+\t\t\t\tclose(sockfd);\n+\t\t\t\tcontinue;\t/* not fatal */\n+\t\t\t}\n \n-\t\tflags = fcntl(sockfd, F_GETFD, 0);\n-\t\tif (flags >= 0)\n-\t\t\tfcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);\n+\t\t\tflags = fcntl(sockfd, F_GETFD, 0);\n+\t\t\tif (flags >= 0)\n+\t\t\t\tfcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);\n \n-\t\tsocklist = xrealloc(socklist, sizeof(int) * (socknum + 1));\n-\t\tsocklist[socknum++] = sockfd;\n+\t\t\tsocklist = xrealloc(socklist,\n+\t\t\t\t\t    sizeof(int) * (socknum + 1));\n+\t\t\tsocklist[socknum++] = sockfd;\n \n-\t\tif (maxfd < sockfd)\n-\t\t\tmaxfd = sockfd;\n-\t}\n+\t\t\tif (maxfd < sockfd)\n+\t\t\t\tmaxfd = sockfd;\n+\t\t}\n \n-\tfreeaddrinfo(ai0);\n+\t\tfreeaddrinfo(ai0);\n+\t} while  (++i < listen_addr->nr);\n \n \t*socklist_p = socklist;\n \treturn socknum;\n@@ -810,50 +824,60 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \n #else /* NO_IPV6 */\n \n-static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+static int socksetup(struct string_list *listen_addr, int listen_port, int **socklist_p)\n {\n+\tint socknum = 0, *socklist = NULL;\n \tstruct sockaddr_in sin;\n \tint sockfd;\n \tlong flags;\n+\tint i;\n \n \tmemset(&sin, 0, sizeof sin);\n \tsin.sin_family = AF_INET;\n \tsin.sin_port = htons(listen_port);\n \n-\tif (listen_addr) {\n-\t\t/* Well, host better be an IP address here. */\n-\t\tif (inet_pton(AF_INET, listen_addr, &sin.sin_addr.s_addr) <= 0)\n+\ti = 0;\n+\tdo {\n+\t\tif (listen_addr->nr > 0) {\n+\t\t\t/* Well, host better be an IP address here. */\n+\t\t\tif (inet_pton(AF_INET, listen_addr->items[i].string,\n+\t\t\t\t      &sin.sin_addr.s_addr) <= 0)\n+\t\t\t\treturn 0;\n+\t\t}\n+\t\telse {\n+\t\t\tsin.sin_addr.s_addr = htonl(INADDR_ANY);\n+\t\t}\n+\n+\t\tsockfd = socket(AF_INET, SOCK_STREAM, 0);\n+\t\tif (sockfd < 0)\n \t\t\treturn 0;\n-\t} else {\n-\t\tsin.sin_addr.s_addr = htonl(INADDR_ANY);\n-\t}\n \n-\tsockfd = socket(AF_INET, SOCK_STREAM, 0);\n-\tif (sockfd < 0)\n-\t\treturn 0;\n+\t\tif (set_reuse_addr(sockfd)) {\n+\t\t\tclose(sockfd);\n+\t\t\treturn 0;\n+\t\t}\n \n-\tif (set_reuse_addr(sockfd)) {\n-\t\tclose(sockfd);\n-\t\treturn 0;\n-\t}\n+\t\tif ( bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0 ) {\n+\t\t\tclose(sockfd);\n+\t\t\treturn 0;\n+\t\t}\n \n-\tif ( bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0 ) {\n-\t\tclose(sockfd);\n-\t\treturn 0;\n-\t}\n+\t\tif (listen(sockfd, 5) < 0) {\n+\t\t\tclose(sockfd);\n+\t\t\treturn 0;\n+\t\t}\n \n-\tif (listen(sockfd, 5) < 0) {\n-\t\tclose(sockfd);\n-\t\treturn 0;\n-\t}\n+\t\tflags = fcntl(sockfd, F_GETFD, 0);\n+\t\tif (flags >= 0)\n+\t\t\tfcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);\n \n-\tflags = fcntl(sockfd, F_GETFD, 0);\n-\tif (flags >= 0)\n-\t\tfcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);\n+\t\tsocklist = xrealloc(socklist, sizeof(int) * (socknum + 1));\n+\t\tsocklist[socknum++] = sockfd;\n \n-\t*socklist_p = xmalloc(sizeof(int));\n-\t**socklist_p = sockfd;\n-\treturn 1;\n+\t} while (++i < listen_addr->nr);\n+\n+\t*socklist_p = socklist;\n+\treturn socknum;\n }\n \n #endif\n@@ -946,14 +970,14 @@ static void store_pid(const char *path)\n \t\tdie_errno(\"failed to write pid file '%s'\", path);\n }\n \n-static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n+static int serve(struct string_list *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n {\n \tint socknum, *socklist;\n \n \tsocknum = socksetup(listen_addr, listen_port, &socklist);\n \tif (socknum == 0)\n-\t\tdie(\"unable to allocate any listen sockets on host %s port %u\",\n-\t\t    listen_addr, listen_port);\n+\t\tdie(\"unable to allocate any listen sockets on port %u\",\n+\t\t    listen_port);\n \n \tif (pass && gid &&\n \t    (initgroups(pass->pw_name, gid) || setgid (gid) ||\n@@ -966,14 +990,17 @@ static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t\n int main(int argc, char **argv)\n {\n \tint listen_port = 0;\n-\tchar *listen_addr = NULL;\n \tint inetd_mode = 0;\n+\tstruct string_list listen_addr;\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+\tint return_value;\n+\n+\tmemset(&listen_addr, 0, sizeof(struct string_list));\n \n \tgit_extract_argv0_path(argv[0]);\n \n@@ -981,7 +1008,7 @@ int main(int argc, char **argv)\n \t\tchar *arg = argv[i];\n \n \t\tif (!prefixcmp(arg, \"--listen=\")) {\n-\t\t\tlisten_addr = xstrdup_tolower(arg + 9);\n+\t\t\tstring_list_append(&listen_addr, xstrdup_tolower(arg + 9));\n \t\t\tcontinue;\n \t\t}\n \t\tif (!prefixcmp(arg, \"--port=\")) {\n@@ -1106,7 +1133,7 @@ int main(int argc, char **argv)\n \tif (inetd_mode && (group_name || user_name))\n \t\tdie(\"--user and --group are incompatible with --inetd\");\n \n-\tif (inetd_mode && (listen_port || listen_addr))\n+\tif (inetd_mode && (listen_port || (listen_addr.nr > 0)))\n \t\tdie(\"--listen= and --port= are incompatible with --inetd\");\n \telse if (listen_port == 0)\n \t\tlisten_port = DEFAULT_GIT_PORT;\n@@ -1161,5 +1188,9 @@ int main(int argc, char **argv)\n \tif (pid_file)\n \t\tstore_pid(pid_file);\n \n-\treturn serve(listen_addr, listen_port, pass, gid);\n+\treturn_value = serve(&listen_addr, listen_port, pass, gid);\n+\n+\tstring_list_clear(&listen_addr, 0);\n+\n+\treturn return_value;\n }\n-- \n1.7.1\n"},{"id":"148774","messageId":"7v4oel14tl.fsf@alter.siamese.dyndns.org","threadId":"24836","inReplyTo":"1282582475-3545-2-git-send-email-alexander@sulfrian.net","subject":"Re: [PATCH] added possibility to supply more than one --listen argument to git-daemon","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2010-08-23T19:56:06Z","receivedAt":"2010-08-23T19:56:06Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Alexander Sulfrian <alexander@sulfrian.net> writes:\n\n> --listen arguments are gathered in a string_list\n> serve and socksetup get listen_addr as string_list\n> socketsetup creates a listen socket for each host in that string_list\n>\n> Signed-off-by: Alexander Sulfrian <alexander@sulfrian.net>\n> ---\n\nThanks for a resend/reminder.  I've been meaning to look at this patch\nafter somebody who actually runs the daemon commented on it.\n\nA few administravia:\n\n - Please begin the subject line with affected-area and a colon;\n\n - Please place more stress on what problem the patch tries to solve and\n   less on how the patch solves it, because the latter can be read from\n   the patch text itself, when writing a proposed log message;\n\n - We tend to write the log message in imperative mood, to order either the\n   person who applies the patch or the codebase what new things to do.\n\n - We need to also update the documentation (e.g. just add \"Can be given\n   more than one times\" before \"Incompatible with '--inetd' option.\" in\n   Documentation/git-daemon.txt).\n\nSo...\n\n    Subject: [PATCH] daemon: allow more than one host addresses given via --listen\n\n    When the host has more than one interfaces, daemon can listen to all\n    of them by not giving any --listen option, or listen to only one.\n    Teach it to accept more than one --listen options.\n\n    Signed-off-by: ...\n\n>  daemon.c |  183 ++++++++++++++++++++++++++++++++++++--------------------------\n>  1 files changed, 107 insertions(+), 76 deletions(-)\n>\n> diff --git a/daemon.c b/daemon.c\n> index e22a2b7..f4492fe 100644\n> --- a/daemon.c\n> +++ b/daemon.c\n> @@ -3,6 +3,7 @@\n>  #include \"exec_cmd.h\"\n>  #include \"run-command.h\"\n>  #include \"strbuf.h\"\n> +#include \"string-list.h\"\n>  \n>  #include <syslog.h>\n>  \n> @@ -736,7 +737,7 @@ static int set_reuse_addr(int sockfd)\n>  \n>  #ifndef NO_IPV6\n>  \n> -static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n> +static int socksetup(struct string_list *listen_addr, int listen_port, int **socklist_p)\n>  {\n>  \tint socknum = 0, *socklist = NULL;\n>  \tint maxfd = -1;\n> @@ -744,6 +745,7 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n>  \tstruct addrinfo hints, *ai0, *ai;\n>  \tint gai;\n>  \tlong flags;\n> +\tint i;\n>  \n>  \tsprintf(pbuf, \"%d\", listen_port);\n>  \tmemset(&hints, 0, sizeof(hints));\n> @@ -752,57 +754,69 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n>  \thints.ai_protocol = IPPROTO_TCP;\n>  \thints.ai_flags = AI_PASSIVE;\n>  \n> -\tgai = getaddrinfo(listen_addr, pbuf, &hints, &ai0);\n> -\tif (gai)\n> -\t\tdie(\"getaddrinfo() failed: %s\", gai_strerror(gai));\n> +\ti = 0;\n> +\tdo {\n> +\t\tif (listen_addr->nr > 0) {\n> +\t\t\tgai = getaddrinfo(listen_addr->items[i].string, pbuf,\n> +\t\t\t\t\t  &hints, &ai0);\n> +\t\t}\n> +\t\telse {\n> +\t\t\tgai = getaddrinfo(NULL, pbuf, &hints, &ai0);\n> +\t\t}\n\nStyle: neither of these if/else body need braces around it.\n\nBut more importantly, wouldn't it make the patch and the result easier to\nread if you split the part of the code that now is one iteration of the\nloop over listen_addr list into a separate helper function?\n\nThen socksetup would look something like:\n\n        static int socksetup(...)\n        {\n\t\t...\n\t\tif (!listen_addr_list->nr)\n\t\t    \tsetup_named_sock(NULL, listen_port, socklist_p);\n\t\telse {\n\t\t\tint i;\n\t\t\tfor (i = 0; i < listen_addr_list->nr; i++)\n                        \tsetup_named_sock(listen_addr_list->items[i].string,\n                                \tlisten_port, socklist_p);\n                }\n\t\t...\n    \t}\n\nIf such a refactoring results in more readable code (I haven't tried doing\nthe refactoring myself, so I don't know if it is worth it), then I would\nsuggest making this into a two-patch series, one that creates the helper\nfunction, and then another that adds multiple-listen support on top.\n\n> @@ -946,14 +970,14 @@ static void store_pid(const char *path)\n>  \t\tdie_errno(\"failed to write pid file '%s'\", path);\n>  }\n>  \n> -static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n> +static int serve(struct string_list *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n>  {\n>  \tint socknum, *socklist;\n>  \n>  \tsocknum = socksetup(listen_addr, listen_port, &socklist);\n>  \tif (socknum == 0)\n> -\t\tdie(\"unable to allocate any listen sockets on host %s port %u\",\n> -\t\t    listen_addr, listen_port);\n> +\t\tdie(\"unable to allocate any listen sockets on port %u\",\n> +\t\t    listen_port);\n\nHere we are losing \"host\" information; does it matter?\n\nEarlier socksetup() died only when getaddrinfo died, as in that case we\nknow there won't be any socket prepared.  You removed that die (which is\nsensible---as you may have one unavailable and another available interface\nand dying only when there is no socket listening has been the design of\nthe program, and you are not changing that with this patch).\n\nAlso I have to wonder what would have happened in the original code if\nthere were no --listen given (presumably we got NULL in the argument in\nthat case).\n\nMy gut feeling is that this change is Ok, as this die() would trigger only\nwhen no interface out of either all interface or the ones specified on the\ncommand line with --listen options, can be listened to at the port, either\ngiven by --listen_port option or the default 9418; and the user does know\nwhich \"host\" was asked anyway.  But the change needs to be mentioned in\nthe proposed log message.\n\nIt might be an improvement if we reported addresses that cannot be\nlistened to (you can use listen_addr_list->items[i].util for that--- when\nsetup_named_sock() helper finds that no new socket was added by the loop\nover the list resulting from getaddrinfo, it can mark the item's util\nfield, and then instead of dying the caller of socksetup() can warn on\nsuch names.  If we were to do so, however, that should be done as a\nseparate patch on top of this change.\n\n> @@ -966,14 +990,17 @@ static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t\n>  int main(int argc, char **argv)\n>  {\n>  \tint listen_port = 0;\n> -\tchar *listen_addr = NULL;\n>  \tint inetd_mode = 0;\n> +\tstruct string_list listen_addr;\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> +\tint return_value;\n> +\n> +\tmemset(&listen_addr, 0, sizeof(struct string_list));\n\nDon't we have STRING_LIST_INIT macro these days?\n\nI also have to wonder if we eventually want to take --listen=host:port so\nthat you can listen only to two interfaces out of three avaiable on your\nhost, but on different ports.  Again, if we were to do so, however, that\nshould be done as a separate patch on top of this change.\n\nThanks.\n"},{"id":"149206","messageId":"1283094462-5184-1-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":"7v4oel14tl.fsf@alter.siamese.dyndns.org","subject":"daemon: allow more than one host addresses given via --listen","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-29T15:07:40Z","receivedAt":"2010-08-29T15:07:40Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"\nHi,\nhere is version 2 of my patch. I hope i considered all of your hints\nJunio.\n\nThe patch currently does not support the --listen=host:port format,\nbut I will look if it could be done. The problem that I currently see:\nFor IPv6 it should be handle [ipv6-address]:port correctly. But anyway\nit should be a patch on top of this patch.\n\nThanks,\nAlex\n\n\n Documentation/git-daemon.txt | Alexander Sulfrian (2):\n  daemon: add helper function named_sock_setup\n  daemon: allow more than one host address given via --listen\n\n Documentation/git-daemon.txt |    1 +\n daemon.c                     |   62 +++++++++++++++++++++++++++++------------\n 2 files changed, 45 insertions(+), 18 deletions(-)\n"},{"id":"149208","messageId":"1283094462-5184-2-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":"7v4oel14tl.fsf@alter.siamese.dyndns.org","subject":"[PATCHv2 1/2] daemon: add helper function named_sock_setup","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-29T15:07:41Z","receivedAt":"2010-08-29T15:07:41Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"Add named_sock_setup as helper function for socksetup to make it\neasier to create more than one listen sockets. named_sock_setup could\nbe called more than one time and add the new sockets to the supplied\nsocklist_p.\n\nSigned-off-by: Alexander Sulfrian <alexander@sulfrian.net>\n---\n daemon.c |   35 ++++++++++++++++++++++++-----------\n 1 files changed, 24 insertions(+), 11 deletions(-)\n\ndiff --git a/daemon.c b/daemon.c\nindex e22a2b7..deda4cf 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -736,9 +736,9 @@ static int set_reuse_addr(int sockfd)\n \n #ifndef NO_IPV6\n \n-static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+static int setup_named_sock(char *listen_addr, int listen_port, int **socklist_p, int socknum)\n {\n-\tint socknum = 0, *socklist = NULL;\n+\tint *socklist = *socklist_p;\n \tint maxfd = -1;\n \tchar pbuf[NI_MAXSERV];\n \tstruct addrinfo hints, *ai0, *ai;\n@@ -810,8 +810,9 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \n #else /* NO_IPV6 */\n \n-static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+static int setup_named_sock(char *listen_addr, int listen_port, int **socklist_p, int socknum)\n {\n+\tint *socklist = *socklist_p;\n \tstruct sockaddr_in sin;\n \tint sockfd;\n \tlong flags;\n@@ -823,41 +824,53 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \tif (listen_addr) {\n \t\t/* Well, host better be an IP address here. */\n \t\tif (inet_pton(AF_INET, listen_addr, &sin.sin_addr.s_addr) <= 0)\n-\t\t\treturn 0;\n+\t\t\treturn socknum;\n \t} else {\n \t\tsin.sin_addr.s_addr = htonl(INADDR_ANY);\n \t}\n \n \tsockfd = socket(AF_INET, SOCK_STREAM, 0);\n \tif (sockfd < 0)\n-\t\treturn 0;\n+\t\treturn socknum;\n \n \tif (set_reuse_addr(sockfd)) {\n \t\tclose(sockfd);\n-\t\treturn 0;\n+\t\treturn socknum;\n \t}\n \n \tif ( bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0 ) {\n \t\tclose(sockfd);\n-\t\treturn 0;\n+\t\treturn socknum;\n \t}\n \n \tif (listen(sockfd, 5) < 0) {\n \t\tclose(sockfd);\n-\t\treturn 0;\n+\t\treturn socknum;\n \t}\n \n \tflags = fcntl(sockfd, F_GETFD, 0);\n \tif (flags >= 0)\n \t\tfcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);\n \n-\t*socklist_p = xmalloc(sizeof(int));\n-\t**socklist_p = sockfd;\n-\treturn 1;\n+\tsocklist = xrealloc(socklist, sizeof(int) * (socknum + 1));\n+\tsocklist[socknum++] = sockfd;\n+\n+\t*socklist_p = socklist;\n+\treturn socknum;\n }\n \n #endif\n \n+static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+{\n+\tint socknum = 0, *socklist = NULL;\n+\n+\tsocknum = setup_named_sock(listen_addr, listen_port, &socklist, socknum);\n+\n+\t*socklist_p = socklist;\n+\treturn socknum;\n+}\n+\n static int service_loop(int socknum, int *socklist)\n {\n \tstruct pollfd *pfd;\n-- \n1.7.1\n"},{"id":"149207","messageId":"1283094462-5184-3-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":"7v4oel14tl.fsf@alter.siamese.dyndns.org","subject":"[PATCHv2 2/2] daemon: allow more than one host address given via --listen","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-29T15:07:42Z","receivedAt":"2010-08-29T15:07:42Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"When the host has more than one interfaces, daemon can listen to all\nof them by not giving any --listen option, or listen to only one.\nTeach it to accept more than one --listen options.\n\nRemove the hostname information form the die, if no socket could be\ncreated. It would only trigger when no interface out of either all\ninterface or the ones specified on the command line with --listen\noptions, can be listened to and so the user does know which \"host\" was\nasked.\n\nSigned-off-by: Alexander Sulfrian <alexander@sulfrian.net>\n---\n Documentation/git-daemon.txt |    1 +\n daemon.c                     |   31 ++++++++++++++++++++++---------\n 2 files changed, 23 insertions(+), 9 deletions(-)\n\ndiff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.txt\nindex 01c9f8e..4afd0a4 100644\n--- a/Documentation/git-daemon.txt\n+++ b/Documentation/git-daemon.txt\n@@ -85,6 +85,7 @@ OPTIONS\n \tbe either an IPv4 address or an IPv6 address if supported.  If IPv6\n \tis not supported, then --listen=hostname is also not supported and\n \t--listen must be given an IPv4 address.\n+\tCan be given more than one time.\n \tIncompatible with '--inetd' option.\n \n --port=n::\ndiff --git a/daemon.c b/daemon.c\nindex deda4cf..f7f7e13 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -3,6 +3,7 @@\n #include \"exec_cmd.h\"\n #include \"run-command.h\"\n #include \"strbuf.h\"\n+#include \"string-list.h\"\n \n #include <syslog.h>\n \n@@ -861,11 +862,20 @@ static int setup_named_sock(char *listen_addr, int listen_port, int **socklist_p\n \n #endif\n \n-static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+static int socksetup(struct string_list *listen_addr, int listen_port, int **socklist_p)\n {\n \tint socknum = 0, *socklist = NULL;\n \n-\tsocknum = setup_named_sock(listen_addr, listen_port, &socklist, socknum);\n+\tif (!listen_addr->nr)\n+\t\tsocknum = setup_named_sock(NULL, listen_port, &socklist,\n+\t\t\t\t\t   socknum);\n+\telse {\n+\t\tint i;\n+\t\tfor (i = 0; i < listen_addr->nr; i++)\n+\t\t\tsocknum = setup_named_sock(listen_addr->items[i].string,\n+\t\t\t\t\t\t   listen_port, &socklist,\n+\t\t\t\t\t\t   socknum);\n+\t}\n \n \t*socklist_p = socklist;\n \treturn socknum;\n@@ -959,14 +969,14 @@ static void store_pid(const char *path)\n \t\tdie_errno(\"failed to write pid file '%s'\", path);\n }\n \n-static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n+static int serve(struct string_list *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n {\n \tint socknum, *socklist;\n \n \tsocknum = socksetup(listen_addr, listen_port, &socklist);\n \tif (socknum == 0)\n-\t\tdie(\"unable to allocate any listen sockets on host %s port %u\",\n-\t\t    listen_addr, listen_port);\n+\t\tdie(\"unable to allocate any listen sockets on port %u\",\n+\t\t    listen_port);\n \n \tif (pass && gid &&\n \t    (initgroups(pass->pw_name, gid) || setgid (gid) ||\n@@ -979,7 +989,7 @@ static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t\n int main(int argc, char **argv)\n {\n \tint listen_port = 0;\n-\tchar *listen_addr = NULL;\n+\tstruct string_list listen_addr = STRING_LIST_INIT_NODUP;\n \tint inetd_mode = 0;\n \tconst char *pid_file = NULL, *user_name = NULL, *group_name = NULL;\n \tint detach = 0;\n@@ -987,6 +997,7 @@ int main(int argc, char **argv)\n \tstruct group *group;\n \tgid_t gid = 0;\n \tint i;\n+\tint return_value;\n \n \tgit_extract_argv0_path(argv[0]);\n \n@@ -994,7 +1005,7 @@ int main(int argc, char **argv)\n \t\tchar *arg = argv[i];\n \n \t\tif (!prefixcmp(arg, \"--listen=\")) {\n-\t\t\tlisten_addr = xstrdup_tolower(arg + 9);\n+\t\t\tstring_list_append(&listen_addr, xstrdup_tolower(arg + 9));\n \t\t\tcontinue;\n \t\t}\n \t\tif (!prefixcmp(arg, \"--port=\")) {\n@@ -1119,7 +1130,7 @@ int main(int argc, char **argv)\n \tif (inetd_mode && (group_name || user_name))\n \t\tdie(\"--user and --group are incompatible with --inetd\");\n \n-\tif (inetd_mode && (listen_port || listen_addr))\n+\tif (inetd_mode && (listen_port || (listen_addr.nr > 0)))\n \t\tdie(\"--listen= and --port= are incompatible with --inetd\");\n \telse if (listen_port == 0)\n \t\tlisten_port = DEFAULT_GIT_PORT;\n@@ -1174,5 +1185,7 @@ int main(int argc, char **argv)\n \tif (pid_file)\n \t\tstore_pid(pid_file);\n \n-\treturn serve(listen_addr, listen_port, pass, gid);\n+\treturn_value = serve(&listen_addr, listen_port, pass, gid);\n+\n+\treturn return_value;\n }\n-- \n1.7.1\n"},{"id":"149209","messageId":"AANLkTi==kDW7FbTZ7P6nF+k8_jGTJsFvwkcRijR=jex4@mail.gmail.com","threadId":"24836","inReplyTo":"1283094462-5184-3-git-send-email-alexander@sulfrian.net","subject":"Re: [PATCHv2 2/2] daemon: allow more than one host address given via --listen","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@gmail.com","sentAt":"2010-08-29T15:11:54Z","receivedAt":"2010-08-29T15:11:54Z","isPatch":false,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"On Sun, Aug 29, 2010 at 5:07 PM, Alexander Sulfrian\n<alexander@sulfrian.net> wrote:\n> @@ -987,6 +997,7 @@ int main(int argc, char **argv)\n>        struct group *group;\n>        gid_t gid = 0;\n>        int i;\n> +       int return_value;\n>\n>        git_extract_argv0_path(argv[0]);\n>\n<snip>\n> @@ -1174,5 +1185,7 @@ int main(int argc, char **argv)\n>        if (pid_file)\n>                store_pid(pid_file);\n>\n> -       return serve(listen_addr, listen_port, pass, gid);\n> +       return_value = serve(&listen_addr, listen_port, pass, gid);\n> +\n> +       return return_value;\n>  }\n\nUhm, why? I can't find any other uses for \"return_value\"...\n"},{"id":"149210","messageId":"1283094796-27984-1-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":"1283094462-5184-1-git-send-email-alexander@sulfrian.net","subject":"daemon: allow more than one host addresses given via --listen","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-29T15:13:14Z","receivedAt":"2010-08-29T15:13:14Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"\nHi,\nuups sorry, missed the string_list_clear in v2.\n\nThanks\nAlex\n"},{"id":"149211","messageId":"1283094796-27984-2-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":"1283094462-5184-1-git-send-email-alexander@sulfrian.net","subject":"[PATCHv3 1/2] daemon: add helper function named_sock_setup","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-29T15:13:15Z","receivedAt":"2010-08-29T15:13:15Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"Add named_sock_setup as helper function for socksetup to make it\neasier to create more than one listen sockets. named_sock_setup could\nbe called more than one time and add the new sockets to the supplied\nsocklist_p.\n\nSigned-off-by: Alexander Sulfrian <alexander@sulfrian.net>\n---\n daemon.c |   35 ++++++++++++++++++++++++-----------\n 1 files changed, 24 insertions(+), 11 deletions(-)\n\ndiff --git a/daemon.c b/daemon.c\nindex e22a2b7..deda4cf 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -736,9 +736,9 @@ static int set_reuse_addr(int sockfd)\n \n #ifndef NO_IPV6\n \n-static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+static int setup_named_sock(char *listen_addr, int listen_port, int **socklist_p, int socknum)\n {\n-\tint socknum = 0, *socklist = NULL;\n+\tint *socklist = *socklist_p;\n \tint maxfd = -1;\n \tchar pbuf[NI_MAXSERV];\n \tstruct addrinfo hints, *ai0, *ai;\n@@ -810,8 +810,9 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \n #else /* NO_IPV6 */\n \n-static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+static int setup_named_sock(char *listen_addr, int listen_port, int **socklist_p, int socknum)\n {\n+\tint *socklist = *socklist_p;\n \tstruct sockaddr_in sin;\n \tint sockfd;\n \tlong flags;\n@@ -823,41 +824,53 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \tif (listen_addr) {\n \t\t/* Well, host better be an IP address here. */\n \t\tif (inet_pton(AF_INET, listen_addr, &sin.sin_addr.s_addr) <= 0)\n-\t\t\treturn 0;\n+\t\t\treturn socknum;\n \t} else {\n \t\tsin.sin_addr.s_addr = htonl(INADDR_ANY);\n \t}\n \n \tsockfd = socket(AF_INET, SOCK_STREAM, 0);\n \tif (sockfd < 0)\n-\t\treturn 0;\n+\t\treturn socknum;\n \n \tif (set_reuse_addr(sockfd)) {\n \t\tclose(sockfd);\n-\t\treturn 0;\n+\t\treturn socknum;\n \t}\n \n \tif ( bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0 ) {\n \t\tclose(sockfd);\n-\t\treturn 0;\n+\t\treturn socknum;\n \t}\n \n \tif (listen(sockfd, 5) < 0) {\n \t\tclose(sockfd);\n-\t\treturn 0;\n+\t\treturn socknum;\n \t}\n \n \tflags = fcntl(sockfd, F_GETFD, 0);\n \tif (flags >= 0)\n \t\tfcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);\n \n-\t*socklist_p = xmalloc(sizeof(int));\n-\t**socklist_p = sockfd;\n-\treturn 1;\n+\tsocklist = xrealloc(socklist, sizeof(int) * (socknum + 1));\n+\tsocklist[socknum++] = sockfd;\n+\n+\t*socklist_p = socklist;\n+\treturn socknum;\n }\n \n #endif\n \n+static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+{\n+\tint socknum = 0, *socklist = NULL;\n+\n+\tsocknum = setup_named_sock(listen_addr, listen_port, &socklist, socknum);\n+\n+\t*socklist_p = socklist;\n+\treturn socknum;\n+}\n+\n static int service_loop(int socknum, int *socklist)\n {\n \tstruct pollfd *pfd;\n-- \n1.7.1\n"},{"id":"149212","messageId":"1283094796-27984-3-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":"1283094462-5184-1-git-send-email-alexander@sulfrian.net","subject":"[PATCHv3 2/2] daemon: allow more than one host address given via --listen","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-29T15:13:16Z","receivedAt":"2010-08-29T15:13:16Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"When the host has more than one interfaces, daemon can listen to all\nof them by not giving any --listen option, or listen to only one.\nTeach it to accept more than one --listen options.\n\nRemove the hostname information form the die, if no socket could be\ncreated. It would only trigger when no interface out of either all\ninterface or the ones specified on the command line with --listen\noptions, can be listened to and so the user does know which \"host\" was\nasked.\n\nSigned-off-by: Alexander Sulfrian <alexander@sulfrian.net>\n---\n Documentation/git-daemon.txt |    1 +\n daemon.c                     |   33 ++++++++++++++++++++++++---------\n 2 files changed, 25 insertions(+), 9 deletions(-)\n\ndiff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.txt\nindex 01c9f8e..4afd0a4 100644\n--- a/Documentation/git-daemon.txt\n+++ b/Documentation/git-daemon.txt\n@@ -85,6 +85,7 @@ OPTIONS\n \tbe either an IPv4 address or an IPv6 address if supported.  If IPv6\n \tis not supported, then --listen=hostname is also not supported and\n \t--listen must be given an IPv4 address.\n+\tCan be given more than one time.\n \tIncompatible with '--inetd' option.\n \n --port=n::\ndiff --git a/daemon.c b/daemon.c\nindex deda4cf..bd7574e 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -3,6 +3,7 @@\n #include \"exec_cmd.h\"\n #include \"run-command.h\"\n #include \"strbuf.h\"\n+#include \"string-list.h\"\n \n #include <syslog.h>\n \n@@ -861,11 +862,20 @@ static int setup_named_sock(char *listen_addr, int listen_port, int **socklist_p\n \n #endif\n \n-static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+static int socksetup(struct string_list *listen_addr, int listen_port, int **socklist_p)\n {\n \tint socknum = 0, *socklist = NULL;\n \n-\tsocknum = setup_named_sock(listen_addr, listen_port, &socklist, socknum);\n+\tif (!listen_addr->nr)\n+\t\tsocknum = setup_named_sock(NULL, listen_port, &socklist,\n+\t\t\t\t\t   socknum);\n+\telse {\n+\t\tint i;\n+\t\tfor (i = 0; i < listen_addr->nr; i++)\n+\t\t\tsocknum = setup_named_sock(listen_addr->items[i].string,\n+\t\t\t\t\t\t   listen_port, &socklist,\n+\t\t\t\t\t\t   socknum);\n+\t}\n \n \t*socklist_p = socklist;\n \treturn socknum;\n@@ -959,14 +969,14 @@ static void store_pid(const char *path)\n \t\tdie_errno(\"failed to write pid file '%s'\", path);\n }\n \n-static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n+static int serve(struct string_list *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n {\n \tint socknum, *socklist;\n \n \tsocknum = socksetup(listen_addr, listen_port, &socklist);\n \tif (socknum == 0)\n-\t\tdie(\"unable to allocate any listen sockets on host %s port %u\",\n-\t\t    listen_addr, listen_port);\n+\t\tdie(\"unable to allocate any listen sockets on port %u\",\n+\t\t    listen_port);\n \n \tif (pass && gid &&\n \t    (initgroups(pass->pw_name, gid) || setgid (gid) ||\n@@ -979,7 +989,7 @@ static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t\n int main(int argc, char **argv)\n {\n \tint listen_port = 0;\n-\tchar *listen_addr = NULL;\n+\tstruct string_list listen_addr = STRING_LIST_INIT_NODUP;\n \tint inetd_mode = 0;\n \tconst char *pid_file = NULL, *user_name = NULL, *group_name = NULL;\n \tint detach = 0;\n@@ -987,6 +997,7 @@ int main(int argc, char **argv)\n \tstruct group *group;\n \tgid_t gid = 0;\n \tint i;\n+\tint return_value;\n \n \tgit_extract_argv0_path(argv[0]);\n \n@@ -994,7 +1005,7 @@ int main(int argc, char **argv)\n \t\tchar *arg = argv[i];\n \n \t\tif (!prefixcmp(arg, \"--listen=\")) {\n-\t\t\tlisten_addr = xstrdup_tolower(arg + 9);\n+\t\t\tstring_list_append(&listen_addr, xstrdup_tolower(arg + 9));\n \t\t\tcontinue;\n \t\t}\n \t\tif (!prefixcmp(arg, \"--port=\")) {\n@@ -1119,7 +1130,7 @@ int main(int argc, char **argv)\n \tif (inetd_mode && (group_name || user_name))\n \t\tdie(\"--user and --group are incompatible with --inetd\");\n \n-\tif (inetd_mode && (listen_port || listen_addr))\n+\tif (inetd_mode && (listen_port || (listen_addr.nr > 0)))\n \t\tdie(\"--listen= and --port= are incompatible with --inetd\");\n \telse if (listen_port == 0)\n \t\tlisten_port = DEFAULT_GIT_PORT;\n@@ -1174,5 +1185,9 @@ int main(int argc, char **argv)\n \tif (pid_file)\n \t\tstore_pid(pid_file);\n \n-\treturn serve(listen_addr, listen_port, pass, gid);\n+\treturn_value = serve(&listen_addr, listen_port, pass, gid);\n+\n+\tstring_list_clear(&listen_addr, 0);\n+\n+\treturn return_value;\n }\n-- \n1.7.1\n"},{"id":"149213","messageId":"20100829171707.2bb43a97@laptop.localhost","threadId":"24836","inReplyTo":"AANLkTi==kDW7FbTZ7P6nF+k8_jGTJsFvwkcRijR=jex4@mail.gmail.com","subject":"Re: [PATCHv2 2/2] daemon: allow more than one host address given via --listen","fromName":"AlexanderS","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-29T15:17:07Z","receivedAt":"2010-08-29T15:17:07Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"On Sun, 29 Aug 2010 17:11:54 +0200\nErik Faye-Lund <kusmabite@gmail.com> wrote:\n\n<snip>\n> > @@ -1174,5 +1185,7 @@ int main(int argc, char **argv)\n> >        if (pid_file)\n> >                store_pid(pid_file);\n> >\n> > -       return serve(listen_addr, listen_port, pass, gid);\n> > +       return_value = serve(&listen_addr, listen_port, pass, gid);\n> > +\n> > +       return return_value;\n> >  }\n> \n> Uhm, why? I can't find any other uses for \"return_value\"...\n\nSee v3, I missed string_list_clear this time...\n"},{"id":"149287","messageId":"7vwrr8ftjj.fsf@alter.siamese.dyndns.org","threadId":"24836","inReplyTo":"1283094796-27984-3-git-send-email-alexander@sulfrian.net","subject":"Re: [PATCHv3 2/2] daemon: allow more than one host address given via --listen","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2010-08-30T07:28:48Z","receivedAt":"2010-08-30T07:28:48Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Alexander Sulfrian <alexander@sulfrian.net> writes:\n\n> @@ -861,11 +862,20 @@ static int setup_named_sock(char *listen_addr, int listen_port, int **socklist_p\n>  \n>  #endif\n>  \n> -static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n> +static int socksetup(struct string_list *listen_addr, int listen_port, int **socklist_p)\n>  {\n>  \tint socknum = 0, *socklist = NULL;\n>  \n> -\tsocknum = setup_named_sock(listen_addr, listen_port, &socklist, socknum);\n> +\tif (!listen_addr->nr)\n> +\t\tsocknum = setup_named_sock(NULL, listen_port, &socklist,\n> +\t\t\t\t\t   socknum);\n> +\telse {\n> +\t\tint i;\n> +\t\tfor (i = 0; i < listen_addr->nr; i++)\n> +\t\t\tsocknum = setup_named_sock(listen_addr->items[i].string,\n> +\t\t\t\t\t\t   listen_port, &socklist,\n> +\t\t\t\t\t\t   socknum);\n> +\t}\n>  \n>  \t*socklist_p = socklist;\n>  \treturn socknum;\n\nGiving an old number and returning a new number feels a bit awkward as an\nAPI.  If you create a structure that consists of a <pointer, nr, alloc>\ntuple that is suitable for ALLOC_GROW() API and pass that around instead\nof <&socklist, socknum> pair, then the helper can return how many sockets\nit prepared, and signal a failure with a negative value, no?\n\n> +static int serve(struct string_list *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n>  {\n>  \tint socknum, *socklist;\n>  \n>  \tsocknum = socksetup(listen_addr, listen_port, &socklist);\n>  \tif (socknum == 0)\n> -\t\tdie(\"unable to allocate any listen sockets on host %s port %u\",\n> -\t\t    listen_addr, listen_port);\n> +\t\tdie(\"unable to allocate any listen sockets on port %u\",\n> +\t\t    listen_port);\n\nThe old code accepted only one --listen, so it was clear when no socket\ncan be prepared for a given name (which may expand to multiple addresses),\nit is clear what failed (i.e. the failing input could have been only _one_\nfrom the user's point of view).  This check diagnoses the case where\nsocket preparation failed for all names.  Don't we want to have a new\ncheck inside the iteration over names in socksetup() to warn when socket\npreparation for all addresses for a name fails?\n\nAlso doesn't setup_named_sock() as refactored die() when one of the names\ngiven to --listen results no socket under ipv6 build but keeps going under\nnoipv6 build?  Without multi-listen, the distinction did not matter\nexactly because it took only one name, but your multi-listen addition\nexposes this inconsistency.  I think the helper should be modified not to\ndie but just return \"I didn't prepare any socket for the given name\", to\nallow the outer loop to continue on to the next name (perhaps while\nissuing a warning e.g. \"No listening socket resulted for '%s'\".\n"},{"id":"149301","messageId":"1283167851-18331-1-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":"7vwrr8ftjj.fsf@alter.siamese.dyndns.org","subject":"daemon: allow more than one host address given via --listen","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-30T11:30:49Z","receivedAt":"2010-08-30T11:30:49Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"\nHi,\nhere is a new version of the two patches. The sockets are now in a\nsocketlist structure that is compatible with ALLOC_GROW().\nAlso if no socket could be created for one host/ip, git daemon prints\nnow an error but continues (in both ipv6 and noipv6 builds). Only if\nno socket could be created at all, it will die.\n\nAlso I removed the string_list_clear (it leave back memory leaks form\nthe xstrdup'ed-strings). It would be happen just before the exit of the\napplication and just before the operating system cleans the memory. So\nI hope, that it is okay to remove it. If not i will change it, to\nreally free all lists before exit.\n\nThanks\nAlex\n"},{"id":"149304","messageId":"1283167851-18331-2-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":"7vwrr8ftjj.fsf@alter.siamese.dyndns.org","subject":"[PATCHv4 1/2] daemon: add helper function named_sock_setup","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-30T11:30:50Z","receivedAt":"2010-08-30T11:30:50Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"Add named_sock_setup as helper function for socksetup to make it\neasier to create more than one listen sockets. named_sock_setup could\nbe called more than one time and add the new sockets to the supplied\nsocklist_p.\n\nSigned-off-by: Alexander Sulfrian <alexander@sulfrian.net>\n---\n daemon.c |   53 +++++++++++++++++++++++++++++++++--------------------\n 1 files changed, 33 insertions(+), 20 deletions(-)\n\ndiff --git a/daemon.c b/daemon.c\nindex e22a2b7..c666ced 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -734,11 +734,17 @@ static int set_reuse_addr(int sockfd)\n \t\t\t  &on, sizeof(on));\n }\n \n+struct socketlist {\n+\tint *list;\n+\tsize_t nr;\n+\tsize_t alloc;\n+};\n+\n #ifndef NO_IPV6\n \n-static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+static int setup_named_sock(char *listen_addr, int listen_port, struct socketlist *socklist)\n {\n-\tint socknum = 0, *socklist = NULL;\n+\tint socknum = 0;\n \tint maxfd = -1;\n \tchar pbuf[NI_MAXSERV];\n \tstruct addrinfo hints, *ai0, *ai;\n@@ -753,8 +759,10 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \thints.ai_flags = AI_PASSIVE;\n \n \tgai = getaddrinfo(listen_addr, pbuf, &hints, &ai0);\n-\tif (gai)\n-\t\tdie(\"getaddrinfo() failed: %s\", gai_strerror(gai));\n+\tif (gai) {\n+\t\tlogerror(\"getaddrinfo() for %s failed: %s\", listen_addr, gai_strerror(gai));\n+\t\treturn 0;\n+\t}\n \n \tfor (ai = ai0; ai; ai = ai->ai_next) {\n \t\tint sockfd;\n@@ -795,8 +803,9 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \t\tif (flags >= 0)\n \t\t\tfcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);\n \n-\t\tsocklist = xrealloc(socklist, sizeof(int) * (socknum + 1));\n-\t\tsocklist[socknum++] = sockfd;\n+\t\tALLOC_GROW(socklist->list, socklist->nr + 1, socklist->alloc);\n+\t\tsocklist->list[socklist->nr++] = sockfd;\n+\t\tsocknum++;\n \n \t\tif (maxfd < sockfd)\n \t\t\tmaxfd = sockfd;\n@@ -804,13 +813,12 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \n \tfreeaddrinfo(ai0);\n \n-\t*socklist_p = socklist;\n \treturn socknum;\n }\n \n #else /* NO_IPV6 */\n \n-static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n+static int setup_named_sock(char *listen_addr, int listen_port, struct socketlist *socklist)\n {\n \tstruct sockaddr_in sin;\n \tint sockfd;\n@@ -851,22 +859,27 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n \tif (flags >= 0)\n \t\tfcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);\n \n-\t*socklist_p = xmalloc(sizeof(int));\n-\t**socklist_p = sockfd;\n+\tALLOC_GROW(socklist->list, socklist->nr + 1, socklist->alloc);\n+\tsocklist->list[socklist->nr++] = sockfd;\n \treturn 1;\n }\n \n #endif\n \n-static int service_loop(int socknum, int *socklist)\n+static void socksetup(char *listen_addr, int listen_port, struct socketlist *socklist)\n+{\n+\tsetup_named_sock(listen_addr, listen_port, socklist);\n+}\n+\n+static int service_loop(struct socketlist *socklist)\n {\n \tstruct pollfd *pfd;\n \tint i;\n \n-\tpfd = xcalloc(socknum, sizeof(struct pollfd));\n+\tpfd = xcalloc(socklist->nr, sizeof(struct pollfd));\n \n-\tfor (i = 0; i < socknum; i++) {\n-\t\tpfd[i].fd = socklist[i];\n+\tfor (i = 0; i < socklist->nr; i++) {\n+\t\tpfd[i].fd = socklist->list[i];\n \t\tpfd[i].events = POLLIN;\n \t}\n \n@@ -877,7 +890,7 @@ static int service_loop(int socknum, int *socklist)\n \n \t\tcheck_dead_children();\n \n-\t\tif (poll(pfd, socknum, -1) < 0) {\n+\t\tif (poll(pfd, socklist->nr, -1) < 0) {\n \t\t\tif (errno != EINTR) {\n \t\t\t\tlogerror(\"Poll failed, resuming: %s\",\n \t\t\t\t      strerror(errno));\n@@ -886,7 +899,7 @@ static int service_loop(int socknum, int *socklist)\n \t\t\tcontinue;\n \t\t}\n \n-\t\tfor (i = 0; i < socknum; i++) {\n+\t\tfor (i = 0; i < socklist->nr; 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@@ -948,10 +961,10 @@ static void store_pid(const char *path)\n \n static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n {\n-\tint socknum, *socklist;\n+\tstruct socketlist socklist = { NULL, 0, 0 };\n \n-\tsocknum = socksetup(listen_addr, listen_port, &socklist);\n-\tif (socknum == 0)\n+\tsocksetup(listen_addr, listen_port, &socklist);\n+\tif (socklist.nr == 0)\n \t\tdie(\"unable to allocate any listen sockets on host %s port %u\",\n \t\t    listen_addr, listen_port);\n \n@@ -960,7 +973,7 @@ static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t\n \t     setuid(pass->pw_uid)))\n \t\tdie(\"cannot drop privileges\");\n \n-\treturn service_loop(socknum, socklist);\n+\treturn service_loop(&socklist);\n }\n \n int main(int argc, char **argv)\n-- \n1.7.1\n"},{"id":"149303","messageId":"1283167851-18331-3-git-send-email-alexander@sulfrian.net","threadId":"24836","inReplyTo":"7vwrr8ftjj.fsf@alter.siamese.dyndns.org","subject":"[PATCHv4 2/2] daemon: allow more than one host address given via --listen","fromName":"Alexander Sulfrian","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-30T11:30:51Z","receivedAt":"2010-08-30T11:30:51Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"When the host has more than one interfaces, daemon can listen to all\nof them by not giving any --listen option, or listen to only one.\nTeach it to accept more than one --listen options.\n\nRemove the hostname information form the die, if no socket could be\ncreated. It would only trigger when no interface out of either all\ninterface or the ones specified on the command line with --listen\noptions, can be listened to and so the user does know which \"host\" was\nasked.\n\nSigned-off-by: Alexander Sulfrian <alexander@sulfrian.net>\n---\n Documentation/git-daemon.txt |    1 +\n daemon.c                     |   31 ++++++++++++++++++++++---------\n 2 files changed, 23 insertions(+), 9 deletions(-)\n\ndiff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.txt\nindex 01c9f8e..4afd0a4 100644\n--- a/Documentation/git-daemon.txt\n+++ b/Documentation/git-daemon.txt\n@@ -85,6 +85,7 @@ OPTIONS\n \tbe either an IPv4 address or an IPv6 address if supported.  If IPv6\n \tis not supported, then --listen=hostname is also not supported and\n \t--listen must be given an IPv4 address.\n+\tCan be given more than one time.\n \tIncompatible with '--inetd' option.\n \n --port=n::\ndiff --git a/daemon.c b/daemon.c\nindex c666ced..d6e20c6 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -3,6 +3,7 @@\n #include \"exec_cmd.h\"\n #include \"run-command.h\"\n #include \"strbuf.h\"\n+#include \"string-list.h\"\n \n #include <syslog.h>\n \n@@ -866,9 +867,21 @@ static int setup_named_sock(char *listen_addr, int listen_port, struct socketlis\n \n #endif\n \n-static void socksetup(char *listen_addr, int listen_port, struct socketlist *socklist)\n+static void socksetup(struct string_list *listen_addr, int listen_port, struct socketlist *socklist)\n {\n-\tsetup_named_sock(listen_addr, listen_port, socklist);\n+\tif (!listen_addr->nr)\n+\t\tsetup_named_sock(NULL, listen_port, socklist);\n+\telse {\n+\t\tint i, socknum;\n+\t\tfor (i = 0; i < listen_addr->nr; i++) {\n+\t\t\tsocknum = setup_named_sock(listen_addr->items[i].string,\n+\t\t\t\t\t\t   listen_port, socklist);\n+\n+\t\t\tif (socknum == 0)\n+\t\t\t\tlogerror(\"unable to allocate any listen sockets for host %s on port %u\",\n+\t\t\t\t\t listen_addr->items[i].string, listen_port);\n+\t\t}\n+\t}\n }\n \n static int service_loop(struct socketlist *socklist)\n@@ -959,14 +972,14 @@ static void store_pid(const char *path)\n \t\tdie_errno(\"failed to write pid file '%s'\", path);\n }\n \n-static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n+static int serve(struct string_list *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n {\n \tstruct socketlist socklist = { NULL, 0, 0 };\n \n \tsocksetup(listen_addr, listen_port, &socklist);\n \tif (socklist.nr == 0)\n-\t\tdie(\"unable to allocate any listen sockets on host %s port %u\",\n-\t\t    listen_addr, listen_port);\n+\t\tdie(\"unable to allocate any listen sockets on port %u\",\n+\t\t    listen_port);\n \n \tif (pass && gid &&\n \t    (initgroups(pass->pw_name, gid) || setgid (gid) ||\n@@ -979,7 +992,7 @@ static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t\n int main(int argc, char **argv)\n {\n \tint listen_port = 0;\n-\tchar *listen_addr = NULL;\n+\tstruct string_list listen_addr = STRING_LIST_INIT_NODUP;\n \tint inetd_mode = 0;\n \tconst char *pid_file = NULL, *user_name = NULL, *group_name = NULL;\n \tint detach = 0;\n@@ -994,7 +1007,7 @@ int main(int argc, char **argv)\n \t\tchar *arg = argv[i];\n \n \t\tif (!prefixcmp(arg, \"--listen=\")) {\n-\t\t\tlisten_addr = xstrdup_tolower(arg + 9);\n+\t\t\tstring_list_append(&listen_addr, xstrdup_tolower(arg + 9));\n \t\t\tcontinue;\n \t\t}\n \t\tif (!prefixcmp(arg, \"--port=\")) {\n@@ -1119,7 +1132,7 @@ int main(int argc, char **argv)\n \tif (inetd_mode && (group_name || user_name))\n \t\tdie(\"--user and --group are incompatible with --inetd\");\n \n-\tif (inetd_mode && (listen_port || listen_addr))\n+\tif (inetd_mode && (listen_port || (listen_addr.nr > 0)))\n \t\tdie(\"--listen= and --port= are incompatible with --inetd\");\n \telse if (listen_port == 0)\n \t\tlisten_port = DEFAULT_GIT_PORT;\n@@ -1174,5 +1187,5 @@ int main(int argc, char **argv)\n \tif (pid_file)\n \t\tstore_pid(pid_file);\n \n-\treturn serve(listen_addr, listen_port, pass, gid);\n+\treturn serve(&listen_addr, listen_port, pass, gid);\n }\n-- \n1.7.1\n"},{"id":"149307","messageId":"AANLkTindaa-wDkOMW=BgtNJ+Wmi3xaBo1o_CF7NFH=Qm@mail.gmail.com","threadId":"24836","inReplyTo":"1283167851-18331-2-git-send-email-alexander@sulfrian.net","subject":"Re: [PATCHv4 1/2] daemon: add helper function named_sock_setup","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@gmail.com","sentAt":"2010-08-30T12:12:52Z","receivedAt":"2010-08-30T12:12:52Z","isPatch":false,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"On Mon, Aug 30, 2010 at 1:30 PM, Alexander Sulfrian\n<alexander@sulfrian.net> wrote:\n> Add named_sock_setup as helper function for socksetup to make it\n> easier to create more than one listen sockets. named_sock_setup could\n> be called more than one time and add the new sockets to the supplied\n> socklist_p.\n>\n> Signed-off-by: Alexander Sulfrian <alexander@sulfrian.net>\n> ---\n>  daemon.c |   53 +++++++++++++++++++++++++++++++++--------------------\n>  1 files changed, 33 insertions(+), 20 deletions(-)\n>\n> diff --git a/daemon.c b/daemon.c\n> index e22a2b7..c666ced 100644\n> --- a/daemon.c\n> +++ b/daemon.c\n> @@ -734,11 +734,17 @@ static int set_reuse_addr(int sockfd)\n>                          &on, sizeof(on));\n>  }\n>\n> +struct socketlist {\n> +       int *list;\n> +       size_t nr;\n> +       size_t alloc;\n> +};\n> +\n>  #ifndef NO_IPV6\n>\n> -static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n> +static int setup_named_sock(char *listen_addr, int listen_port, struct socketlist *socklist)\n>  {\n> -       int socknum = 0, *socklist = NULL;\n> +       int socknum = 0;\n>        int maxfd = -1;\n>        char pbuf[NI_MAXSERV];\n>        struct addrinfo hints, *ai0, *ai;\n> @@ -753,8 +759,10 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n>        hints.ai_flags = AI_PASSIVE;\n>\n>        gai = getaddrinfo(listen_addr, pbuf, &hints, &ai0);\n> -       if (gai)\n> -               die(\"getaddrinfo() failed: %s\", gai_strerror(gai));\n> +       if (gai) {\n> +               logerror(\"getaddrinfo() for %s failed: %s\", listen_addr, gai_strerror(gai));\n> +               return 0;\n> +       }\n>\n>        for (ai = ai0; ai; ai = ai->ai_next) {\n>                int sockfd;\n> @@ -795,8 +803,9 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n>                if (flags >= 0)\n>                        fcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);\n>\n> -               socklist = xrealloc(socklist, sizeof(int) * (socknum + 1));\n> -               socklist[socknum++] = sockfd;\n> +               ALLOC_GROW(socklist->list, socklist->nr + 1, socklist->alloc);\n> +               socklist->list[socklist->nr++] = sockfd;\n> +               socknum++;\n>\n>                if (maxfd < sockfd)\n>                        maxfd = sockfd;\n> @@ -804,13 +813,12 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n>\n>        freeaddrinfo(ai0);\n>\n> -       *socklist_p = socklist;\n>        return socknum;\n>  }\n>\n>  #else /* NO_IPV6 */\n>\n> -static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n> +static int setup_named_sock(char *listen_addr, int listen_port, struct socketlist *socklist)\n>  {\n>        struct sockaddr_in sin;\n>        int sockfd;\n> @@ -851,22 +859,27 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)\n>        if (flags >= 0)\n>                fcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);\n>\n> -       *socklist_p = xmalloc(sizeof(int));\n> -       **socklist_p = sockfd;\n> +       ALLOC_GROW(socklist->list, socklist->nr + 1, socklist->alloc);\n> +       socklist->list[socklist->nr++] = sockfd;\n>        return 1;\n>  }\n>\n>  #endif\n>\n> -static int service_loop(int socknum, int *socklist)\n> +static void socksetup(char *listen_addr, int listen_port, struct socketlist *socklist)\n> +{\n> +       setup_named_sock(listen_addr, listen_port, socklist);\n> +}\n> +\n> +static int service_loop(struct socketlist *socklist)\n>  {\n>        struct pollfd *pfd;\n>        int i;\n>\n> -       pfd = xcalloc(socknum, sizeof(struct pollfd));\n> +       pfd = xcalloc(socklist->nr, sizeof(struct pollfd));\n>\n> -       for (i = 0; i < socknum; i++) {\n> -               pfd[i].fd = socklist[i];\n> +       for (i = 0; i < socklist->nr; i++) {\n> +               pfd[i].fd = socklist->list[i];\n>                pfd[i].events = POLLIN;\n>        }\n>\n> @@ -877,7 +890,7 @@ static int service_loop(int socknum, int *socklist)\n>\n>                check_dead_children();\n>\n> -               if (poll(pfd, socknum, -1) < 0) {\n> +               if (poll(pfd, socklist->nr, -1) < 0) {\n>                        if (errno != EINTR) {\n>                                logerror(\"Poll failed, resuming: %s\",\n>                                      strerror(errno));\n> @@ -886,7 +899,7 @@ static int service_loop(int socknum, int *socklist)\n>                        continue;\n>                }\n>\n> -               for (i = 0; i < socknum; i++) {\n> +               for (i = 0; i < socklist->nr; i++) {\n>                        if (pfd[i].revents & POLLIN) {\n>                                struct sockaddr_storage ss;\n>                                unsigned int sslen = sizeof(ss);\n> @@ -948,10 +961,10 @@ static void store_pid(const char *path)\n>\n>  static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t gid)\n>  {\n> -       int socknum, *socklist;\n> +       struct socketlist socklist = { NULL, 0, 0 };\n>\n\nSince serve() isn't a library function, wouldn't it reduce needless\ncode churn to just make socklist a set of global variables (or just a\nglobal struct)? That way you don't have to pass it around, changing\nall those function prototypes.\n\nI'm a bit intimidated by this change since I have a rather big\npatch-set on top of daemon.c, and I really don't want to resolve a lot\nof conflicts. But I guess that's my problem :P\n"},{"id":"149309","messageId":"20100830144631.23d1a164@laptop.localhost","threadId":"24836","inReplyTo":"AANLkTindaa-wDkOMW=BgtNJ+Wmi3xaBo1o_CF7NFH=Qm@mail.gmail.com","subject":"Re: [PATCHv4 1/2] daemon: add helper function named_sock_setup","fromName":"AlexanderS","fromEmail":"alexander@sulfrian.net","sentAt":"2010-08-30T12:46:31Z","receivedAt":"2010-08-30T12:46:31Z","isPatch":false,"sender":{"key":"alexander@sulfrian.net","avatar":"https://avatars.githubusercontent.com/u/149450?v=4"},"body":"On Mon, 30 Aug 2010 14:12:52 +0200\nErik Faye-Lund <kusmabite@gmail.com> wrote:\n\n> Since serve() isn't a library function, wouldn't it reduce needless\n> code churn to just make socklist a set of global variables (or just a\n> global struct)? That way you don't have to pass it around, changing\n> all those function prototypes.\n\nI don't understand: Even if I make socklist a global structure or\nsomething like that, I also have to change all this function prototypes\nto remove at least the old unused parameters.\n\n> I'm a bit intimidated by this change since I have a rather big\n> patch-set on top of daemon.c, and I really don't want to resolve a lot\n> of conflicts. But I guess that's my problem :P\n"},{"id":"149310","messageId":"AANLkTinE2aqRqTLvmxFEuDLd1WBCOzr0GfP64DjPsdPL@mail.gmail.com","threadId":"24836","inReplyTo":"20100830144631.23d1a164@laptop.localhost","subject":"Re: [PATCHv4 1/2] daemon: add helper function named_sock_setup","fromName":"Erik Faye-Lund","fromEmail":"kusmabite@gmail.com","sentAt":"2010-08-30T12:58:02Z","receivedAt":"2010-08-30T12:58:02Z","isPatch":false,"sender":{"key":"kusmabite@gmail.com","avatar":"https://avatars.githubusercontent.com/u/47073?v=4"},"body":"On Mon, Aug 30, 2010 at 2:46 PM, AlexanderS <alexander@sulfrian.net> wrote:\n> On Mon, 30 Aug 2010 14:12:52 +0200\n> Erik Faye-Lund <kusmabite@gmail.com> wrote:\n>\n>> Since serve() isn't a library function, wouldn't it reduce needless\n>> code churn to just make socklist a set of global variables (or just a\n>> global struct)? That way you don't have to pass it around, changing\n>> all those function prototypes.\n>\n> I don't understand: Even if I make socklist a global structure or\n> something like that, I also have to change all this function prototypes\n> to remove at least the old unused parameters.\n>\n\nYou are of course right, strike my comment :)\n"}]}