]> git.wh0rd.org - dump.git/blobdiff - restore/interactive.c
Prepare for release 0.4b43
[dump.git] / restore / interactive.c
index bc94ed45c339cdff5c5bd02eae8598e1d83ee1b9..ecbffda09e8a3dde54e457f666529feb24fa1253 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: interactive.c,v 1.21 2002/01/25 15:08:59 stelian Exp $";
+       "$Id: interactive.c,v 1.27 2003/10/26 16:05:48 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
+#include <sys/types.h>
 #include <sys/param.h>
 #include <sys/stat.h>
 
@@ -56,8 +53,13 @@ static const char rcsid[] =
 #endif
 #include <bsdcompat.h>
 #else  /* __linux__ */
+#ifdef sunos
+#include <sys/fcntl.h>
+#include <bsdcompat.h>
+#else
 #include <ufs/ufs/dinode.h>
 #include <ufs/ufs/dir.h>
+#endif
 #endif /* __linux__ */
 #include <protocols/dumprestore.h>
 
@@ -71,6 +73,9 @@ static const char rcsid[] =
 
 #ifdef __linux__
 #include <ext2fs/ext2fs.h>
+#endif
+
+#if defined(__linux__) || defined(sunos)
 extern char * __progname;
 #endif
 
@@ -83,9 +88,9 @@ extern char * __progname;
 
 static char *rl_gets (char *prompt);
 static void initialize_readline(void);
-static char **restore_completion (char *text, int start, int end);
-static char *command_generator(char *text, int state);
-static char *filename_generator(char *text, int state);
+static char **restore_completion (const char *text, int start, int end);
+static char *command_generator(const char *text, int state);
+static char *filename_generator(const char *text, int state);
 #endif
 
 #define round(a, b) (((a) + (b) - 1) / (b) * (b))
@@ -211,7 +216,7 @@ loop:
                        goto bad;
                createfiles();
                createlinks();
-               setdirmodes(0);
+               setdirmodes(oflag ? FORCE : 0);
                if (dflag)
                        checkrestore();
                volno = 0;
@@ -510,7 +515,7 @@ canon(char *rawname, char *canonname, int len)
                (void) strcpy(canonname, ".");
        else
                (void) strcpy(canonname, "./");
-       if (strlen(canonname) + strlen(rawname) >= len)
+       if (strlen(canonname) + strlen(rawname) >= (unsigned)len)
                errx(1, "canonname: not enough buffer space");
                
        (void) strcat(canonname, rawname);
@@ -570,7 +575,7 @@ printlist(char *name, char *basename)
                list = &single;
                mkentry(name, dp, list);
                len = strlen(basename) + 1;
-               if (strlen(name) - len > single.len) {
+               if (strlen(name) - len > (unsigned)single.len) {
                        freename(single.fname);
                        single.fname = savename(&name[len]);
                        single.len = strlen(single.fname);
@@ -591,7 +596,7 @@ printlist(char *name, char *basename)
                entries = 0;
                listp = list;
                namelen = snprintf(locname, sizeof(locname), "%s/", name);
-               if (namelen >= sizeof(locname))
+               if (namelen >= (int)sizeof(locname))
                        namelen = sizeof(locname) - 1;
                while ((dp = rst_readdir(dirp))) {
                        if (dp == NULL)
@@ -709,7 +714,7 @@ formatf(struct afile *list, int nentry)
        bigino = ROOTINO;
        endlist = &list[nentry];
        for (fp = &list[0]; fp < endlist; fp++) {
-               if (bigino < fp->fnum)
+               if (bigino < (int)fp->fnum)
                        bigino = fp->fnum;
                if (width < fp->len)
                        width = fp->len;
@@ -822,7 +827,7 @@ fcmp(const void *f1, const void *f2)
  * respond to interrupts
  */
 void
-onintr(int signo)
+onintr(UNUSED(int signo))
 {
        int save_errno = errno;
 
@@ -836,6 +841,10 @@ onintr(int signo)
 
 #if HAVE_READLINE
 
+#if !HAVE_READLINE_RLCM
+#define rl_completion_matches completion_matches
+#endif
+
 /* A static variable for holding the line. */
 static char *line_read = NULL;
 
@@ -898,30 +907,8 @@ rl_gets (char *dir)
        return (line_read);
 }
 
-static void 
-initialize_readline(void) 
-{
-       rl_attempted_completion_function = restore_completion;
-       rl_completion_entry_function = (Function *)NULL;
-       rl_completion_append_character = '\0';
-       rl_instream = terminal;
-}
-
-static char **
-restore_completion (char *text, int start, int end)
-{
-       char **matches;
-
-       if (start == 0)
-               matches = completion_matches (text, command_generator);
-       else
-               matches = completion_matches (text, filename_generator);
-
-       return (matches);
-}
-
 static char *
-command_generator(char *text, int state)
+command_generator(const char *text, int state)
 {
        static int list_index, len;
        char *name;
@@ -943,7 +930,7 @@ command_generator(char *text, int state)
 }
 
 static char *
-filename_generator(char *text, int state)
+filename_generator(const char *text, int state)
 {
        static int list_index;
        char *name;
@@ -1026,4 +1013,30 @@ filename_generator(char *text, int state)
 
        return name;
 }
+
+static char **
+restore_completion (const char *text, int start, UNUSED(int end))
+{
+       char **matches;
+
+       if (start == 0)
+               matches = rl_completion_matches (text, command_generator);
+       else
+               matches = rl_completion_matches (text, filename_generator);
+
+       return (matches);
+}
+
+static void 
+initialize_readline(void) 
+{
+       rl_readline_name = "dump";
+       rl_attempted_completion_function = restore_completion;
+       rl_completion_entry_function = NULL;
+#if HAVE_READLINE_CAC  /* compile with readline 2.0 */
+       rl_completion_append_character = '\0';
+#endif
+       rl_instream = terminal;
+}
+
 #endif /* HAVE_READLINE */