users.c revision 202200
11590Srgrimes/* 21590Srgrimes * Copyright (c) 1980, 1987, 1993 31590Srgrimes * The Regents of the University of California. All rights reserved. 41590Srgrimes * 51590Srgrimes * Redistribution and use in source and binary forms, with or without 61590Srgrimes * modification, are permitted provided that the following conditions 71590Srgrimes * are met: 81590Srgrimes * 1. Redistributions of source code must retain the above copyright 91590Srgrimes * notice, this list of conditions and the following disclaimer. 101590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 111590Srgrimes * notice, this list of conditions and the following disclaimer in the 121590Srgrimes * documentation and/or other materials provided with the distribution. 131590Srgrimes * 3. All advertising materials mentioning features or use of this software 141590Srgrimes * must display the following acknowledgement: 151590Srgrimes * This product includes software developed by the University of 161590Srgrimes * California, Berkeley and its contributors. 171590Srgrimes * 4. Neither the name of the University nor the names of its contributors 181590Srgrimes * may be used to endorse or promote products derived from this software 191590Srgrimes * without specific prior written permission. 201590Srgrimes * 211590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 221590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 231590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 241590Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 251590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 261590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 271590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 281590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 291590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 301590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 311590Srgrimes * SUCH DAMAGE. 321590Srgrimes */ 331590Srgrimes 341590Srgrimes#ifndef lint 3528563Scharnierstatic const char copyright[] = 361590Srgrimes"@(#) Copyright (c) 1980, 1987, 1993\n\ 371590Srgrimes The Regents of the University of California. All rights reserved.\n"; 381590Srgrimes#endif /* not lint */ 391590Srgrimes 401590Srgrimes#ifndef lint 4128563Scharnier#if 0 421590Srgrimesstatic char sccsid[] = "@(#)users.c 8.1 (Berkeley) 6/6/93"; 4328563Scharnier#endif 4428563Scharnierstatic const char rcsid[] = 4550477Speter "$FreeBSD: head/usr.bin/users/users.c 202200 2010-01-13 18:09:54Z ed $"; 461590Srgrimes#endif /* not lint */ 471590Srgrimes 48200066Sed#include <sys/param.h> 491590Srgrimes#include <sys/types.h> 5028563Scharnier#include <err.h> 5128563Scharnier#include <stdio.h> 5228563Scharnier#include <stdlib.h> 5328563Scharnier#include <string.h> 5428563Scharnier#include <unistd.h> 55202200Sed#include <utmpx.h> 561590Srgrimes 57200066Sedtypedef char namebuf[MAXLOGNAME]; 581590Srgrimes 5992922Simpint scmp(const void *, const void *); 6092922Simpstatic void usage(void); 6128563Scharnier 6228789Scharnierint 63102944Sdwmalonemain(int argc, char **argv) 641590Srgrimes{ 6528563Scharnier namebuf *names = NULL; 6628563Scharnier int ncnt = 0; 6728563Scharnier int nmax = 0; 6828563Scharnier int cnt; 69200154Sed struct utmpx *ut; 7028563Scharnier int ch; 711590Srgrimes 7224360Simp while ((ch = getopt(argc, argv, "")) != -1) 731590Srgrimes switch(ch) { 741590Srgrimes case '?': 751590Srgrimes default: 7628563Scharnier usage(); 771590Srgrimes } 781590Srgrimes argc -= optind; 791590Srgrimes argv += optind; 801590Srgrimes 81200154Sed setutxent(); 82200154Sed while ((ut = getutxent()) != NULL) { 83200067Sed if (ut->ut_type != USER_PROCESS) 84200066Sed continue; 85200066Sed if (ncnt >= nmax) { 86200066Sed nmax += 32; 87200066Sed names = realloc(names, sizeof(*names) * nmax); 88200066Sed if (!names) { 89200066Sed errx(1, "realloc"); 90200066Sed /* NOTREACHED */ 911590Srgrimes } 921590Srgrimes } 93200066Sed (void)strlcpy(names[ncnt], ut->ut_user, sizeof(*names)); 94200066Sed ++ncnt; 9528563Scharnier } 96200154Sed endutxent(); 97200066Sed if (ncnt > 0) { 98200066Sed qsort(names, ncnt, sizeof(namebuf), scmp); 99200066Sed (void)printf("%s", names[0]); 1001590Srgrimes for (cnt = 1; cnt < ncnt; ++cnt) 101200066Sed if (strcmp(names[cnt], names[cnt - 1]) != 0) 102200066Sed (void)printf(" %s", names[cnt]); 1031590Srgrimes (void)printf("\n"); 1041590Srgrimes } 1051590Srgrimes exit(0); 1061590Srgrimes} 1071590Srgrimes 10828563Scharnierstatic void 109102944Sdwmaloneusage(void) 11028563Scharnier{ 11128563Scharnier (void)fprintf(stderr, "usage: users\n"); 11228563Scharnier exit(1); 11328563Scharnier} 11428563Scharnier 11528563Scharnierint 116102944Sdwmalonescmp(const void *p, const void *q) 1171590Srgrimes{ 118200066Sed 119200066Sed return (strcmp(p, q)); 1201590Srgrimes} 121