Skip to content

Commit 5b276ee

Browse files
dwmw2Junio C Hamano
authored andcommitted
Log peer address when git-daemon called from inetd
When we run git-daemon from inetd, even with the --verbose option, it doesn't log the peer address. That logic was only in the standalone daemon code -- move it to the execute() function instead. Tested with both IPv6 and Legacy IP clients, in both inetd and daemon mode. Signed-off-by: David Woodhouse <dwmw2@infradead.org> Acked-by: Jon Loeliger <jdl@jdl.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent c07eee1 commit 5b276ee

File tree

1 file changed

+34
-24
lines changed

1 file changed

+34
-24
lines changed

daemon.c

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -264,11 +264,34 @@ static int upload(char *dir)
264264
return -1;
265265
}
266266

267-
static int execute(void)
267+
static int execute(struct sockaddr *addr)
268268
{
269269
static char line[1000];
270270
int pktlen, len;
271271

272+
if (addr) {
273+
char addrbuf[256] = "";
274+
int port = -1;
275+
276+
if (addr->sa_family == AF_INET) {
277+
struct sockaddr_in *sin_addr = (void *) addr;
278+
inet_ntop(addr->sa_family, &sin_addr->sin_addr, addrbuf, sizeof(addrbuf));
279+
port = sin_addr->sin_port;
280+
#ifndef NO_IPV6
281+
} else if (addr && addr->sa_family == AF_INET6) {
282+
struct sockaddr_in6 *sin6_addr = (void *) addr;
283+
284+
char *buf = addrbuf;
285+
*buf++ = '['; *buf = '\0'; /* stpcpy() is cool */
286+
inet_ntop(AF_INET6, &sin6_addr->sin6_addr, buf, sizeof(addrbuf) - 1);
287+
strcat(buf, "]");
288+
289+
port = sin6_addr->sin6_port;
290+
#endif
291+
}
292+
loginfo("Connection from %s:%d", addrbuf, port);
293+
}
294+
272295
alarm(init_timeout ? init_timeout : timeout);
273296
pktlen = packet_read_line(0, line, sizeof(line));
274297
alarm(0);
@@ -414,8 +437,6 @@ static void check_max_connections(void)
414437
static void handle(int incoming, struct sockaddr *addr, int addrlen)
415438
{
416439
pid_t pid = fork();
417-
char addrbuf[256] = "";
418-
int port = -1;
419440

420441
if (pid) {
421442
unsigned idx;
@@ -436,26 +457,7 @@ static void handle(int incoming, struct sockaddr *addr, int addrlen)
436457
dup2(incoming, 1);
437458
close(incoming);
438459

439-
if (addr->sa_family == AF_INET) {
440-
struct sockaddr_in *sin_addr = (void *) addr;
441-
inet_ntop(AF_INET, &sin_addr->sin_addr, addrbuf, sizeof(addrbuf));
442-
port = sin_addr->sin_port;
443-
444-
#ifndef NO_IPV6
445-
} else if (addr->sa_family == AF_INET6) {
446-
struct sockaddr_in6 *sin6_addr = (void *) addr;
447-
448-
char *buf = addrbuf;
449-
*buf++ = '['; *buf = '\0'; /* stpcpy() is cool */
450-
inet_ntop(AF_INET6, &sin6_addr->sin6_addr, buf, sizeof(addrbuf) - 1);
451-
strcat(buf, "]");
452-
453-
port = sin6_addr->sin6_port;
454-
#endif
455-
}
456-
loginfo("Connection from %s:%d", addrbuf, port);
457-
458-
exit(execute());
460+
exit(execute(addr));
459461
}
460462

461463
static void child_handler(int signo)
@@ -751,8 +753,16 @@ int main(int argc, char **argv)
751753
}
752754

753755
if (inetd_mode) {
756+
struct sockaddr_storage ss;
757+
struct sockaddr *peer = (struct sockaddr *)&ss;
758+
socklen_t slen = sizeof(ss);
759+
754760
fclose(stderr); //FIXME: workaround
755-
return execute();
761+
762+
if (getpeername(0, peer, &slen))
763+
peer = NULL;
764+
765+
return execute(peer);
756766
}
757767

758768
return serve(port);

0 commit comments

Comments
 (0)