386BSD 0.1 development
[unix-history] / usr / src / usr.bin / tip / remcap.c
index ff385a8..c573569 100644 (file)
@@ -1,38 +1,66 @@
-/*     remcap.c        4.6     81/11/29        */
-/* Copyright (c) 1979 Regents of the University of California */
-#ifndef BUFSIZ
-#define        BUFSIZ  1024
-#endif
-#define MAXHOP 32      /* max number of tc= indirections */
+/*
+ * Copyright (c) 1983 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 sccsid[] = "@(#)remcap.c   5.5 (Berkeley) 2/2/91";
+#endif /* not lint */
 
 
-#include <ctype.h>
-#ifdef VMUNIX
-#include "local/uparm.h"
-#endif
 /*
  * remcap - routines for dealing with the remote host data base
  *
 /*
  * remcap - routines for dealing with the remote host data base
  *
- *     Made from termcap with the following defines.
+ * derived from termcap
  */
  */
-#define REMOTE         /* special for tip */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include "pathnames.h"
+
+#ifndef BUFSIZ
+#define        BUFSIZ          1024
+#endif
+#define MAXHOP         32              /* max number of tc= indirections */
 
 
-#ifdef REMOTE
 #define        tgetent         rgetent
 #define        tnchktc         rnchktc
 #define        tnamatch        rnamatch
 #define        tgetnum         rgetnum
 #define        tgetflag        rgetflag
 #define        tgetstr         rgetstr
 #define        tgetent         rgetent
 #define        tnchktc         rnchktc
 #define        tnamatch        rnamatch
 #define        tgetnum         rgetnum
 #define        tgetflag        rgetflag
 #define        tgetstr         rgetstr
-#undef E_TERMCAP
-#define        E_TERMCAP       RM = "/etc/remote"
+#define        E_TERMCAP       RM = _PATH_REMOTE
 #define V_TERMCAP      "REMOTE"
 #define V_TERM         "HOST"
 
 char   *RM;
 #define V_TERMCAP      "REMOTE"
 #define V_TERM         "HOST"
 
 char   *RM;
-#else
-#define        V_TERMCAP       "TERMCAP"
-#define V_TERM         "TERM"
-#endif
 
 /*
  * termcap - routines for dealing with the terminal capability data base
 
 /*
  * termcap - routines for dealing with the terminal capability data base
@@ -54,6 +82,7 @@ char  *tskip();
 char   *tgetstr();
 char   *tdecode();
 char   *getenv();
 char   *tgetstr();
 char   *tdecode();
 char   *getenv();
+static char *remotefile;
 
 /*
  * Get an entry for terminal name in buffer bp,
 
 /*
  * Get an entry for terminal name in buffer bp,
@@ -63,17 +92,46 @@ char        *getenv();
 tgetent(bp, name)
        char *bp, *name;
 {
 tgetent(bp, name)
        char *bp, *name;
 {
-       register char *cp;
+       char lbuf[BUFSIZ], *cp, *p;
+       int rc1, rc2;
+
+       remotefile = cp = getenv(V_TERMCAP);
+       if (cp == (char *)0 || strcmp(cp, _PATH_REMOTE) == 0) {
+               remotefile = cp = _PATH_REMOTE;
+               return (getent(bp, name, cp));
+       } else {
+               if ((rc1 = getent(bp, name, cp)) != 1)
+                       *bp = '\0';
+               remotefile = cp = _PATH_REMOTE;
+               rc2 = getent(lbuf, name, cp);
+               if (rc1 != 1 && rc2 != 1)
+                       return (rc2);
+               if (rc2 == 1) {
+                       p = lbuf;
+                       if (rc1 == 1)
+                               while (*p++ != ':')
+                                       ;
+                       if (strlen(bp) + strlen(p) > BUFSIZ) {
+                               write(2, "Remcap entry too long\n", 23);
+                               return (-1);
+                       }
+                       strcat(bp, p);
+               }
+               tbuf = bp;
+               return (1);
+       }
+}
+
+getent(bp, name, cp)
+       char *bp, *name, *cp;
+{
        register int c;
        register int i = 0, cnt = 0;
        register int c;
        register int i = 0, cnt = 0;
-       char ibuf[BUFSIZ];
-       char *cp2;
+       char ibuf[BUFSIZ], *cp2;
        int tf;
 
        tbuf = bp;
        tf = 0;
        int tf;
 
        tbuf = bp;
        tf = 0;
-#ifndef V6
-       cp = getenv(V_TERMCAP);
        /*
         * TERMCAP can have one of two things in it. It can be the
         * name of a file to use instead of /etc/termcap. In this
        /*
         * TERMCAP can have one of two things in it. It can be the
         * name of a file to use instead of /etc/termcap. In this
@@ -84,24 +142,16 @@ tgetent(bp, name)
        if (cp && *cp) {
                if (*cp!='/') {
                        cp2 = getenv(V_TERM);
        if (cp && *cp) {
                if (*cp!='/') {
                        cp2 = getenv(V_TERM);
-                       if (cp2==(char *) 0 || strcmp(name,cp2)==0) {
+                       if (cp2 == (char *)0 || strcmp(name,cp2) == 0) {
                                strcpy(bp,cp);
                                strcpy(bp,cp);
-                               return(tnchktc());
-                       } else {
-                               tf = open(E_TERMCAP, 0);
-                       }
+                               return (tnchktc());
+                       } else
+                               tf = open(E_TERMCAP, O_RDONLY);
                } else
                } else
-#ifdef REMOTE
-                       tf = open(RM = cp, 0);
-#else
-                       tf = open(cp, 0);
-#endif
+                       tf = open(RM = cp, O_RDONLY);
        }
        }
-       if (tf==0)
-               tf = open(E_TERMCAP, 0);
-#else
-       tf = open(E_TERMCAP, 0);
-#endif
+       if (tf == 0)
+               tf = open(E_TERMCAP, O_RDONLY);
        if (tf < 0)
                return (-1);
        for (;;) {
        if (tf < 0)
                return (-1);
        for (;;) {
@@ -117,14 +167,14 @@ tgetent(bp, name)
                        }
                        c = ibuf[i++];
                        if (c == '\n') {
                        }
                        c = ibuf[i++];
                        if (c == '\n') {
-                               if (cp > bp && cp[-1] == '\\'){
+                               if (cp > bp && cp[-1] == '\\') {
                                        cp--;
                                        continue;
                                }
                                break;
                        }
                        if (cp >= bp+BUFSIZ) {
                                        cp--;
                                        continue;
                                }
                                break;
                        }
                        if (cp >= bp+BUFSIZ) {
-                               write(2,"Termcap entry too long\n", 23);
+                               write(2,"Remcap entry too long\n", 23);
                                break;
                        } else
                                *cp++ = c;
                                break;
                        } else
                                *cp++ = c;
@@ -136,7 +186,7 @@ tgetent(bp, name)
                 */
                if (tnamatch(name)) {
                        close(tf);
                 */
                if (tnamatch(name)) {
                        close(tf);
-                       return(tnchktc());
+                       return (tnchktc());
                }
        }
 }
                }
        }
 }
@@ -155,38 +205,43 @@ tnchktc()
        char tcbuf[BUFSIZ];
        char *holdtbuf = tbuf;
        int l;
        char tcbuf[BUFSIZ];
        char *holdtbuf = tbuf;
        int l;
+       char *cp;
 
        p = tbuf + strlen(tbuf) - 2;    /* before the last colon */
        while (*--p != ':')
                if (p<tbuf) {
 
        p = tbuf + strlen(tbuf) - 2;    /* before the last colon */
        while (*--p != ':')
                if (p<tbuf) {
-                       write(2, "Bad termcap entry\n", 18);
+                       write(2, "Bad remcap entry\n", 18);
                        return (0);
                }
        p++;
        /* p now points to beginning of last field */
        if (p[0] != 't' || p[1] != 'c')
                        return (0);
                }
        p++;
        /* p now points to beginning of last field */
        if (p[0] != 't' || p[1] != 'c')
-               return(1);
-       strcpy(tcname,p+3);
+               return (1);
+       strcpy(tcname, p+3);
        q = tcname;
        q = tcname;
-       while (q && *q != ':')
+       while (*q && *q != ':')
                q++;
        *q = 0;
        if (++hopcount > MAXHOP) {
                write(2, "Infinite tc= loop\n", 18);
                return (0);
        }
                q++;
        *q = 0;
        if (++hopcount > MAXHOP) {
                write(2, "Infinite tc= loop\n", 18);
                return (0);
        }
-       if (tgetent(tcbuf, tcname) != 1)
-               return(0);
-       for (q=tcbuf; *q != ':'; q++)
+       if (getent(tcbuf, tcname, remotefile) != 1) {
+               if (strcmp(remotefile, _PATH_REMOTE) == 0)
+                       return (0);
+               else if (getent(tcbuf, tcname, _PATH_REMOTE) != 1)
+                       return (0);
+       }
+       for (q = tcbuf; *q++ != ':'; )
                ;
        l = p - holdtbuf + strlen(q);
        if (l > BUFSIZ) {
                ;
        l = p - holdtbuf + strlen(q);
        if (l > BUFSIZ) {
-               write(2, "Termcap entry too long\n", 23);
-               q[BUFSIZ - (p-tbuf)] = 0;
+               write(2, "Remcap entry too long\n", 23);
+               q[BUFSIZ - (p-holdtbuf)] = 0;
        }
        }
-       strcpy(p, q+1);
+       strcpy(p, q);
        tbuf = holdtbuf;
        tbuf = holdtbuf;
-       return(1);
+       return (1);
 }
 
 /*
 }
 
 /*
@@ -202,7 +257,7 @@ tnamatch(np)
 
        Bp = tbuf;
        if (*Bp == '#')
 
        Bp = tbuf;
        if (*Bp == '#')
-               return(0);
+               return (0);
        for (;;) {
                for (Np = np; *Np && *Bp == *Np; Bp++, Np++)
                        continue;
        for (;;) {
                for (Np = np; *Np && *Bp == *Np; Bp++, Np++)
                        continue;
@@ -254,7 +309,7 @@ tgetnum(id)
                if (*bp++ != id[0] || *bp == 0 || *bp++ != id[1])
                        continue;
                if (*bp == '@')
                if (*bp++ != id[0] || *bp == 0 || *bp++ != id[1])
                        continue;
                if (*bp == '@')
-                       return(-1);
+                       return (-1);
                if (*bp != '#')
                        continue;
                bp++;
                if (*bp != '#')
                        continue;
                bp++;
@@ -287,7 +342,7 @@ tgetflag(id)
                        if (!*bp || *bp == ':')
                                return (1);
                        else if (*bp == '@')
                        if (!*bp || *bp == ':')
                                return (1);
                        else if (*bp == '@')
-                               return(0);
+                               return (0);
                }
        }
 }
                }
        }
 }
@@ -313,7 +368,7 @@ tgetstr(id, area)
                if (*bp++ != id[0] || *bp == 0 || *bp++ != id[1])
                        continue;
                if (*bp == '@')
                if (*bp++ != id[0] || *bp == 0 || *bp++ != id[1])
                        continue;
                if (*bp == '@')
-                       return(0);
+                       return (0);
                if (*bp != '=')
                        continue;
                bp++;
                if (*bp != '=')
                        continue;
                bp++;