|
|
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.