X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=restore%2Finteractive.c;h=2f262789632fe1cf351d5f85cadccbbda228edb0;hb=8d4197bb9ba5bbcef21409231ed8903b0cac353a;hp=f98ff0f5c68b8a845a9e27ba76533e1f78e2d283;hpb=b45f51d61e911ac8a040bef1efda6afd82261e03;p=dump.git diff --git a/restore/interactive.c b/restore/interactive.c index f98ff0f..2f26278 100644 --- a/restore/interactive.c +++ b/restore/interactive.c @@ -44,7 +44,7 @@ static char sccsid[] = "@(#)interactive.c 8.5 (Berkeley) 5/1/95"; #endif static const char rcsid[] = - "$Id: interactive.c,v 1.2 1999/10/11 12:53:23 stelian Exp $"; + "$Id: interactive.c,v 1.4 1999/10/11 13:08:09 stelian Exp $"; #endif /* not lint */ #include @@ -60,13 +60,16 @@ static const char rcsid[] = #include #include -#include +#include +#include +#include #include #include #include #ifdef __linux__ #include +extern char * __progname; #endif #include "restore.h" @@ -111,7 +114,7 @@ static void printlist __P((char *, char *)); * Read and execute commands from the terminal. */ void -runcmdshell() +runcmdshell(void) { register struct entry *np; ino_t ino; @@ -168,7 +171,8 @@ loop: fprintf(stderr, "%s: not a directory\n", name); break; } - (void) strcpy(curdir, name); + (void) strncpy(curdir, name, sizeof(curdir)); + curdir[sizeof(curdir) - 1] = '\0'; break; /* * Delete elements from the extraction list. @@ -319,10 +323,7 @@ loop: * eliminate any embedded ".." components. */ static void -getcmd(curdir, cmd, name, size, ap) - char *curdir, *cmd, *name; - struct arglist *ap; - int size; +getcmd(char *curdir, char *cmd, char *name, int size, struct arglist *ap) { register char *cp; static char input[BUFSIZ]; @@ -340,7 +341,7 @@ getcmd(curdir, cmd, name, size, ap) * Read a command line and trim off trailing white space. */ do { - fprintf(stderr, "restore > "); + fprintf(stderr, "%s > ", __progname); (void) fflush(stderr); (void) fgets(input, BUFSIZ, terminal); } while (!feof(terminal) && input[0] == '\n'); @@ -408,8 +409,7 @@ retnext: * Strip off the next token of the input. */ static char * -copynext(input, output) - char *input, *output; +copynext(char *input, char *output) { register char *cp, *bp; char quote; @@ -458,9 +458,7 @@ copynext(input, output) * remove any embedded "." and ".." components. */ void -canon(rawname, canonname, len) - char *rawname, *canonname; - int len; +canon(char *rawname, char *canonname, int len) { register char *cp, *np; @@ -470,10 +468,8 @@ canon(rawname, canonname, len) (void) strcpy(canonname, "."); else (void) strcpy(canonname, "./"); - if (strlen(canonname) + strlen(rawname) >= len) { - fprintf(stderr, "canonname: not enough buffer space\n"); - done(1); - } + if (strlen(canonname) + strlen(rawname) >= len) + errx(1, "canonname: not enough buffer space"); (void) strcat(canonname, rawname); /* @@ -514,11 +510,9 @@ canon(rawname, canonname, len) * Do an "ls" style listing of a directory */ static void -printlist(name, basename) - char *name; - char *basename; +printlist(char *name, char *basename) { - register struct afile *fp, *list, *listp=NULL; + register struct afile *fp, *list, *listp = NULL; register struct direct *dp; struct afile single; RST_DIR *dirp; @@ -554,9 +548,9 @@ printlist(name, basename) fprintf(stderr, "%s:\n", name); entries = 0; listp = list; - (void) strncpy(locname, name, MAXPATHLEN); - (void) strncat(locname, "/", MAXPATHLEN); - namelen = strlen(locname); + namelen = snprintf(locname, sizeof(locname), "%s/", name); + if (namelen >= sizeof(locname)) + namelen = sizeof(locname) - 1; while ((dp = rst_readdir(dirp))) { if (dp == NULL) break; @@ -567,12 +561,12 @@ printlist(name, basename) strcmp(dp->d_name, "..") == 0)) continue; locname[namelen] = '\0'; - if (namelen + dp->d_namlen >= MAXPATHLEN) { + if (namelen + strlen(dp->d_name) >= MAXPATHLEN) { fprintf(stderr, "%s%s: name exceeds %d char\n", locname, dp->d_name, MAXPATHLEN); } else { (void) strncat(locname, dp->d_name, - (int)dp->d_namlen); + (int)strlen(dp->d_name)); mkentry(locname, dp, listp++); entries++; } @@ -598,10 +592,7 @@ printlist(name, basename) * Read the contents of a directory. */ static void -mkentry(name, dp, fp) - char *name; - struct direct *dp; - register struct afile *fp; +mkentry(char *name, struct direct *dp, struct afile *fp) { char *cp; struct entry *np; @@ -642,9 +633,12 @@ mkentry(name, dp, fp) fp->postfix = '#'; break; +#ifndef __linux__ + /* no need for this */ case DT_WHT: fp->postfix = '%'; break; +#endif case DT_UNKNOWN: case DT_DIR: @@ -661,13 +655,11 @@ mkentry(name, dp, fp) * Print out a pretty listing of a directory */ static void -formatf(list, nentry) - register struct afile *list; - int nentry; +formatf(struct afile *list, int nentry) { register struct afile *fp, *endlist; int width, bigino, haveprefix, havepostfix; - int i, j, w, precision=0, columns, lines; + int i, j, w, precision = 0, columns, lines; width = 0; haveprefix = 0; @@ -728,27 +720,20 @@ formatf(list, nentry) * Skip over directory entries that are not on the tape * * First have to get definition of a dirent. + * + * For Linux the dirent struct is now included from bsdcompat.h */ -#ifdef __linux__ -struct dirent { - off_t d_off; /* offset of next disk dir entry */ - unsigned long d_fileno; /* file number of entry */ - unsigned short d_reclen; /* length of this record */ - unsigned short d_namlen; /* length of string in d_name */ - char d_name[255+1]; /* name (up to MAXNAMLEN + 1) */ -}; -#else /* __linux__ */ +#ifndef __linux__ #undef DIRBLKSIZ #include #undef d_ino -#endif /* __linux__ */ +#endif /* ! __linux__ */ struct dirent * -glob_readdir(dirp) - RST_DIR *dirp; +glob_readdir(RST_DIR *dirp) { struct direct *dp; - static struct dirent adirent; + static struct dirent adirent; while ((dp = rst_readdir(dirp)) != NULL) { if (!vflag && dp->d_ino == WINO) @@ -759,7 +744,6 @@ glob_readdir(dirp) if (dp == NULL) return (NULL); adirent.d_fileno = dp->d_ino; - adirent.d_namlen = dp->d_namlen; memmove(adirent.d_name, dp->d_name, dp->d_namlen + 1); return (&adirent); } @@ -768,12 +752,9 @@ glob_readdir(dirp) * Return st_mode information in response to stat or lstat calls */ static int -glob_stat(name, stp) - const char *name; - struct stat *stp; +glob_stat(const char *name, struct stat *stp) { register struct direct *dp; - dp = pathsearch(name); if (dp == NULL || (!dflag && TSTINO(dp->d_ino, dumpmap) == 0) || (!vflag && dp->d_ino == WINO)) @@ -789,8 +770,7 @@ glob_stat(name, stp) * Comparison routine for qsort. */ static int -fcmp(f1, f2) - register const void *f1, *f2; +fcmp(const void *f1, const void *f2) { return (strcmp(((struct afile *)f1)->fname, ((struct afile *)f2)->fname)); @@ -800,11 +780,13 @@ fcmp(f1, f2) * respond to interrupts */ void -onintr(signo) - int signo; +onintr(int signo) { + int save_errno = errno; + if (command == 'i' && runshell) longjmp(reset, 1); if (reply("restore interrupted, continue") == FAIL) - done(1); + exit(1); + errno = save_errno; }