git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] daemon: restore getpeername(0,...) use

From
Joachim Schmitz <jojo@schmitz-digital.de>
Date
Sep 8, 2012, 17:57 UTC
Message-ID
<k2g0up$28h$1@ger.gmane.org>
In-Reply-To
<1347124173-14460-2-git-send-email-jengelh@inai.de>
Jan Engelhardt wrote:
Show 73 quoted lines
> This reverts f9c87be6b42dd0f8b31a4bb8c6a44326879fdd1a, in a sense,
> because that commit broke logging of "Connection from ..." when
> git-daemon is run under xinetd.
> 
> This patch here computes the text representation of the peer and then
> copies that to environment variables such that the code in execute()
> and subfunctions can stay as-is.
> 
> Signed-off-by: Jan Engelhardt <jengelh@inai.de>
> ---
> daemon.c |   55
> +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file
> changed, 51 insertions(+), 4 deletions(-) 
> 
> diff --git a/daemon.c b/daemon.c
> index 4602b46..eaf08c2 100644
> --- a/daemon.c
> +++ b/daemon.c
> @@ -1,3 +1,4 @@
> +#include <stdbool.h>
> #include "cache.h"
> #include "pkt-line.h"
> #include "exec_cmd.h"
> @@ -1164,6 +1165,54 @@ static int serve(struct string_list
>  *listen_addr, int listen_port, return service_loop(&socklist);
> }
> 
> +static void inetd_mode_prepare(void)
> +{
> + struct sockaddr_storage ss;
> + struct sockaddr *addr = (void *)&ss;
> + socklen_t slen = sizeof(ss);
> + char addrbuf[256], portbuf[6] = "";
> +
> + if (!freopen("/dev/null", "w", stderr))
> + die_errno("failed to redirect stderr to /dev/null");
> +
> + /*
> + * Windows is said to not be able to handle this, so we will simply
> + * ignore failure here. (It only affects a log message anyway.)
> + */
> + if (getpeername(0, addr, &slen) < 0)
> + return;
> +
> + if (addr->sa_family == AF_INET) {
> + const struct sockaddr_in *sin_addr = (void *)addr;
> +
> + if (inet_ntop(addr->sa_family, &sin_addr->sin_addr,
> +       addrbuf, sizeof(addrbuf)) == NULL)
> + return;
> + snprintf(portbuf, sizeof(portbuf), "%hu",
> + ntohs(sin_addr->sin_port));
> +#ifndef NO_IPV6
> + } else if (addr->sa_family == AF_INET6) {
> + const struct sockaddr_in6 *sin6_addr = (void *)addr;
> +
> + addrbuf[0] = '[';
> + addrbuf[1] = '\0';
> + if (inet_ntop(AF_INET6, &sin6_addr->sin6_addr, addrbuf + 1,
> +       sizeof(addrbuf) - 2) == NULL)
> + return;
> + strcat(addrbuf, "]");
> +
> + snprintf(portbuf, sizeof(portbuf), "%hu",
> + ntohs(sin6_addr->sin6_port));
> +#endif
> + } else {
> + snprintf(addrbuf, sizeof(addrbuf), "<AF %d>",
> + addr->sa_family);
> + }
> + if (setenv("REMOTE_ADDR", addrbuf, true) < 0)
> + return;
> + setenv("REMOTE_PORT", portbuf, true);
setenv() is not a function available on all plattfomrs.
Bye, Jojo
Previous: Jan EngelhardtNext: Junio C Hamano
Message 3 of 16 in “Restore hostname logging in inetd mode”
  1. Jan EngelhardtSep 8, 2012
  2. daemon: restore getpeername(0,...) useJan Engelhardt, Sep 8, 2012
  3. Joachim SchmitzSep 8, 2012
  4. Junio C HamanoSep 8, 2012
  5. Joachim SchmitzSep 8, 2012
  6. Junio C HamanoSep 8, 2012
  7. Jan EngelhardtSep 8, 2012
  8. Jeff KingSep 10, 2012
  9. Joachim SchmitzSep 10, 2012
  10. Jeff KingSep 10, 2012
  11. Joachim SchmitzSep 10, 2012
  12. Jeff KingSep 10, 2012
  13. Joachim SchmitzSep 10, 2012
  14. Jeff KingSep 10, 2012
  15. Junio C HamanoSep 8, 2012
  16. Jan EngelhardtSep 8, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.