1 /*
2 * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
3 */
4
5 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
6 /* All Rights Reserved */
7
8 /*
9 * Copyright (c) 1980 Regents of the University of California.
10 * All rights reserved. The Berkeley software License Agreement
11 * specifies the terms and conditions for redistribution.
12 */
13
14 /*
15 * users
16 */
17
18 #include <stdio.h>
19 #include <sys/types.h>
20 #include <stdlib.h>
21 #include <utmpx.h>
22 #include <string.h>
23
24 static char **names;
25 static char **namp;
26
27 static int scmp(const void *p, const void *q);
28 static void summary(void);
29
30 int
main(int argc,char ** argv)31 main(int argc, char **argv)
32 {
33 int nusers = 0;
34 int bufflen = BUFSIZ;
35 struct utmpx *utmpx;
36
37 if (argc == 2)
38 if (!utmpxname(argv[1])) {
39 (void) fprintf(stderr, "Filename is too long\n");
40 exit(1);
41 }
42
43 names = namp = (char **)realloc((void *)NULL, BUFSIZ * sizeof (char *));
44
45 setutxent();
46
47 while ((utmpx = getutxent()) != NULL) {
48 if (utmpx->ut_name[0] == '\0')
49 continue;
50 if (utmpx->ut_type != USER_PROCESS)
51 continue;
52 if (nonuserx(*utmpx))
53 continue;
54 if (nusers == bufflen) {
55 bufflen *= 2;
56 names = (char **)realloc(names,
57 bufflen * sizeof (char *));
58 namp = names + nusers;
59 }
60 *namp++ = strndup(utmpx->ut_name, sizeof (utmpx->ut_name));
61 nusers++;
62 }
63
64 endutxent();
65
66 summary();
67 return (0);
68 }
69
70 static int
scmp(const void * p,const void * q)71 scmp(const void *p, const void *q)
72 {
73 return (strcmp((char *)p, (char *)q));
74 }
75
76 static void
summary(void)77 summary(void)
78 {
79 register char **p;
80
81 qsort(names, namp - names, sizeof (names[0]), scmp);
82 for (p = names; p < namp; p++) {
83 if (p != names)
84 (void) putchar(' ');
85 (void) fputs(*p, stdout);
86 }
87 if (namp != names) /* at least one user */
88 (void) putchar('\n');
89 }
90