X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=restore%2Fmain.c;h=f0f4d7cf12dd459dd9b2595f19f28ad752b0667d;hb=109e9e1d1a904627eeae4d519a0f694795b2892c;hp=b3a09ff9c53237f11d1023fdafe2cff958864b20;hpb=ec387a1267f4cac7625cd5b6d1c1f080d39085b3;p=dump.git diff --git a/restore/main.c b/restore/main.c index b3a09ff..f0f4d7c 100644 --- a/restore/main.c +++ b/restore/main.c @@ -2,8 +2,8 @@ * Ported to Linux's Second Extended File System as part of the * dump and restore backup suit * Remy Card , 1994-1997 - * Stelian Pop , 1999 - * + * Stelian Pop , 1999-2000 + * Stelian Pop - AlcĂ´ve , 2000 */ /* @@ -37,10 +37,13 @@ * 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. - * - * $Id: main.c,v 1.5 1999/10/11 13:31:13 stelian Exp $ */ +#ifndef lint +static const char rcsid[] = + "$Id: main.c,v 1.14 2000/12/04 15:43:17 stelian Exp $"; +#endif /* not lint */ + #include #include #include @@ -85,7 +88,9 @@ time_t dumpdate; FILE *terminal; char *tmpdir; int compare_ignore_not_found; -char *filesys = NULL; +int compare_errors; +char filesys[NAMELEN]; +static const char *stdin_opt = NULL; #ifdef __linux__ char *__progname; @@ -93,6 +98,7 @@ char *__progname; static void obsolete __P((int *, char **[])); static void usage __P((void)); +static void use_stdin __P((const char *)); int main(int argc, char *argv[]) @@ -102,10 +108,12 @@ main(int argc, char *argv[]) char *inputdev = _PATH_DEFTAPE; char *symtbl = "./restoresymtable"; char *p, name[MAXPATHLEN]; + FILE *filelist = NULL; + char fname[MAXPATHLEN]; /* Temp files should *not* be readable. We set permissions later. */ (void) umask(077); - + filesys[0] = '\0'; #ifdef __linux__ __progname = argv[0]; #endif @@ -123,9 +131,9 @@ main(int argc, char *argv[]) ; obsolete(&argc, &argv); #ifdef KERBEROS -#define optlist "b:CcdD:f:hikmNRrs:tT:uvxy" +#define optlist "b:CcdD:f:hikmMNRrs:tT:uvxX:y" #else -#define optlist "b:CcdD:f:himNRrs:tT:uvxy" +#define optlist "b:CcdD:f:himMNRrs:tT:uvxX:y" #endif while ((ch = getopt(argc, argv, optlist)) != -1) switch(ch) { @@ -142,7 +150,8 @@ main(int argc, char *argv[]) cvtflag = 1; break; case 'D': - filesys = optarg; + strncpy(filesys, optarg, NAMELEN); + filesys[NAMELEN - 1] = '\0'; break; case 'T': tmpdir = optarg; @@ -151,6 +160,8 @@ main(int argc, char *argv[]) dflag = 1; break; case 'f': + if( !strcmp(optarg,"-") ) + use_stdin("-f"); inputdev = optarg; break; case 'h': @@ -176,6 +187,9 @@ main(int argc, char *argv[]) case 'm': mflag = 0; break; + case 'M': + Mflag = 1; + break; case 'N': Nflag = 1; break; @@ -193,6 +207,15 @@ main(int argc, char *argv[]) case 'v': vflag = 1; break; + case 'X': + if( !strcmp(optarg,"-") ) { + use_stdin("-X"); + filelist = stdin; + } + else + if ( !(filelist = fopen(optarg,"r")) ) + errx(1, "can't open file for reading -- %s", optarg); + break; case 'y': yflag = 1; break; @@ -215,7 +238,7 @@ main(int argc, char *argv[]) setinput(inputdev); - if (argc == 0) { + if (argc == 0 && !filelist) { argc = 1; *--argv = "."; } @@ -229,6 +252,7 @@ main(int argc, char *argv[]) Vprintf(stdout, "Begin compare restore\n"); compare_ignore_not_found = 0; + compare_errors = 0; setup(); printf("filesys = %s\n", filesys); if (stat(filesys, &stbuf) < 0) @@ -241,6 +265,10 @@ main(int argc, char *argv[]) treescan(".", ROOTINO, nodeupdates); compareleaves(); checkrestore(); + if (compare_errors) { + printf("Some files were modified!\n"); + exit(2); + } break; } @@ -303,6 +331,23 @@ main(int argc, char *argv[]) checkrestore(); dumpsymtable(symtbl, (long)1); break; + +/* handle file names from either text file (-X) or the command line */ +#define NEXTFILE(p) \ + p = NULL; \ + if (argc) { \ + --argc; \ + p = *argv++; \ + } \ + else if (filelist) { \ + if ((p = fgets(fname, MAXPATHLEN, filelist))) { \ + if ( *p && *(p + strlen(p) - 1) == '\n' ) /* possible null string */ \ + *(p + strlen(p) - 1) = '\0'; \ + if ( !*p ) /* skip empty lines */ \ + continue; \ + } \ + } + /* * List contents of tape. */ @@ -310,8 +355,11 @@ main(int argc, char *argv[]) setup(); extractdirs(0); initsymtable((char *)0); - while (argc--) { - canon(*argv++, name, sizeof(name)); + for (;;) { + NEXTFILE(p); + if (!p) + break; + canon(p, name, sizeof(name)); ino = dirlookup(name); if (ino == 0) continue; @@ -325,8 +373,11 @@ main(int argc, char *argv[]) setup(); extractdirs(1); initsymtable((char *)0); - while (argc--) { - canon(*argv++, name, sizeof(name)); + for (;;) { + NEXTFILE(p); + if (!p) + break; + canon(p, name, sizeof(name)); ino = dirlookup(name); if (ino == 0) continue; @@ -354,12 +405,15 @@ usage(void) #else #define kerbflag #endif - (void)fprintf(stderr, "usage:\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n", - "restore -i [-ch" kerbflag "muvy] [-b blocksize] [-f file] [-s fileno]", - "restore -r [-c" kerbflag "uvy] [-b blocksize] [-f file] [-s fileno]", - "restore -R [-c" kerbflag "uvy] [-b blocksize] [-f file] [-s fileno]", - "restore -x [-ch" kerbflag "muvy] [-b blocksize] [-f file] [-s fileno] [file ...]", - "restore -t [-ch" kerbflag "kuvy] [-b blocksize] [-f file] [-s fileno] [file ...]"); + (void)fprintf(stderr, + "%s %s\n", __progname, _DUMP_VERSION); + (void)fprintf(stderr, + "usage:\t%s%s\n\t%s%s\n\t%s%s\n\t%s%s\n\t%s%s\n", + __progname, " -i [-ch" kerbflag "mMuvy] [-b blocksize] [-f file] [-s fileno]", + __progname, " -r [-c" kerbflag "Muvy] [-b blocksize] [-f file] [-s fileno]", + __progname, " -R [-c" kerbflag "Muvy] [-b blocksize] [-f file] [-s fileno]", + __progname, " -x [-ch" kerbflag "mMuvy] [-b blocksize] [-f file] [-s fileno] [-X filelist] [file ...]", + __progname, " -t [-ch" kerbflag "Muvy] [-b blocksize] [-f file] [-s fileno] [-X filelist] [file ...]"); exit(1); } @@ -394,8 +448,11 @@ obsolete(int *argcp, char **argvp[]) for (flags = 0; *ap; ++ap) { switch (*ap) { case 'b': + case 'D': case 'f': case 's': + case 'T': + case 'X': if (*argv == NULL) { warnx("option requires an argument -- %c", *ap); usage(); @@ -430,3 +487,16 @@ obsolete(int *argcp, char **argvp[]) /* Update argument count. */ *argcp = nargv - *argvp - 1; } + +/* + * use_stdin -- + * reserve stdin for opt (avoid conflicts) + */ +void +use_stdin(const char *opt) +{ + if (stdin_opt) + errx(1, "can't handle standard input for both %s and %s", + stdin_opt, opt); + stdin_opt = opt; +}