* Ported to Linux's Second Extended File System as part of the
* dump and restore backup suit
* Remy Card <card@Linux.EU.Org>, 1994-1997
- * Stelian Pop <pop@cybercable.fr>, 1999
- *
+ * Stelian Pop <pop@cybercable.fr>, 1999-2000
*/
/*
*/
#ifndef lint
-#if 0
-static char sccsid[] = "@(#)interactive.c 8.5 (Berkeley) 5/1/95";
-#endif
static const char rcsid[] =
- "$Id: interactive.c,v 1.3 1999/10/11 12:59:20 stelian Exp $";
+ "$Id: interactive.c,v 1.9 2000/02/26 01:35:48 stelian Exp $";
#endif /* not lint */
#include <sys/param.h>
static int runshell;
static jmp_buf reset;
static char *nextarg = NULL;
-
+static int pflag = 0; /* prompt mode */
/*
* Structure and routines associated with listing directories.
*/
if (strncmp(cmd, "help", strlen(cmd)) != 0)
goto bad;
case '?':
- fprintf(stderr, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ fprintf(stderr, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
"Available commands are:\n",
"\tls [arg] - list directory\n",
"\tcd arg - change directory\n",
"\twhat - list dump header information\n",
"\tverbose - toggle verbose flag",
" (useful with ``ls'')\n",
+ "\tprompt - toggle the prompt display\n",
"\thelp or `?' - print this list\n",
"If no `arg' is supplied, the current",
" directory is used\n");
* Print current directory.
*/
case 'p':
- if (strncmp(cmd, "pwd", strlen(cmd)) != 0)
- goto bad;
- if (curdir[1] == '\0')
- fprintf(stderr, "/\n");
- else
- fprintf(stderr, "%s\n", &curdir[1]);
+ if (strncmp(cmd, "pwd", strlen(cmd)) == 0) {
+ if (curdir[1] == '\0')
+ fprintf(stderr, "/\n");
+ else
+ fprintf(stderr, "%s\n", &curdir[1]);
+ }
+ /*
+ * Toggle prompt mode.
+ */
+ else if (strncmp(cmd, "prompt", strlen(cmd)) == 0) {
+ if (pflag) {
+ fprintf(stderr, "prompt mode off\n");
+ pflag = 0;
+ break;
+ }
+ fprintf(stderr, "prompt mode on\n");
+ pflag++;
+ break;
+ }
+ else goto bad;
break;
/*
* Quit.
* Read a command line and trim off trailing white space.
*/
do {
- fprintf(stderr, "%s > ", __progname);
+ if (pflag)
+ fprintf(stderr, "%s:%s:%s > ",
+ __progname,
+ spcl.c_filesys,
+ curdir[1] ? &curdir[1] : "/");
+ else
+ fprintf(stderr, "%s > ", __progname);
(void) fflush(stderr);
(void) fgets(input, BUFSIZ, terminal);
} while (!feof(terminal) && input[0] == '\n');
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++;
}
fp->postfix = '#';
break;
+#ifndef __linux__
+ /* no need for this */
case DT_WHT:
fp->postfix = '%';
break;
+#endif
case DT_UNKNOWN:
case DT_DIR:
for (j = 0; j < columns; j++) {
fp = &list[j * lines + i];
if (vflag) {
- fprintf(stderr, "%*ld ", precision, fp->fnum);
+ fprintf(stderr, "%*ld ", precision, (long)fp->fnum);
fp->len += precision + 1;
}
if (haveprefix) {
* 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 <dirent.h>
#undef d_ino
-#endif /* __linux__ */
+#endif /* ! __linux__ */
struct dirent *
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)
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);
}
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))