|
|
1.1 root 1: /*
2: * Copyright (c) 1980, 1987 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: char copyright[] =
20: "@(#) Copyright (c) 1980, 1987 Regents of the University of California.\n\
21: All rights reserved.\n";
22: #endif /* not lint */
23:
24: #ifndef lint
25: static char sccsid[] = "@(#)users.c 5.6 (Berkeley) 6/29/88";
26: #endif /* not lint */
27:
28: /*
29: * users
30: */
31: #include <sys/types.h>
32: #include <utmp.h>
33: #include <stdio.h>
34:
35: #define NMAX sizeof(utmp.ut_name)
36: #define MAXUSERS 200
37: #define UTMP_FILE "/etc/utmp"
38:
39: static struct utmp utmp; /* read structure */
40: static int ncnt; /* count of names */
41: static char *names[MAXUSERS]; /* names table */
42:
43: main()
44: {
45: register FILE *fp; /* file pointer */
46:
47: if (!(fp = fopen(UTMP_FILE, "r"))) {
48: perror(UTMP_FILE);
49: exit(1);
50: }
51: while (fread((char *)&utmp, sizeof(utmp), 1, fp) == 1)
52: if (*utmp.ut_name) {
53: if (++ncnt > MAXUSERS) {
54: ncnt = MAXUSERS;
55: fputs("users: too many users.\n", stderr);
56: break;
57: }
58: nsave();
59: }
60: summary();
61: exit(0);
62: }
63:
64: nsave()
65: {
66: static char **namp = names; /* pointer to names table */
67: char *calloc();
68:
69: if (!(*namp = calloc((u_int)(NMAX + 1), sizeof(char)))) {
70: fputs("users: malloc error.\n", stderr);
71: exit(1);
72: }
73: bcopy(utmp.ut_name, *namp++, NMAX);
74: }
75:
76: summary()
77: {
78: register char **p;
79: int scmp();
80:
81: if (!ncnt)
82: return;
83: qsort((char *)names, ncnt, sizeof(names[0]), scmp);
84: fputs(names[0], stdout);
85: for (p = &names[1]; --ncnt; ++p) {
86: putchar(' ');
87: fputs(*p, stdout);
88: }
89: putchar('\n');
90: }
91:
92: scmp(p, q)
93: char **p, **q;
94: {
95: return(strcmp(*p, *q));
96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.