BSD 4_3_Tahoe release
[unix-history] / usr / src / etc / restore / utilities.c
index 37d6e82..3fb7a59 100644 (file)
@@ -1,13 +1,15 @@
-#ifndef lint
-static char sccsid[] = "@(#)utilities.c        3.15    (Berkeley)      83/08/11";
-#endif
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
 
 
-/* Copyright (c) 1983 Regents of the University of California */
+#ifndef lint
+static char sccsid[] = "@(#)utilities.c        5.3 (Berkeley) 5/13/88";
+#endif not lint
 
 #include "restore.h"
 
 
 #include "restore.h"
 
-char *copynext();
-
 /*
  * Insure that all the components of a pathname exist.
  */
 /*
  * Insure that all the components of a pathname exist.
  */
@@ -29,8 +31,8 @@ pathcheck(name)
                if (ep == NIL) {
                        ep = addentry(name, psearch(name), NODE);
                        newnode(ep);
                if (ep == NIL) {
                        ep = addentry(name, psearch(name), NODE);
                        newnode(ep);
-                       ep->e_flags |= NEW|KEEP;
                }
                }
+               ep->e_flags |= NEW|KEEP;
                *cp = '/';
        }
 }
                *cp = '/';
        }
 }
@@ -78,7 +80,7 @@ gentempname(ep)
 renameit(from, to)
        char *from, *to;
 {
 renameit(from, to)
        char *from, *to;
 {
-       if (rename(from, to) < 0) {
+       if (!Nflag && rename(from, to) < 0) {
                fprintf(stderr, "Warning: cannot rename %s to %s", from, to);
                (void) fflush(stderr);
                perror("");
                fprintf(stderr, "Warning: cannot rename %s to %s", from, to);
                (void) fflush(stderr);
                perror("");
@@ -98,7 +100,8 @@ newnode(np)
        if (np->e_type != NODE)
                badentry(np, "newnode: not a node");
        cp = myname(np);
        if (np->e_type != NODE)
                badentry(np, "newnode: not a node");
        cp = myname(np);
-       if (mkdir(cp, 0777) < 0) {
+       if (!Nflag && mkdir(cp, 0777) < 0) {
+               np->e_flags |= EXISTED;
                fprintf(stderr, "Warning: ");
                (void) fflush(stderr);
                perror(cp);
                fprintf(stderr, "Warning: ");
                (void) fflush(stderr);
                perror(cp);
@@ -122,7 +125,7 @@ removenode(ep)
        ep->e_flags |= REMOVED;
        ep->e_flags &= ~TMPNAME;
        cp = myname(ep);
        ep->e_flags |= REMOVED;
        ep->e_flags &= ~TMPNAME;
        cp = myname(ep);
-       if (rmdir(cp) < 0) {
+       if (!Nflag && rmdir(cp) < 0) {
                fprintf(stderr, "Warning: ");
                (void) fflush(stderr);
                perror(cp);
                fprintf(stderr, "Warning: ");
                (void) fflush(stderr);
                perror(cp);
@@ -144,7 +147,7 @@ removeleaf(ep)
        ep->e_flags |= REMOVED;
        ep->e_flags &= ~TMPNAME;
        cp = myname(ep);
        ep->e_flags |= REMOVED;
        ep->e_flags &= ~TMPNAME;
        cp = myname(ep);
-       if (unlink(cp) < 0) {
+       if (!Nflag && unlink(cp) < 0) {
                fprintf(stderr, "Warning: ");
                (void) fflush(stderr);
                perror(cp);
                fprintf(stderr, "Warning: ");
                (void) fflush(stderr);
                perror(cp);
@@ -162,28 +165,30 @@ linkit(existing, new, type)
 {
 
        if (type == SYMLINK) {
 {
 
        if (type == SYMLINK) {
-               if (symlink(existing, new) < 0) {
+               if (!Nflag && symlink(existing, new) < 0) {
                        fprintf(stderr,
                        fprintf(stderr,
-                               "Warning: cannot create symbolic link %s->%s",
+                               "Warning: cannot create symbolic link %s->%s",
                                new, existing);
                        (void) fflush(stderr);
                        perror("");
                                new, existing);
                        (void) fflush(stderr);
                        perror("");
-                       return;
+                       return (FAIL);
                }
        } else if (type == HARDLINK) {
                }
        } else if (type == HARDLINK) {
-               if (link(existing, new) < 0) {
+               if (!Nflag && link(existing, new) < 0) {
                        fprintf(stderr,
                        fprintf(stderr,
-                               "Warning: cannot create hard link %s->%s",
+                               "Warning: cannot create hard link %s->%s",
                                new, existing);
                        (void) fflush(stderr);
                        perror("");
                                new, existing);
                        (void) fflush(stderr);
                        perror("");
-                       return;
+                       return (FAIL);
                }
        } else {
                panic("linkit: unknown type %d\n", type);
                }
        } else {
                panic("linkit: unknown type %d\n", type);
+               return (FAIL);
        }
        vprintf(stdout, "Create %s link %s->%s\n",
                type == SYMLINK ? "symbolic" : "hard", new, existing);
        }
        vprintf(stdout, "Create %s link %s->%s\n",
                type == SYMLINK ? "symbolic" : "hard", new, existing);
+       return (GOOD);
 }
 
 /*
 }
 
 /*
@@ -270,6 +275,8 @@ flagvalues(ep)
                (void) strcat(flagbuf, "|NEW");
        if (ep->e_flags & KEEP)
                (void) strcat(flagbuf, "|KEEP");
                (void) strcat(flagbuf, "|NEW");
        if (ep->e_flags & KEEP)
                (void) strcat(flagbuf, "|KEEP");
+       if (ep->e_flags & EXISTED)
+               (void) strcat(flagbuf, "|EXISTED");
        return (&flagbuf[1]);
 }
 
        return (&flagbuf[1]);
 }
 
@@ -288,44 +295,6 @@ dirlookup(name)
        return (ino);
 }
 
        return (ino);
 }
 
-/*
- * Canonicalize file names to always start with ``./'' and
- * remove any imbedded ".." components.
- */
-canon(rawname, canonname)
-       char *rawname, *canonname;
-{
-       register char *cp, *np;
-       int len;
-
-       if (strcmp(rawname, ".") == 0 || strncmp(rawname, "./", 2) == 0)
-               (void) strcpy(canonname, "");
-       else if (rawname[0] == '/')
-               (void) strcpy(canonname, ".");
-       else
-               (void) strcpy(canonname, "./");
-       (void) strcat(canonname, rawname);
-       len = strlen(canonname) - 1;
-       if (canonname[len] == '/')
-               canonname[len] = '\0';
-       /*
-        * Eliminate extraneous ".." from pathnames.
-        */
-       for (np = canonname; *np != '\0'; ) {
-               np++;
-               cp = np;
-               while (*np != '/' && *np != '\0')
-                       np++;
-               if (np - cp == 2 && strncmp(cp, "..", 2) == 0) {
-                       cp--;
-                       while (cp > &canonname[1] && *--cp != '/')
-                               /* find beginning of name */;
-                       (void) strcpy(cp, np);
-                       np = cp;
-               }
-       }
-}
-
 /*
  * Elicit a reply.
  */
 /*
  * Elicit a reply.
  */
@@ -334,160 +303,19 @@ reply(question)
 {
        char c;
 
 {
        char c;
 
-       fprintf(stderr, "%s? ", question);
        do      {
        do      {
-               fprintf(stderr, "[yn] ");
+               fprintf(stderr, "%s? [yn] ", question);
                (void) fflush(stderr);
                c = getc(terminal);
                while (c != '\n' && getc(terminal) != '\n')
                (void) fflush(stderr);
                c = getc(terminal);
                while (c != '\n' && getc(terminal) != '\n')
-                       /* void */;
+                       if (feof(terminal))
+                               return (FAIL);
        } while (c != 'y' && c != 'n');
        if (c == 'y')
                return (GOOD);
        return (FAIL);
 }
 
        } while (c != 'y' && c != 'n');
        if (c == 'y')
                return (GOOD);
        return (FAIL);
 }
 
-/*
- * Read and parse an interactive command.
- * The first word on the line is assigned to "cmd". If
- * there are no arguments on the command line, then "curdir"
- * is returned as the argument. If there are arguments
- * on the line they are returned one at a time on each
- * successive call to getcmd. Each argument is first assigned
- * to "name". If it does not start with "/" the pathname in
- * "curdir" is prepended to it. Finally "canon" is called to
- * eliminate any embedded ".." components.
- */
-getcmd(curdir, cmd, name)
-       char *curdir, *cmd, *name;
-{
-       register char *cp;
-       static char *nextarg = NULL;
-       static char input[BUFSIZ];
-       char output[BUFSIZ];
-#      define rawname input    /* save space by reusing input buffer */
-
-       /*
-        * Check to see if still processing arguments.
-        */
-       if (nextarg != NULL)
-               goto getnext;
-       /*
-        * Read a command line and trim off trailing white space.
-        */
-       do      {
-               fprintf(stderr, "restore > ");
-               (void) fflush(stderr);
-               (void) fgets(input, BUFSIZ, terminal);
-       } while (!feof(terminal) && input[0] == '\n');
-       if (feof(terminal)) {
-               (void) strcpy(cmd, "quit");
-               return;
-       }
-       for (cp = &input[strlen(input) - 2]; *cp == ' ' || *cp == '\t'; cp--)
-               /* trim off trailing white space and newline */;
-       *++cp = '\0';
-       /*
-        * Copy the command into "cmd".
-        */
-       cp = copynext(input, cmd);
-       /*
-        * If no argument, use curdir as the default.
-        */
-       if (*cp == '\0') {
-               (void) strcpy(name, curdir);
-               return;
-       }
-       nextarg = cp;
-       /*
-        * Find the next argument.
-        */
-getnext:
-       cp = copynext(nextarg, rawname);
-       if (*cp == '\0')
-               nextarg = NULL;
-       else
-               nextarg = cp;
-       /*
-        * If it an absolute pathname, canonicalize it and return it.
-        */
-       if (rawname[0] == '/') {
-               canon(rawname, name);
-               return;
-       }
-       /*
-        * For relative pathnames, prepend the current directory to
-        * it then canonicalize and return it.
-        */
-       (void) strcpy(output, curdir);
-       (void) strcat(output, "/");
-       (void) strcat(output, rawname);
-       canon(output, name);
-#      undef rawname
-}
-
-/*
- * Strip off the next token of the input.
- */
-char *
-copynext(input, output)
-       char *input, *output;
-{
-       register char *cp, *bp;
-       char quote;
-
-       for (cp = input; *cp == ' ' || *cp == '\t'; cp++)
-               /* skip to argument */;
-       bp = output;
-       while (*cp != ' ' && *cp != '\t' && *cp != '\0') {
-               /*
-                * Handle back slashes.
-                */
-               if (*cp == '\\') {
-                       if (*++cp == '\0') {
-                               fprintf(stderr,
-                                       "command lines cannot be continued\n");
-                               continue;
-                       }
-                       *bp++ = *cp++;
-                       continue;
-               }
-               /*
-                * The usual unquoted case.
-                */
-               if (*cp != '\'' && *cp != '"') {
-                       *bp++ = *cp++;
-                       continue;
-               }
-               /*
-                * Handle single and double quotes.
-                */
-               quote = *cp++;
-               while (*cp != quote && *cp != '\0')
-                       *bp++ = *cp++;
-               if (*cp++ == '\0') {
-                       fprintf(stderr, "missing %c\n", quote);
-                       cp--;
-                       continue;
-               }
-       }
-       *bp = '\0';
-       return (cp);
-}
-
-/*
- * respond to interrupts
- */
-onintr()
-{
-       if (reply("restore interrupted, continue") == FAIL)
-               done(1);
-       if (signal(SIGINT, onintr) == SIG_IGN)
-               (void) signal(SIGINT, SIG_IGN);
-       if (signal(SIGTERM, onintr) == SIG_IGN)
-               (void) signal(SIGTERM, SIG_IGN);
-}
-
 /*
  * handle unexpected inconsistencies
  */
 /*
  * handle unexpected inconsistencies
  */