|
|
1.1 ! root 1: static char *sccsid = "@(#)users.c 4.1 (Berkeley) 10/1/80"; ! 2: /* ! 3: * users ! 4: */ ! 5: char *malloc(); ! 6: ! 7: #include <stdio.h> ! 8: #include <utmp.h> ! 9: ! 10: #define NMAX sizeof(utmp.ut_name) ! 11: #define LMAX sizeof(utmp.ut_line) ! 12: ! 13: struct utmp utmp; ! 14: ! 15: main(argc, argv) ! 16: char **argv; ! 17: { ! 18: register char *tp, *s; ! 19: register FILE *fi; ! 20: ! 21: s = "/etc/utmp"; ! 22: if(argc == 2) ! 23: s = argv[1]; ! 24: if ((fi = fopen(s, "r")) == NULL) { ! 25: puts("who: cannot open utmp"); ! 26: exit(1); ! 27: } ! 28: while (fread((char *)&utmp, sizeof(utmp), 1, fi) == 1) { ! 29: if(utmp.ut_name[0] == '\0') ! 30: continue; ! 31: putline(); ! 32: } ! 33: summary(); ! 34: } ! 35: ! 36: char *names[128]; ! 37: char **namp = names; ! 38: putline() ! 39: { ! 40: char temp[NMAX+1]; ! 41: strncpy(temp, utmp.ut_name, NMAX); ! 42: temp[NMAX] = 0; ! 43: *namp = malloc(strlen(temp) + 1); ! 44: strcpy(*namp++, temp); ! 45: } ! 46: ! 47: scmp(p, q) ! 48: char **p, **q; ! 49: { ! 50: return(strcmp(*p, *q)); ! 51: } ! 52: summary() ! 53: { ! 54: register char **p; ! 55: ! 56: qsort(names, namp - names, sizeof names[0], scmp); ! 57: for (p=names; p < namp; p++) { ! 58: if (p != names) ! 59: printf(" "); ! 60: printf("%s", *p); ! 61: } ! 62: printf("\n"); ! 63: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.