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