Skip to content

Commit

Permalink
daemon: allow more than one host address given via --listen
Browse files Browse the repository at this point in the history
When the host has more than one interfaces, daemon can listen to all
of them by not giving any --listen option, or listen to only one.
Teach it to accept more than one --listen options.

Remove the hostname information form the die, if no socket could be
created. It would only trigger when no interface out of either all
interface or the ones specified on the command line with --listen
options, can be listened to and so the user does know which "host" was
asked.

Signed-off-by: Alexander Sulfrian <alexander@sulfrian.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Alexander Sulfrian authored and Junio C Hamano committed Sep 28, 2010
1 parent 2caa321 commit 3a3a29c
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 9 deletions.
1 change: 1 addition & 0 deletions Documentation/git-daemon.txt
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ OPTIONS
be either an IPv4 address or an IPv6 address if supported. If IPv6
is not supported, then --listen=hostname is also not supported and
--listen must be given an IPv4 address.
Can be given more than once.
Incompatible with '--inetd' option.

--port=n::
Expand Down
31 changes: 22 additions & 9 deletions daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "exec_cmd.h"
#include "run-command.h"
#include "strbuf.h"
#include "string-list.h"

#include <syslog.h>

Expand Down Expand Up @@ -866,9 +867,21 @@ static int setup_named_sock(char *listen_addr, int listen_port, struct socketlis

#endif

static void socksetup(char *listen_addr, int listen_port, struct socketlist *socklist)
static void socksetup(struct string_list *listen_addr, int listen_port, struct socketlist *socklist)
{
setup_named_sock(listen_addr, listen_port, socklist);
if (!listen_addr->nr)
setup_named_sock(NULL, listen_port, socklist);
else {
int i, socknum;
for (i = 0; i < listen_addr->nr; i++) {
socknum = setup_named_sock(listen_addr->items[i].string,
listen_port, socklist);

if (socknum == 0)
logerror("unable to allocate any listen sockets for host %s on port %u",
listen_addr->items[i].string, listen_port);
}
}
}

static int service_loop(struct socketlist *socklist)
Expand Down Expand Up @@ -959,14 +972,14 @@ static void store_pid(const char *path)
die_errno("failed to write pid file '%s'", path);
}

static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t gid)
static int serve(struct string_list *listen_addr, int listen_port, struct passwd *pass, gid_t gid)
{
struct socketlist socklist = { NULL, 0, 0 };

socksetup(listen_addr, listen_port, &socklist);
if (socklist.nr == 0)
die("unable to allocate any listen sockets on host %s port %u",
listen_addr, listen_port);
die("unable to allocate any listen sockets on port %u",
listen_port);

if (pass && gid &&
(initgroups(pass->pw_name, gid) || setgid (gid) ||
Expand All @@ -979,7 +992,7 @@ static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t
int main(int argc, char **argv)
{
int listen_port = 0;
char *listen_addr = NULL;
struct string_list listen_addr = STRING_LIST_INIT_NODUP;
int inetd_mode = 0;
const char *pid_file = NULL, *user_name = NULL, *group_name = NULL;
int detach = 0;
Expand All @@ -994,7 +1007,7 @@ int main(int argc, char **argv)
char *arg = argv[i];

if (!prefixcmp(arg, "--listen=")) {
listen_addr = xstrdup_tolower(arg + 9);
string_list_append(&listen_addr, xstrdup_tolower(arg + 9));
continue;
}
if (!prefixcmp(arg, "--port=")) {
Expand Down Expand Up @@ -1119,7 +1132,7 @@ int main(int argc, char **argv)
if (inetd_mode && (group_name || user_name))
die("--user and --group are incompatible with --inetd");

if (inetd_mode && (listen_port || listen_addr))
if (inetd_mode && (listen_port || (listen_addr.nr > 0)))
die("--listen= and --port= are incompatible with --inetd");
else if (listen_port == 0)
listen_port = DEFAULT_GIT_PORT;
Expand Down Expand Up @@ -1174,5 +1187,5 @@ int main(int argc, char **argv)
if (pid_file)
store_pid(pid_file);

return serve(listen_addr, listen_port, pass, gid);
return serve(&listen_addr, listen_port, pass, gid);
}

0 comments on commit 3a3a29c

Please sign in to comment.