BSD 4_4 release
[unix-history] / usr / src / usr.bin / rwho / rwho.c
index f26cacb..ee9c76d 100644 (file)
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright (c) 1983, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n";
+#endif /* not lint */
+
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)rwho.c     4.1 82/04/02";
-#endif
+static char sccsid[] = "@(#)rwho.c     8.1 (Berkeley) 6/6/93";
+#endif /* not lint */
 
 
-#include <sys/types.h>         /* botch in ndir.h */
+#include <sys/param.h>
+#include <sys/dir.h>
+#include <sys/file.h>
+#include <protocols/rwhod.h>
 #include <stdio.h>
 #include <stdio.h>
-#include <ndir.h>
-#include <utmp.h>
-#include "rwhod.h"
 
 
-DIR    *etc;
+DIR    *dirp;
 
 struct whod wd;
 int    utmpcmp();
 #define        NUSERS  1000
 struct myutmp {
 
 struct whod wd;
 int    utmpcmp();
 #define        NUSERS  1000
 struct myutmp {
-       char    myhost[32];
+       char    myhost[MAXHOSTNAMELEN];
        int     myidle;
        int     myidle;
-       struct  utmp myutmp;
+       struct  outmp myutmp;
 } myutmp[NUSERS];
 int    nusers;
 
 #define        WHDRSIZE        (sizeof (wd) - sizeof (wd.wd_we))
 } myutmp[NUSERS];
 int    nusers;
 
 #define        WHDRSIZE        (sizeof (wd) - sizeof (wd.wd_we))
+/* 
+ * this macro should be shared with ruptime.
+ */
+#define        down(w,now)     ((now) - (w)->wd_recvtime > 11 * 60)
 
 char   *ctime(), *strcpy();
 
 char   *ctime(), *strcpy();
-int    now;
+time_t now;
 int    aflg;
 
 main(argc, argv)
        int argc;
        char **argv;
 {
 int    aflg;
 
 main(argc, argv)
        int argc;
        char **argv;
 {
+       extern char *optarg;
+       extern int optind;
+       int ch;
        struct direct *dp;
        int cc, width;
        register struct whod *w = &wd;
        register struct whoent *we;
        register struct myutmp *mp;
        int f, n, i;
        struct direct *dp;
        int cc, width;
        register struct whod *w = &wd;
        register struct whoent *we;
        register struct myutmp *mp;
        int f, n, i;
+       time_t time();
 
 
-       argc--, argv++;
-again:
-       if (argc > 0 && !strcmp(argv[0], "-a")) {
-               argc--, argv++;
-               aflg++;
-               goto again;
-       }
-       (void) time(&now);
-       if (chdir("/etc") < 0) {
-               perror("/etc");
-               exit(1);
-       }
-       etc = opendir(".");
-       if (etc == NULL) {
-               perror("/etc");
+       while ((ch = getopt(argc, argv, "a")) != EOF)
+               switch((char)ch) {
+               case 'a':
+                       aflg = 1;
+                       break;
+               case '?':
+               default:
+                       fprintf(stderr, "usage: rwho [-a]\n");
+                       exit(1);
+               }
+       if (chdir(_PATH_RWHODIR) || (dirp = opendir(".")) == NULL) {
+               perror(_PATH_RWHODIR);
                exit(1);
        }
        mp = myutmp;
                exit(1);
        }
        mp = myutmp;
-       while (dp = readdir(etc)) {
-               if (dp->d_ino == 0)
-                       continue;
-               if (strncmp(dp->d_name, "whod.", 5))
+       (void)time(&now);
+       while (dp = readdir(dirp)) {
+               if (dp->d_ino == 0 || strncmp(dp->d_name, "whod.", 5))
                        continue;
                        continue;
-               f = open(dp->d_name, 0);
+               f = open(dp->d_name, O_RDONLY);
                if (f < 0)
                        continue;
                cc = read(f, (char *)&wd, sizeof (struct whod));
                if (f < 0)
                        continue;
                cc = read(f, (char *)&wd, sizeof (struct whod));
@@ -68,7 +111,7 @@ again:
                        (void) close(f);
                        continue;
                }
                        (void) close(f);
                        continue;
                }
-               if (now - w->wd_recvtime > 5 * 60) {
+               if (down(w,now)) {
                        (void) close(f);
                        continue;
                }
                        (void) close(f);
                        continue;
                }
@@ -93,20 +136,20 @@ again:
        mp = myutmp;
        width = 0;
        for (i = 0; i < nusers; i++) {
        mp = myutmp;
        width = 0;
        for (i = 0; i < nusers; i++) {
-               int j = strlen(mp->myhost) + 1 + strlen(mp->myutmp.ut_line);
+               int j = strlen(mp->myhost) + 1 + strlen(mp->myutmp.out_line);
                if (j > width)
                        width = j;
                mp++;
        }
        mp = myutmp;
        for (i = 0; i < nusers; i++) {
                if (j > width)
                        width = j;
                mp++;
        }
        mp = myutmp;
        for (i = 0; i < nusers; i++) {
-               char buf[22];
-               sprintf(buf, "%s:%s", mp->myhost, mp->myutmp.ut_line);
+               char buf[BUFSIZ];
+               (void)sprintf(buf, "%s:%s", mp->myhost, mp->myutmp.out_line);
                printf("%-8.8s %-*s %.12s",
                printf("%-8.8s %-*s %.12s",
-                  mp->myutmp.ut_name,
+                  mp->myutmp.out_name,
                   width,
                   buf,
                   width,
                   buf,
-                  ctime((time_t *)&mp->myutmp.ut_time)+4);
+                  ctime((time_t *)&mp->myutmp.out_time)+4);
                mp->myidle /= 60;
                if (mp->myidle) {
                        if (aflg) {
                mp->myidle /= 60;
                if (mp->myidle) {
                        if (aflg) {
@@ -131,11 +174,11 @@ utmpcmp(u1, u2)
 {
        int rc;
 
 {
        int rc;
 
-       rc = strncmp(u1->myutmp.ut_name, u2->myutmp.ut_name, 8);
+       rc = strncmp(u1->myutmp.out_name, u2->myutmp.out_name, 8);
        if (rc)
                return (rc);
        rc = strncmp(u1->myhost, u2->myhost, 8);
        if (rc)
                return (rc);
        if (rc)
                return (rc);
        rc = strncmp(u1->myhost, u2->myhost, 8);
        if (rc)
                return (rc);
-       return (strncmp(u1->myutmp.ut_line, u2->myutmp.ut_line, 8));
+       return (strncmp(u1->myutmp.out_line, u2->myutmp.out_line, 8));
 }
 }