=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/patch/inp.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- src/usr.bin/patch/inp.c 1998/11/25 00:30:25 1.7 +++ src/usr.bin/patch/inp.c 1999/01/03 05:33:48 1.8 @@ -1,7 +1,7 @@ -/* $OpenBSD: inp.c,v 1.7 1998/11/25 00:30:25 espie Exp $ */ +/* $OpenBSD: inp.c,v 1.8 1999/01/03 05:33:48 millert Exp $ */ #ifndef lint -static char rcsid[] = "$OpenBSD: inp.c,v 1.7 1998/11/25 00:30:25 espie Exp $"; +static char rcsid[] = "$OpenBSD: inp.c,v 1.8 1999/01/03 05:33:48 millert Exp $"; #endif /* not lint */ #include "EXTERN.h" @@ -78,6 +78,9 @@ Reg2 LINENUM iline; char lbuf[MAXLINELEN]; + if (!filename || *filename == '\0') + return FALSE; + statfailed = stat(filename, &filestat); if (statfailed && ok_to_create_file) { if (verbose) @@ -102,26 +105,23 @@ || ((filestat.st_mode & 0022) == 0 && filestat.st_uid != myuid)) { struct stat cstat; char *cs = Nullch; - char *filebase; - int pathlen; + char *filebase, *filedir; filebase = basename(filename); - pathlen = filebase - filename; + filedir = dirname(filename); - /* Put any leading path into `s'. - Leave room in lbuf for the diff command. */ + /* Leave room in lbuf for the diff command. */ s = lbuf + 20; - strncpy(s, filename, pathlen); -#define try(f, a1, a2) (Snprintf(s + pathlen, sizeof lbuf - (s + pathlen - lbuf), f, a1, a2), stat(s, &cstat) == 0) - if ( try("RCS/%s%s", filebase, RCSSUFFIX) - || try("RCS/%s" , filebase, 0) - || try( "%s%s", filebase, RCSSUFFIX)) { +#define try(f, a1, a2, a3) (Snprintf(s, sizeof lbuf - 20, f, a1, a2, a3), stat(s, &cstat) == 0) + if ( try("%s/RCS/%s%s", filedir, filebase, RCSSUFFIX) + || try("%s/RCS/%s%s", filedir, filebase, "") + || try( "%s/%s%s", filedir, filebase, RCSSUFFIX)) { Snprintf(buf, sizeof buf, CHECKOUT, filename); Snprintf(lbuf, sizeof lbuf, RCSDIFF, filename); cs = "RCS"; - } else if ( try("SCCS/%s%s", SCCSPREFIX, filebase) - || try( "%s%s", SCCSPREFIX, filebase)) { + } else if ( try("%s/SCCS/%s%s", filedir, SCCSPREFIX, filebase) + || try( "%s/%s%s", filedir, SCCSPREFIX, filebase)) { Snprintf(buf, sizeof buf, GET, s); Snprintf(lbuf, sizeof lbuf, SCCSDIFF, s, filename); cs = "SCCS";