1 /*
2 * Copyright (c) 1980, 1987, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char copyright[] =
10 "@(#) Copyright (c) 1980, 1987, 1993\n\
11 The Regents of the University of California. All rights reserved.\n";
12 #endif /* not lint */
13
14 #ifndef lint
15 static char sccsid[] = "@(#)users.c 8.1 (Berkeley) 06/06/93";
16 #endif /* not lint */
17
18 #include <sys/types.h>
19 #include <utmp.h>
20 #include <stdio.h>
21
22 #define MAXUSERS 200
23
main(argc,argv)24 main(argc, argv)
25 int argc;
26 char **argv;
27 {
28 extern int optind;
29 register int cnt, ncnt;
30 struct utmp utmp;
31 char names[MAXUSERS][UT_NAMESIZE];
32 int ch, scmp();
33
34 while ((ch = getopt(argc, argv, "")) != EOF)
35 switch(ch) {
36 case '?':
37 default:
38 (void)fprintf(stderr, "usage: users\n");
39 exit(1);
40 }
41 argc -= optind;
42 argv += optind;
43
44 if (!freopen(_PATH_UTMP, "r", stdin)) {
45 (void)fprintf(stderr, "users: can't open %s.\n", _PATH_UTMP);
46 exit(1);
47 }
48 for (ncnt = 0;
49 fread((char *)&utmp, sizeof(utmp), 1, stdin) == 1;)
50 if (*utmp.ut_name) {
51 if (ncnt == MAXUSERS) {
52 (void)fprintf(stderr,
53 "users: too many users.\n");
54 break;
55 }
56 (void)strncpy(names[ncnt], utmp.ut_name, UT_NAMESIZE);
57 ++ncnt;
58 }
59
60 if (ncnt) {
61 qsort(names, ncnt, UT_NAMESIZE, scmp);
62 (void)printf("%.*s", UT_NAMESIZE, names[0]);
63 for (cnt = 1; cnt < ncnt; ++cnt)
64 if (strncmp(names[cnt], names[cnt - 1], UT_NAMESIZE))
65 (void)printf(" %.*s", UT_NAMESIZE, names[cnt]);
66 (void)printf("\n");
67 }
68 exit(0);
69 }
70
scmp(p,q)71 scmp(p, q)
72 char *p, *q;
73 {
74 return(strncmp(p, q, UT_NAMESIZE));
75 }
76