1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <utmp.h>
void updwtmp(const char *wtmp_file, const struct utmp *ut) {
int fd = open(wtmp_file, O_WRONLY|O_APPEND);
if (fd<0) return;
fcntl (fd, F_SETFD, FD_CLOEXEC);
write(fd, ut, sizeof(struct utmp));
close(fd);
}
void logwtmp(const char *line, const char *name, const char *host) {
struct utmp ut;
memset(&ut, 0, sizeof(struct utmp));
ut.ut_pid = getpid ();
ut.ut_type = name[0] ? USER_PROCESS : DEAD_PROCESS;
memccpy (ut.ut_line, line, 0, sizeof ut.ut_line);
memccpy (ut.ut_name, name, 0, sizeof ut.ut_name);
memccpy (ut.ut_host, host, 0, sizeof ut.ut_host);
gettimeofday (&ut.ut_tv, NULL);
updwtmp (_PATH_WTMP, &ut);
}
|