$OpenBSD: patch-etcpapd-printcapc,v 1.2 2001/03/19 13:50:57 wilfried Exp $ --- etc/papd/printcap.c.orig Sun Aug 17 09:20:28 1997 +++ etc/papd/printcap.c Fri Mar 16 14:58:42 2001 @@ -40,9 +40,15 @@ static char sccsid[] = "@(#)printcap.c 5.7 (Berkeley) 3/4/91"; #endif /* not lint */ +#include +#include #include +#include +#include #include -#include +#include +#include +#include #include #ifndef BUFSIZ @@ -66,7 +72,6 @@ static char sccsid[] = "@(#)printcap.c 5 #define PRINTCAP -#ifdef PRINTCAP #define tgetent pgetent #define tskip pskip #define tgetstr pgetstr @@ -77,7 +82,8 @@ static char sccsid[] = "@(#)printcap.c 5 #define tnchktc pnchktc #define tnamatch pnamatch #define V6 -#endif + +int pnchktc(), pnamatch(); static FILE *pfp = NULL; /* printcap data base file pointer */ static char *tbuf; @@ -94,6 +100,7 @@ char *getenv(); * Added a "cap" parameter, so we can use these calls for printcap * and papd.conf. */ +int getprent( cap, bp) register char *cap; register char *bp; @@ -136,6 +143,7 @@ getprent( cap, bp) } } +void endprent() { if (pfp != NULL) @@ -150,6 +158,7 @@ endprent() * Added a "cap" parameter, so we can use these calls for printcap * and papd.conf. */ +int tgetent( cap, bp, name) char *cap, *bp, *name; { @@ -157,8 +166,7 @@ tgetent( cap, bp, name) register int c; register int i = 0, cnt = 0; char ibuf[BUFSIZ]; - char *cp2; - int tf; + int tf, skip; hopcount = 0; tbuf = bp; @@ -176,8 +184,8 @@ tgetent( cap, bp, name) if (*cp!='/') { cp2 = getenv("TERM"); if (cp2==(char *) 0 || strcmp(name,cp2)==0) { - strcpy(bp,cp); - return(tnchktc()); + (void)strlcpy(bp,cp, sizeof( bp ) ); + return(tnchktc(cap)); } else { tf = open(cap, 0); } @@ -191,6 +199,7 @@ tgetent( cap, bp, name) #endif if (tf < 0) return (-1); + skip = 0; for (;;) { cp = bp; for (;;) { @@ -204,12 +213,20 @@ tgetent( cap, bp, name) } c = ibuf[i++]; if (c == '\n') { - if (cp > bp && cp[-1] == '\\'){ + if (!skip && cp > bp && cp[-1] == '\\'){ cp--; continue; } - break; + skip = 0; + if (cp == bp) + continue; + else + break; } + if (c == '#' && cp == bp) + skip++; + if (skip) + continue; if (cp >= bp+BUFSIZ) { write(2,"Termcap entry too long\n", 23); break; @@ -223,7 +240,7 @@ tgetent( cap, bp, name) */ if (tnamatch(name)) { close(tf); - return(tnchktc()); + return(tnchktc(cap)); } } } @@ -238,6 +255,7 @@ tgetent( cap, bp, name) * Added a "cap" parameter, so we can use these calls for printcap * and papd.conf. */ +int tnchktc( cap ) char *cap; { @@ -257,7 +275,7 @@ tnchktc( cap ) /* p now points to beginning of last field */ if (p[0] != 't' || p[1] != 'c') return(1); - strcpy(tcname,p+3); + (void)strlcpy(tcname,p+3, sizeof ( tcname ) ); q = tcname; while (q && *q != ':') q++; @@ -275,7 +293,7 @@ tnchktc( cap ) write(2, "Termcap entry too long\n", 23); q[BUFSIZ - (p-tbuf)] = 0; } - strcpy(p, q+1); + (void)strlcpy(p, q+1, sizeof( p ) ); tbuf = holdtbuf; return(1); } @@ -286,6 +304,7 @@ tnchktc( cap ) * against each such name. The normal : terminator after the last * name (before the first field) stops us. */ +int tnamatch(np) char *np; { @@ -332,6 +351,7 @@ tskip(bp) * a # character. If the option is not found we return -1. * Note that we handle octal numbers beginning with 0. */ +int tgetnum(id) char *id; { @@ -365,6 +385,7 @@ tgetnum(id) * of the buffer. Return 1 if we find the option, or 0 if it is * not given. */ +int tgetflag(id) char *id; {