]> git.wh0rd.org - dump.git/commitdiff
Added readline capabilities to interactive restore.
authorStelian Pop <stelian@popies.net>
Mon, 29 May 2000 14:17:37 +0000 (14:17 +0000)
committerStelian Pop <stelian@popies.net>
Mon, 29 May 2000 14:17:37 +0000 (14:17 +0000)
CHANGES
TODO
config.h.in
configure
configure.in
dump.spec
restore/Makefile.in
restore/interactive.c

diff --git a/CHANGES b/CHANGES
index f6703a9e8d6403178a7f20c9e7e9e4de3636adcb..f3764a0d040d0fa1058608453ce945ce44537a8c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,4 @@
-$Id: CHANGES,v 1.58 2000/05/28 18:16:42 stelian Exp $
+$Id: CHANGES,v 1.59 2000/05/29 14:17:37 stelian Exp $
 
 Changes between versions 0.4b16 and 0.4b17 (released ??????????????)
 ====================================================================
@@ -21,6 +21,9 @@ Changes between versions 0.4b16 and 0.4b17 (released ??????????????)
 5.     Small fixes in order to allow dump to compile with a 
        really old e2fsprogs version.
 
+6.     Add GNU readline capabilities to interactive restore.
+       Use configure's --enable-readline flag to enable this feature.
+
 Changes between versions 0.4b15 and 0.4b16 (released March 11, 2000)
 ====================================================================
 
diff --git a/TODO b/TODO
index 0a6f1a750f108b1cc5128a979139cd4b79ffecb1..590a3e4bc236b4a8490fb1da64d3702bd3f1de9f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
-$Id: TODO,v 1.14 2000/05/28 18:16:42 stelian Exp $
+$Id: TODO,v 1.15 2000/05/29 14:17:37 stelian Exp $
 
 Need to verify:
 ---------------
@@ -44,9 +44,6 @@ All others:
             ufsrestore(1M) to determine whether a file  is  in
             the dump file that is being restored.
 
-9.     Add readline capabilities to interactive restore. Does
-       this mean huge static restore or not?
-
-10.    Do the compare on the fly in restore C mode (useful
+9.     Do the compare on the fly in restore C mode (useful
        when comparing huge files and you have not enough space
        in /tmp).
index c3d882c816590c750efd919bdc6daebbe9a448f1..57b52470d3de44bf5feac78f503135b92d710bc8 100644 (file)
@@ -41,3 +41,6 @@
 
 /* Define if you have the lchown function.  */
 #undef HAVE_LCHOWN
+
+/* Define if you want to include readline support.  */
+#undef HAVE_READLINE
index 60c7d2da8e778b3cd62c5f42801bb296f10f8a30..74aaaa80d6c3be9ba562dff48ba210533ca7d4b9 100755 (executable)
--- a/configure
+++ b/configure
@@ -19,6 +19,8 @@ ac_help="$ac_help
   --enable-rmt            compile and install rmt"
 ac_help="$ac_help
   --enable-kerberos       compile kerberos extensions"
+ac_help="$ac_help
+  --enable-readline       enable readline support in restore"
 ac_help="$ac_help
   --with-cc=COMPILER      select compiler to use"
 ac_help="$ac_help
@@ -558,7 +560,7 @@ MCONFIG=./MCONFIG
 
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:562: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:564: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -585,7 +587,7 @@ else
 fi
 
 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:589: checking whether ln -s works" >&5
+echo "configure:591: checking whether ln -s works" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -608,7 +610,7 @@ fi
 # Extract the first word of "cp", so it can be a program name with args.
 set dummy cp; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:612: checking for $ac_word" >&5
+echo "configure:614: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_CP'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -644,7 +646,7 @@ fi
 # Extract the first word of "mv", so it can be a program name with args.
 set dummy mv; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:648: checking for $ac_word" >&5
+echo "configure:650: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_MV'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -680,7 +682,7 @@ fi
 # Extract the first word of "rm", so it can be a program name with args.
 set dummy rm; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:684: checking for $ac_word" >&5
+echo "configure:686: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_RM'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -739,7 +741,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
 fi
 
 echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:743: checking host system type" >&5
+echo "configure:745: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -760,7 +762,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 echo "$ac_t""$host" 1>&6
 
 echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:764: checking build system type" >&5
+echo "configure:766: checking build system type" >&5
 
 build_alias=$build
 case "$build_alias" in
@@ -786,7 +788,7 @@ fi
 # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ar; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:790: checking for $ac_word" >&5
+echo "configure:792: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -818,7 +820,7 @@ if test -n "$ac_tool_prefix"; then
   # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:822: checking for $ac_word" >&5
+echo "configure:824: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -853,7 +855,7 @@ fi
 # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:857: checking for $ac_word" >&5
+echo "configure:859: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -885,7 +887,7 @@ if test -n "$ac_tool_prefix"; then
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:889: checking for $ac_word" >&5
+echo "configure:891: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -920,7 +922,7 @@ fi
 # Extract the first word of "${ac_tool_prefix}patch", so it can be a program name with args.
 set dummy ${ac_tool_prefix}patch; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:924: checking for $ac_word" >&5
+echo "configure:926: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_PATCH'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -952,7 +954,7 @@ if test -n "$ac_tool_prefix"; then
   # Extract the first word of "patch", so it can be a program name with args.
 set dummy patch; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:956: checking for $ac_word" >&5
+echo "configure:958: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_PATCH'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -987,7 +989,7 @@ fi
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:991: checking for $ac_word" >&5
+echo "configure:993: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1017,7 +1019,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1021: checking for $ac_word" >&5
+echo "configure:1023: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1068,7 +1070,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1072: checking for $ac_word" >&5
+echo "configure:1074: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1100,7 +1102,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1104: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1106: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -1111,12 +1113,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 1115 "configure"
+#line 1117 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:1120: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1122: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -1142,12 +1144,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1146: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1148: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1151: checking whether we are using GNU C" >&5
+echo "configure:1153: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1156,7 +1158,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1160: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1162: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -1175,7 +1177,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1179: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1181: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1218,7 +1220,7 @@ fi
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1222: checking for a BSD compatible install" >&5
+echo "configure:1224: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1347,6 +1349,28 @@ fi
 
 
 
+# Check whether --enable-readline or --disable-readline was given.
+if test "${enable_readline+set}" = set; then
+  enableval="$enable_readline"
+  if test "$enableval" = "no"
+then
+       READLINE=""
+else
+       READLINE="-lreadline"
+       cat >> confdefs.h <<\EOF
+#define HAVE_READLINE 1
+EOF
+
+fi
+
+else
+  READLINE=""
+echo "Not including readline support by default"
+
+fi
+
+
+
 # Check whether --with-cc or --without-cc was given.
 if test "${with_cc+set}" = set; then
   withval="$with_cc"
@@ -1477,7 +1501,7 @@ fi
 
 
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1481: checking how to run the C preprocessor" >&5
+echo "configure:1505: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -1492,13 +1516,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 1496 "configure"
+#line 1520 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1502: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1526: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1509,13 +1533,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 1513 "configure"
+#line 1537 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1519: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1543: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1526,13 +1550,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 1530 "configure"
+#line 1554 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1536: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1560: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1558,17 +1582,17 @@ echo "$ac_t""$CPP" 1>&6
 
 ac_safe=`echo "ext2fs/ext2fs.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ext2fs/ext2fs.h""... $ac_c" 1>&6
-echo "configure:1562: checking for ext2fs/ext2fs.h" >&5
+echo "configure:1586: checking for ext2fs/ext2fs.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1567 "configure"
+#line 1591 "configure"
 #include "confdefs.h"
 #include <ext2fs/ext2fs.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1572: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1596: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1591,7 +1615,7 @@ ext2fs_h=no
 fi
 
 echo $ac_n "checking for ext2fs_open in -lext2fs""... $ac_c" 1>&6
-echo "configure:1595: checking for ext2fs_open in -lext2fs" >&5
+echo "configure:1619: checking for ext2fs_open in -lext2fs" >&5
 ac_lib_var=`echo ext2fs'_'ext2fs_open | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1599,7 +1623,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lext2fs -lcom_err $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1603 "configure"
+#line 1627 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1610,7 +1634,7 @@ int main() {
 ext2fs_open()
 ; return 0; }
 EOF
-if { (eval echo configure:1614: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1638: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1635,15 +1659,96 @@ if test "$ext2fs_h" = no -o "$ext2fs_lib" = no; then
        { echo "configure: error: You need to install the Ext2fs libraries from the E2fsprogs distribution first - hint: make install-libs" 1>&2; exit 1; }
 fi
 
+ac_safe=`echo "readline/readline.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for readline/readline.h""... $ac_c" 1>&6
+echo "configure:1665: checking for readline/readline.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1670 "configure"
+#include "confdefs.h"
+#include <readline/readline.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1675: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  readline_h=yes
+else
+  echo "$ac_t""no" 1>&6
+readline_h=no
+fi
+
+echo $ac_n "checking for readline in -lreadline""... $ac_c" 1>&6
+echo "configure:1698: checking for readline in -lreadline" >&5
+ac_lib_var=`echo readline'_'readline | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lreadline  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1706 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char readline();
+
+int main() {
+readline()
+; return 0; }
+EOF
+if { (eval echo configure:1717: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  readline_lib=yes
+else
+  echo "$ac_t""no" 1>&6
+readline_lib=no
+fi
+
+if test "$readline_h" = no -o "$readline_lib" = no; then
+       if test "$READLINE" = "-lreadline"; then
+               { echo "configure: error: You need to install the GNU readline libraries first" 1>&2; exit 1; }
+       fi
+fi
+
 for ac_func in err errx verr verrx vwarn vwarnx warn warnx realpath lchown
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1642: checking for $ac_func" >&5
+echo "configure:1747: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1647 "configure"
+#line 1752 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1666,7 +1771,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1691,12 +1796,12 @@ fi
 done
 
 echo $ac_n "checking for glob""... $ac_c" 1>&6
-echo "configure:1695: checking for glob" >&5
+echo "configure:1800: checking for glob" >&5
 if eval "test \"`echo '$''{'ac_cv_func_glob'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1700 "configure"
+#line 1805 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char glob(); below.  */
@@ -1719,7 +1824,7 @@ glob();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1723: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1828: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_glob=yes"
 else
@@ -1741,7 +1846,7 @@ fi
 
 if test "$ac_cv_func_glob" = "yes"; then
        cat > conftest.$ac_ext <<EOF
-#line 1745 "configure"
+#line 1850 "configure"
 #include "confdefs.h"
 
 #      include <glob.h>
@@ -1769,12 +1874,12 @@ rm -f conftest*
 fi
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1773: checking for ANSI C header files" >&5
+echo "configure:1878: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1778 "configure"
+#line 1883 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -1782,7 +1887,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1786: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1891: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1799,7 +1904,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1803 "configure"
+#line 1908 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -1817,7 +1922,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1821 "configure"
+#line 1926 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -1838,7 +1943,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 1842 "configure"
+#line 1947 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1849,7 +1954,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:1853: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -1873,12 +1978,12 @@ EOF
 fi
 
 echo $ac_n "checking for quad_t""... $ac_c" 1>&6
-echo "configure:1877: checking for quad_t" >&5
+echo "configure:1982: checking for quad_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_quad_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1882 "configure"
+#line 1987 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -1906,12 +2011,12 @@ EOF
 fi
 
 echo $ac_n "checking for u_quad_t""... $ac_c" 1>&6
-echo "configure:1910: checking for u_quad_t" >&5
+echo "configure:2015: checking for u_quad_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_u_quad_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1915 "configure"
+#line 2020 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2107,6 +2212,7 @@ s%@RESTOREDEBUG@%$RESTOREDEBUG%g
 s%@STATIC@%$STATIC%g
 s%@RMTDIR@%$RMTDIR%g
 s%@OPTDEFS@%$OPTDEFS%g
+s%@READLINE@%$READLINE%g
 s%@LD@%$LD%g
 s%@CCOPTS@%$CCOPTS%g
 s%@BINOWNER@%$BINOWNER%g
index 6cf0b35234c10a5aede24808c6228f028b727e8c..00038cdae2a7e98f36fd63227ade9ab0e1ffb677 100644 (file)
@@ -91,6 +91,24 @@ echo "Not compiling kerberos extensions by default"
 )
 AC_SUBST(OPTDEFS)
 
+dnl
+dnl Handle --enable-readline
+dnl
+AC_ARG_ENABLE([readline],
+[  --enable-readline       enable readline support in restore],
+if test "$enableval" = "no"
+then
+       READLINE=""
+else
+       READLINE="-lreadline"
+       AC_DEFINE(HAVE_READLINE)
+fi
+,
+READLINE=""
+echo "Not including readline support by default"
+)
+AC_SUBST(READLINE)
+
 dnl
 dnl set $(CC) from --with-cc=value
 dnl
@@ -229,6 +247,17 @@ if test "$ext2fs_h" = no -o "$ext2fs_lib" = no; then
        AC_MSG_ERROR(You need to install the Ext2fs libraries from the E2fsprogs distribution first - hint: make install-libs)
 fi
 
+dnl
+dnl Check for readline headers and libraries
+dnl
+AC_CHECK_HEADER(readline/readline.h, [readline_h=yes], [readline_h=no])
+AC_CHECK_LIB(readline, readline, [readline_lib=yes], [readline_lib=no])
+if test "$readline_h" = no -o "$readline_lib" = no; then
+       if test "$READLINE" = "-lreadline"; then
+               AC_MSG_ERROR(You need to install the GNU readline libraries first)
+       fi
+fi
+
 dnl
 dnl Check for library functions
 dnl
index 55a9c203956ad64570c5a81dff06fb90367f91df..4306f84f4b11a64c28856b4ec96fc08584673b78 100644 (file)
--- a/dump.spec
+++ b/dump.spec
@@ -61,7 +61,7 @@ mv restore/restore restore/restore.static
 
 make distclean
 
-./configure --prefix=/usr --with-binmode=6755 --with-manowner=root --with-mangrp=root --with-manmode=0644 --enable-rmt
+./configure --prefix=/usr --with-binmode=6755 --with-manowner=root --with-mangrp=root --with-manmode=0644 --enable-rmt --enable-readline
 
 make OPT="$RPM_OPT_FLAGS -Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wno-char-subscripts"
 
index 686a185cb0af23f39de5afcba96ab4690468dbd2..323d14f52240615775056a215c4a638868233d07 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: Makefile.in,v 1.4 1999/10/11 13:31:12 stelian Exp $
+# $Id: Makefile.in,v 1.5 2000/05/29 14:17:37 stelian Exp $
 
 top_srcdir=    @top_srcdir@
 srcdir=                @srcdir@
@@ -7,7 +7,7 @@ srcdir=         @srcdir@
 
 CFLAGS=                @CCOPTS@ -pipe $(OPT) $(DEFS) $(GINC) $(INC) @RESTOREDEBUG@
 LDFLAGS:=      $(LDFLAGS) @STATIC@
-LIBS=          $(GLIBS) -le2p
+LIBS=          $(GLIBS) -le2p @READLINE@
 DEPLIBS=       ../compat/lib/libcompat.a
 
 PROG=          restore
index 4fbdf6e8a0200f6259ce08a66c5388a4ae159a2a..d8854c663e84523364ddb21df32b52b82e051ae6 100644 (file)
@@ -40,7 +40,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: interactive.c,v 1.10 2000/05/28 17:50:27 stelian Exp $";
+       "$Id: interactive.c,v 1.11 2000/05/29 14:17:37 stelian Exp $";
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -71,6 +71,17 @@ extern char * __progname;
 #include "restore.h"
 #include "extern.h"
 
+#if HAVE_READLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+
+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);
+#endif
+
 #define round(a, b) (((a) + (b) - 1) / (b) * (b))
 
 /*
@@ -119,6 +130,9 @@ runcmdshell(void)
        char name[MAXPATHLEN];
        char cmd[BUFSIZ];
 
+#if HAVE_READLINE
+       initialize_readline();
+#endif
        arglist.freeglob = 0;
        arglist.argcnt = 0;
        arglist.glob.gl_flags = GLOB_ALTDIRFUNC;
@@ -351,6 +365,9 @@ getcmd(char *curdir, char *cmd, char *name, int size, struct arglist *ap)
        /*
         * Read a command line and trim off trailing white space.
         */
+#if HAVE_READLINE
+       snprintf(input, BUFSIZ, "%s\n", rl_gets(curdir));
+#else
        do      {
                if (pflag)
                        fprintf(stderr, "%s:%s:%s > ", 
@@ -366,6 +383,7 @@ getcmd(char *curdir, char *cmd, char *name, int size, struct arglist *ap)
                (void) strcpy(cmd, "quit");
                return;
        }
+#endif
        for (cp = &input[strlen(input) - 2]; *cp == ' ' || *cp == '\t'; cp--)
                /* trim off trailing white space and newline */;
        *++cp = '\0';
@@ -807,3 +825,197 @@ onintr(int signo)
                exit(1);
        errno = save_errno;
 }
+
+
+#if HAVE_READLINE
+
+/* A static variable for holding the line. */
+static char *line_read = NULL;
+
+static char completion_curdir[MAXPATHLEN];
+
+static char *commands[] = { 
+       "add ", "cd ", "delete ", "extract ", "help ", 
+       "? ", "ls ", "pwd ", "prompt ", "quit ", "xit ", 
+       "verbose ", "setmodes ", "what ", "Debug ",
+       NULL };
+
+static char *files = NULL;
+
+static char *
+rl_gets (char *dir)
+{
+       char *prompt;
+       int sz;
+
+       snprintf(completion_curdir, MAXPATHLEN, "%s", dir);
+       completion_curdir[MAXPATHLEN - 1] = '\0';
+
+       if (pflag) {
+               sz = 6 + strlen(__progname) + strlen(spcl.c_filesys) + strlen((completion_curdir + 1 ? completion_curdir + 1 : "/"));
+               prompt = (char *)malloc(sz);
+               if (!prompt)
+                       return NULL;
+               snprintf(prompt, sz, "%s:%s:%s > ", 
+                       __progname,
+                       spcl.c_filesys, 
+                       (completion_curdir + 1 ? completion_curdir + 1 : "/"));
+       }
+       else {
+               sz = 4 + strlen(__progname);
+               prompt = (char *)malloc(sz);
+               if (!prompt)
+                       return NULL;
+               snprintf(prompt, sz, "%s > ", __progname);
+       }
+       prompt[sz - 1] = '\0';
+
+       if (line_read) {
+               free (line_read);
+               line_read = (char *)NULL;
+       }
+
+       do {
+               line_read = readline (prompt);
+       } while (line_read && !*line_read);
+
+       free(prompt);
+
+       if (!line_read) {
+               printf("\n");
+               return strdup("quit");
+       }
+
+       add_history (line_read);
+
+       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';
+}
+
+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)
+{
+       static int list_index, len;
+       char *name;
+
+       if (!state) {
+               list_index = 0;
+               len = strlen(text);
+       }
+
+       while ( (name = commands[list_index]) != NULL) {
+
+               list_index ++;
+
+               if (strncmp(name, text, len) == 0)
+                       return strdup(name);
+       }
+
+       return NULL;
+}
+
+static char *
+filename_generator(char *text, int state)
+{
+       static int list_index;
+       char *name;
+       RST_DIR *dirp;
+       struct direct *dp;
+       static int entries;
+       char pname[MAXPATHLEN];
+       char fname[MAXPATHLEN];
+       char *slash;
+       char ppname[MAXPATHLEN];
+
+       if (!state) {
+               list_index = 0;
+
+               if (files != NULL) {
+                       free(files);
+                       entries = 0;
+                       files = NULL;
+               }
+               if ((slash = strrchr(text, '/')) != NULL) {
+                       int idx = slash - text;
+                       if (idx > MAXPATHLEN - 2)
+                               idx = MAXPATHLEN - 2;
+                       strncpy(ppname, text, MAXPATHLEN);
+                       ppname[MAXPATHLEN - 1] = '\0';
+                       ppname[idx] = '\0';
+                       if (text[0] == '/')
+                               snprintf(pname, MAXPATHLEN, ".%s", ppname);
+                       else
+                               snprintf(pname, MAXPATHLEN, "%s/%s", completion_curdir, ppname);
+                       strncpy(fname, ppname + idx + 1, MAXPATHLEN);
+                       ppname[idx] = '/';
+                       ppname[idx + 1] = '\0';
+               }
+               else {
+                       strncpy(pname, completion_curdir, MAXPATHLEN);
+                       strncpy(fname, text, MAXPATHLEN);
+                       ppname[0] = '\0';
+               }
+               pname[MAXPATHLEN - 1] = '\0';
+               fname[MAXPATHLEN - 1] = '\0';
+               if ((dirp = rst_opendir(pname)) == NULL)
+                       return NULL;
+               entries = 0;
+               while ((dp = rst_readdir(dirp)))
+                       entries++;
+               rst_closedir(dirp);
+               files = (char *)malloc(entries * MAXPATHLEN);
+               if (files == NULL) {
+                       fprintf(stderr, "Out of memory\n");
+                       entries = 0;
+                       return NULL;
+               }
+               if ((dirp = rst_opendir(pname)) == NULL)
+                       panic("directory reopen failed\n");
+               entries = 0;
+               while ((dp = rst_readdir(dirp))) {
+                        if (TSTINO(dp->d_ino, dumpmap) == 0)
+                                continue;
+                       if (strcmp(dp->d_name, ".") == 0 ||
+                           strcmp(dp->d_name, "..") == 0)
+                               continue;
+                       if (strncmp(dp->d_name, fname, strlen(fname)) == 0) {
+                               if (inodetype(dp->d_ino) == NODE)
+                                       snprintf(files + entries * MAXPATHLEN, MAXPATHLEN, "%s%s/", ppname, dp->d_name);
+                               else
+                                       snprintf(files + entries * MAXPATHLEN, MAXPATHLEN, "%s%s ", ppname, dp->d_name);
+                               *(files + (entries + 1) * MAXPATHLEN - 1) = '\0';
+                               ++entries;
+                       }
+                 }
+                 rst_closedir(dirp);
+       }
+
+       if (list_index >= entries)
+               return NULL;
+
+       name = strdup(files + list_index * MAXPATHLEN);
+       list_index ++;
+
+       return name;
+}
+#endif /* HAVE_READLINE */