diff --git a/libexec/ftpd/extern.h b/libexec/ftpd/extern.h index 9e0562ef2936..3a881db4c3f5 100644 --- a/libexec/ftpd/extern.h +++ b/libexec/ftpd/extern.h @@ -34,13 +34,16 @@ * $FreeBSD$ */ +#include +#include + void blkfree __P((char **)); char **copyblk __P((char **)); void cwd __P((char *)); void delete __P((char *)); void dologout __P((int)); void fatalerror __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 *)); diff --git a/libexec/ftpd/ftpd.c b/libexec/ftpd/ftpd.c index 287436a025d2..90cd0307aa60 100644 --- a/libexec/ftpd/ftpd.c +++ b/libexec/ftpd/ftpd.c @@ -1057,7 +1057,7 @@ end_login() (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, @@ -1339,7 +1339,7 @@ pass(passwd) #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) @@ -2377,7 +2377,7 @@ dologout(status) if (logged_in) { (void) seteuid((uid_t)0); - ftpd_logwtmp(ttyline, "", ""); + ftpd_logwtmp(ttyline, "", NULL); } /* beware of flushing buffers after a SIGPIPE */ _exit(status); diff --git a/libexec/ftpd/logwtmp.c b/libexec/ftpd/logwtmp.c index 2ac57d13d270..185d92d02b72 100644 --- a/libexec/ftpd/logwtmp.c +++ b/libexec/ftpd/logwtmp.c @@ -52,6 +52,7 @@ static const char rcsid[] = #include #include #include +#include #include "extern.h" static int fd = -1; @@ -62,31 +63,18 @@ static int fd = -1; * 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;