summaryrefslogtreecommitdiffstats
path: root/libexec/ftpd/logwtmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/ftpd/logwtmp.c')
-rw-r--r--libexec/ftpd/logwtmp.c56
1 files changed, 22 insertions, 34 deletions
diff --git a/libexec/ftpd/logwtmp.c b/libexec/ftpd/logwtmp.c
index 29bea5c..3d810dd 100644
--- a/libexec/ftpd/logwtmp.c
+++ b/libexec/ftpd/logwtmp.c
@@ -46,47 +46,35 @@ __FBSDID("$FreeBSD$");
#include <arpa/inet.h>
#include <sys/socket.h>
-#include <fcntl.h>
-#include <time.h>
-#include <timeconv.h>
-#include <netdb.h>
-#include <utmp.h>
-#include <unistd.h>
+#include <libutil.h>
#include <stdio.h>
#include <string.h>
-#include <libutil.h>
+#include <unistd.h>
+#include <utmpx.h>
#include "extern.h"
-static int fd = -1;
-
-/*
- * Modified version of logwtmp that holds wtmp file open
- * after first call, for use with ftp (which may chroot
- * after login, but before logout).
- */
void
-ftpd_logwtmp(line, name, addr)
- char *line, *name;
- struct sockaddr *addr;
+ftpd_logwtmp(char *id, char *user, struct sockaddr *addr)
{
- struct utmp ut;
- struct stat buf;
- char host[UT_HOSTSIZE];
+ struct utmpx ut;
- if (addr == NULL)
- host[0] = '\0';
- else
- realhostname_sa(host, sizeof(host), addr, addr->sa_len);
+ memset(&ut, 0, sizeof(ut));
- if (fd < 0 && (fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) < 0)
- return;
- if (fstat(fd, &buf) == 0) {
- (void)strncpy(ut.ut_line, line, sizeof(ut.ut_line));
- (void)strncpy(ut.ut_name, name, sizeof(ut.ut_name));
- (void)strncpy(ut.ut_host, host, sizeof(ut.ut_host));
- ut.ut_time = _time_to_time32(time(NULL));
- if (write(fd, &ut, sizeof(struct utmp)) !=
- sizeof(struct utmp))
- (void)ftruncate(fd, buf.st_size);
+ if (*user != '\0') {
+ /* Log in. */
+ ut.ut_type = USER_PROCESS;
+ (void)strncpy(ut.ut_user, user, sizeof(ut.ut_user));
+ if (addr != NULL)
+ realhostname_sa(ut.ut_host, sizeof(ut.ut_host),
+ addr, addr->sa_len);
+ } else {
+ /* Log out. */
+ ut.ut_type = DEAD_PROCESS;
}
+
+ ut.ut_pid = getpid();
+ gettimeofday(&ut.ut_tv, NULL);
+ (void)strncpy(ut.ut_id, id, sizeof(ut.ut_id));
+
+ pututxline(&ut);
}
OpenPOWER on IntegriCloud