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