@ -3,6 +3,7 @@
@@ -3,6 +3,7 @@
#include "exec_cmd.h"
#include "run-command.h"
#include "strbuf.h"
#include "string-list.h"
#include <syslog.h>
@ -866,9 +867,21 @@ static int setup_named_sock(char *listen_addr, int listen_port, struct socketlis
@@ -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)
@ -959,14 +972,14 @@ static void store_pid(const char *path)
@@ -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) ||
@ -979,7 +992,7 @@ static int serve(char *listen_addr, int listen_port, struct passwd *pass, gid_t
@@ -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;
@ -994,7 +1007,7 @@ int main(int argc, char **argv)
@@ -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=")) {
@ -1119,7 +1132,7 @@ int main(int argc, char **argv)
@@ -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;
@ -1174,5 +1187,5 @@ int main(int argc, char **argv)
@@ -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);
}