386BSD 0.1 development
[unix-history] / usr / src / usr.bin / finger / util.c
index d2cdf50..a2b6dd3 100644 (file)
@@ -5,21 +5,37 @@
  * This code is derived from software contributed to Berkeley by
  * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
  *
  * This code is derived from software contributed to Berkeley by
  * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * 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
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)util.c     5.3 (Berkeley) %G%";
+static char sccsid[] = "@(#)util.c     5.14 (Berkeley) 1/17/91";
 #endif /* not lint */
 
 #include <sys/param.h>
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -27,9 +43,9 @@ static char sccsid[] = "@(#)util.c    5.3 (Berkeley) %G%";
 #include <sys/file.h>
 #include <stdio.h>
 #include <ctype.h>
 #include <sys/file.h>
 #include <stdio.h>
 #include <ctype.h>
-#include <strings.h>
+#include <string.h>
+#include <paths.h>
 #include "finger.h"
 #include "finger.h"
-#include "pathnames.h"
 
 find_idle_and_ttywrite(w)
        register WHERE *w;
 
 find_idle_and_ttywrite(w)
        register WHERE *w;
@@ -43,7 +59,7 @@ find_idle_and_ttywrite(w)
        if (stat(tbuf, &sb) < 0) {
                (void)fprintf(stderr,
                    "finger: %s: %s\n", tbuf, strerror(errno));
        if (stat(tbuf, &sb) < 0) {
                (void)fprintf(stderr,
                    "finger: %s: %s\n", tbuf, strerror(errno));
-               exit(1);
+               return;
        }
        w->idletime = now < sb.st_atime ? 0 : now - sb.st_atime;
 
        }
        w->idletime = now < sb.st_atime ? 0 : now - sb.st_atime;
 
@@ -56,7 +72,7 @@ userinfo(pn, pw)
        register struct passwd *pw;
 {
        register char *p, *t;
        register struct passwd *pw;
 {
        register char *p, *t;
-       char name[256];
+       char *bp, name[1024];
 
        pn->realname = pn->office = pn->officephone = pn->homephone = NULL;
 
 
        pn->realname = pn->office = pn->officephone = pn->homephone = NULL;
 
@@ -66,12 +82,12 @@ userinfo(pn, pw)
        pn->shell = strdup(pw->pw_shell);
 
        /* why do we skip asterisks!?!? */
        pn->shell = strdup(pw->pw_shell);
 
        /* why do we skip asterisks!?!? */
-       (void)strcpy(p = tbuf, pw->pw_gecos);
-       if (*p == '*')
-               ++p;
+       (void)strcpy(bp = tbuf, pw->pw_gecos);
+       if (*bp == '*')
+               ++bp;
 
        /* ampersands get replaced by the login name */
 
        /* ampersands get replaced by the login name */
-       if (!(p = strsep(p, ",")))
+       if (!(p = strsep(&bp, ",")))
                return;
        for (t = name; *t = *p; ++p)
                if (*t == '&') {
                return;
        for (t = name; *t = *p; ++p)
                if (*t == '&') {
@@ -83,9 +99,12 @@ userinfo(pn, pw)
                else
                        ++t;
        pn->realname = strdup(name);
                else
                        ++t;
        pn->realname = strdup(name);
-       pn->office = (p = strsep((char *)NULL, ",")) ? strdup(p) : NULL;
-       pn->officephone = (p = strsep((char *)NULL, ",")) ? strdup(p) : NULL;
-       pn->homephone = (p = strsep((char *)NULL, ",")) ? strdup(p) : NULL;
+       pn->office = ((p = strsep(&bp, ",")) && *p) ?
+           strdup(p) : NULL;
+       pn->officephone = ((p = strsep(&bp, ",")) && *p) ?
+           strdup(p) : NULL;
+       pn->homephone = ((p = strsep(&bp, ",")) && *p) ?
+           strdup(p) : NULL;
 }
 
 match(pw, user)
 }
 
 match(pw, user)
@@ -93,7 +112,7 @@ match(pw, user)
        char *user;
 {
        register char *p, *t;
        char *user;
 {
        register char *p, *t;
-       char name[256];
+       char name[1024];
 
        /* why do we skip asterisks!?!? */
        (void)strcpy(p = tbuf, pw->pw_gecos);
 
        /* why do we skip asterisks!?!? */
        (void)strcpy(p = tbuf, pw->pw_gecos);
@@ -120,9 +139,8 @@ enter_lastlog(pn)
        register PERSON *pn;
 {
        register WHERE *w;
        register PERSON *pn;
 {
        register WHERE *w;
-       static int opened;
+       static int opened, fd;
        struct lastlog ll;
        struct lastlog ll;
-       int fd;
        char doit = 0;
        off_t lseek();
 
        char doit = 0;
        off_t lseek();
 
@@ -141,7 +159,7 @@ enter_lastlog(pn)
                }
        if ((w = pn->whead) == NULL)
                doit = 1;
                }
        if ((w = pn->whead) == NULL)
                doit = 1;
-       else {
+       else if (ll.ll_time != 0) {
                /* if last login is earlier than some current login */
                for (; !doit && w != NULL; w = w->next)
                        if (w->info == LOGGEDIN && w->loginat < ll.ll_time)
                /* if last login is earlier than some current login */
                for (; !doit && w != NULL; w = w->next)
                        if (w->info == LOGGEDIN && w->loginat < ll.ll_time)
@@ -267,3 +285,50 @@ walloc(pn)
        w->next = NULL;
        return(w);
 }
        w->next = NULL;
        return(w);
 }
+
+char *
+prphone(num)
+       char *num;
+{
+       register char *p;
+       int len;
+       static char pbuf[15];
+
+       /* don't touch anything if the user has their own formatting */
+       for (p = num; *p; ++p)
+               if (!isdigit(*p))
+                       return(num);
+       len = p - num;
+       p = pbuf;
+       switch(len) {
+       case 11:                        /* +0-123-456-7890 */
+               *p++ = '+';
+               *p++ = *num++;
+               *p++ = '-';
+               /* FALLTHROUGH */
+       case 10:                        /* 012-345-6789 */
+               *p++ = *num++;
+               *p++ = *num++;
+               *p++ = *num++;
+               *p++ = '-';
+               /* FALLTHROUGH */
+       case 7:                         /* 012-3456 */
+               *p++ = *num++;
+               *p++ = *num++;
+               *p++ = *num++;
+               break;
+       case 5:                         /* x0-1234 */
+               *p++ = 'x';
+               *p++ = *num++;
+               break;
+       default:
+               return(num);
+       }
+       *p++ = '-';
+       *p++ = *num++;
+       *p++ = *num++;
+       *p++ = *num++;
+       *p++ = *num++;
+       *p = '\0';
+       return(pbuf);
+}