break out special local mail processing (e.g., mapping to the
[unix-history] / usr / src / usr.bin / users / users.c
index 5ebdb6f..bc4f6b5 100644 (file)
@@ -1,79 +1,75 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * Copyright (c) 1980, 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * %sccs.include.redist.c%
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1980 Regents of the University of California.\n\
- All rights reserved.\n";
-#endif not lint
+static char copyright[] =
+"@(#) Copyright (c) 1980, 1987, 1993\n\
      The Regents of the University of California.  All rights reserved.\n";
+#endif /* not lint */
 
 #ifndef lint
 
 #ifndef lint
-static char sccsid[] = "@(#)users.c    5.2 (Berkeley) %G%";
-#endif not lint
+static char sccsid[] = "@(#)users.c    8.1 (Berkeley) %G%";
+#endif /* not lint */
 
 
-/*
- * users
- */
-char   *malloc();
-
-#include <stdio.h>
+#include <sys/types.h>
 #include <utmp.h>
 #include <utmp.h>
+#include <stdio.h>
 
 
-#define NMAX sizeof(utmp.ut_name)
-#define LMAX sizeof(utmp.ut_line)
-
-struct utmp utmp;
+#define        MAXUSERS        200
 
 main(argc, argv)
 
 main(argc, argv)
-char **argv;
+       int argc;
+       char **argv;
 {
 {
-       register char *tp, *s;
-       register FILE *fi;
+       extern int optind;
+       register int cnt, ncnt;
+       struct utmp utmp;
+       char names[MAXUSERS][UT_NAMESIZE];
+       int ch, scmp();
 
 
-       s = "/etc/utmp";
-       if(argc == 2)
-               s = argv[1];
-       if ((fi = fopen(s, "r")) == NULL) {
-               perror(s);
+       while ((ch = getopt(argc, argv, "")) != EOF)
+               switch(ch) {
+               case '?':
+               default:
+                       (void)fprintf(stderr, "usage: users\n");
+                       exit(1);
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (!freopen(_PATH_UTMP, "r", stdin)) {
+               (void)fprintf(stderr, "users: can't open %s.\n", _PATH_UTMP);
                exit(1);
        }
                exit(1);
        }
-       while (fread((char *)&utmp, sizeof(utmp), 1, fi) == 1) {
-               if(utmp.ut_name[0] == '\0')
-                       continue;
-               putline();
-       }
-       summary();
-}
+       for (ncnt = 0;
+           fread((char *)&utmp, sizeof(utmp), 1, stdin) == 1;)
+               if (*utmp.ut_name) {
+                       if (ncnt == MAXUSERS) {
+                               (void)fprintf(stderr,
+                                   "users: too many users.\n");
+                               break;
+                       }
+                       (void)strncpy(names[ncnt], utmp.ut_name, UT_NAMESIZE);
+                       ++ncnt;
+               }
 
 
-char   *names[128];
-char   **namp = names;
-putline()
-{
-       char temp[NMAX+1];
-       strncpy(temp, utmp.ut_name, NMAX);
-       temp[NMAX] = 0;
-       *namp = malloc(strlen(temp) + 1);
-       strcpy(*namp++, temp);
+       if (ncnt) {
+               qsort(names, ncnt, UT_NAMESIZE, scmp);
+               (void)printf("%.*s", UT_NAMESIZE, names[0]);
+               for (cnt = 1; cnt < ncnt; ++cnt)
+                       if (strncmp(names[cnt], names[cnt - 1], UT_NAMESIZE))
+                               (void)printf(" %.*s", UT_NAMESIZE, names[cnt]);
+               (void)printf("\n");
+       }
+       exit(0);
 }
 
 scmp(p, q)
 }
 
 scmp(p, q)
-char **p, **q;
+       char *p, *q;
 {
 {
-       return(strcmp(*p, *q));
-}
-summary()
-{
-       register char **p;
-
-       qsort(names, namp - names, sizeof names[0], scmp);
-       for (p=names; p < namp; p++) {
-               if (p != names)
-                       putchar(' ');
-               fputs(*p, stdout);
-       }
-       if (namp != names)              /* at least one user */
-               putchar('\n');
+       return(strncmp(p, q, UT_NAMESIZE));
 }
 }