Index: libexec/ftpd/extern.h diff -u libexec/ftpd/extern.h.orig libexec/ftpd/extern.h --- libexec/ftpd/extern.h.orig Thu Jan 27 18:28:19 2000 +++ libexec/ftpd/extern.h Mon Jan 28 23:21:26 2002 @@ -34,13 +34,16 @@ * $FreeBSD: src/libexec/ftpd/extern.h,v 1.14 2000/01/27 09:28:19 shin Exp $ */ +#include +#include + void blkfree __P((char **)); char **copyblk __P((char **)); void cwd __P((char *)); void delete __P((char *)); void dologout __P((int)); void fatal __P((char *)); -void ftpd_logwtmp __P((char *, char *, char *)); +void ftpd_logwtmp __P((char *, char *, struct sockaddr *addr)); int ftpd_pclose __P((FILE *)); FILE *ftpd_popen __P((char *, char *)); char *getline __P((char *, int, FILE *)); Index: libexec/ftpd/ftpd.c diff -u libexec/ftpd/ftpd.c.orig libexec/ftpd/ftpd.c --- libexec/ftpd/ftpd.c.orig Sat Dec 22 01:54:36 2001 +++ libexec/ftpd/ftpd.c Mon Jan 28 23:18:48 2002 @@ -1047,7 +1047,7 @@ (void) seteuid((uid_t)0); if (logged_in) - ftpd_logwtmp(ttyline, "", ""); + ftpd_logwtmp(ttyline, "", NULL); pw = NULL; #ifdef LOGIN_CAP setusercontext(NULL, getpwuid(0), (uid_t)0, @@ -1293,7 +1293,7 @@ #endif /* open wtmp before chroot */ - ftpd_logwtmp(ttyline, pw->pw_name, remotehost); + ftpd_logwtmp(ttyline, pw->pw_name, (struct sockaddr *)&his_addr); logged_in = 1; if (guest && stats && statfd < 0) @@ -2334,7 +2334,7 @@ if (logged_in) { (void) seteuid((uid_t)0); - ftpd_logwtmp(ttyline, "", ""); + ftpd_logwtmp(ttyline, "", NULL); } /* beware of flushing buffers after a SIGPIPE */ _exit(status); Index: libexec/ftpd/logwtmp.c diff -u libexec/ftpd/logwtmp.c.orig libexec/ftpd/logwtmp.c --- libexec/ftpd/logwtmp.c.orig Thu Jan 27 18:28:21 2000 +++ libexec/ftpd/logwtmp.c Mon Jan 28 23:23:48 2002 @@ -52,6 +52,7 @@ #include #include #include +#include #include "extern.h" static int fd = -1; @@ -62,31 +63,18 @@ * after login, but before logout). */ void -ftpd_logwtmp(line, name, host) - char *line, *name, *host; +ftpd_logwtmp(line, name, addr) + char *line, *name; + struct sockaddr *addr; { struct utmp ut; struct stat buf; + char host[UT_HOSTSIZE]; - if (strlen(host) > UT_HOSTSIZE) { - struct addrinfo hints, *res; - int error; - static char hostbuf[BUFSIZ]; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = PF_UNSPEC; - error = getaddrinfo(host, NULL, &hints, &res); - if (error) - host = "invalid hostname"; - else { - getnameinfo(res->ai_addr, res->ai_addrlen, - hostbuf, sizeof(hostbuf), NULL, 0, - NI_NUMERICHOST); - host = hostbuf; - if (strlen(host) > UT_HOSTSIZE) - host[UT_HOSTSIZE] = '\0'; - } - } + if (addr == NULL) + host[0] = '\0'; + else + realhostname_sa(host, sizeof(host), addr, addr->sa_len); if (fd < 0 && (fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) < 0) return;