|
|
1.1 root 1: #include <stdio.h>
2: #include <utmp.h>
3:
4: /* imported */
5: extern char *getlogin();
6: extern char *cttyname();
7: extern char *strncpy();
8: extern int strncmp();
9: extern long lseek(), time();
10:
11: /* global */
12: static struct utmp utmp;
13: static struct utmp empty;
14: static int slot;
15:
16: /* predeclared */
17: static int utmpslot();
18: static int chutmp();
19:
20: /* get the information for a utmp entry */
21: extern int
22: getutmp()
23: {
24: char *getlogin(), *cttyname();
25: char *logname, *ttyname;
26:
27: /* get tty name */
28: if ((ttyname = cttyname()) == NULL)
29: return -1;
30: strncpy (utmp.ut_line, ttyname+5, sizeof(utmp.ut_line));
31:
32: /* get user name */
33: if ((logname = getlogin()) == NULL)
34: return -1;
35: strncpy (utmp.ut_name, logname, sizeof(utmp.ut_name));
36: return 0;
37: }
38:
39: /* put the entry into utmp */
40: extern int
41: setutmp()
42: {
43: slot = ttyslot(utmp.ut_line);
44: if (slot <= 0)
45: return -1;
46: return chutmp (slot, &utmp);
47: }
48:
49: /* take the entry out of utmp */
50: extern void
51: resetutmp()
52: {
53: if (slot > 0) {
54: strncpy(utmp.ut_name, empty.ut_name, sizeof(utmp.ut_name));
55: chutmp (slot, &utmp);
56: }
57: }
58:
59: static int
60: chutmp(slot, up)
61: int slot;
62: struct utmp *up;
63: {
64: int fd;
65:
66: if ((fd = open("/etc/utmp", 2)) < 0)
67: return -1;
68: if (lseek(fd, (long)(slot*sizeof(utmp)), 0) < 0) {
69: close(fd);
70: return -1;
71: }
72: up->ut_time = time((long *)0);
73: if (write(fd, (char *)up, sizeof(struct utmp)) != sizeof(struct utmp)) {
74: close(fd);
75: return -1;
76: } else {
77: close(fd);
78: return 0;
79: }
80: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.