X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Fmain.c;h=6bf9a53718a1e40abcb6a081376e654b0b08c332;hb=f3f3530092fa8ae03415d495c35c6dc63c1bf643;hp=c2e4eaf329c94e77e671c50915ec4e027313d792;hpb=79e318657e7faa7b2951ff554dc6f1b92624a477;p=dump.git diff --git a/dump/main.c b/dump/main.c index c2e4eaf..6bf9a53 100644 --- a/dump/main.c +++ b/dump/main.c @@ -40,7 +40,7 @@ #ifndef lint static const char rcsid[] = - "$Id: main.c,v 1.23 2000/08/19 23:48:10 stelian Exp $"; + "$Id: main.c,v 1.26 2000/09/26 12:34:52 stelian Exp $"; #endif /* not lint */ #include @@ -79,6 +79,7 @@ static const char rcsid[] = #include "dump.h" #include "pathnames.h" +#include "bylabel.h" #ifndef SBOFF #define SBOFF (SBLOCK * DEV_BSIZE) @@ -126,6 +127,7 @@ main(int argc, char *argv[]) #endif time_t tnow; char labelstr[LBLSIZE]; + char *diskparam; spcl.c_date = 0; #ifdef __linux__ @@ -200,8 +202,15 @@ main(int argc, char *argv[]) /* 04-Feb-00 ILC */ case 'e': /* exclude an inode */ - iexclude_list[iexclude_num++] = - numarg("inode to exclude",0L,0L); + if (iexclude_num == IEXCLUDE_MAXNUM) { + (void)fprintf(stderr, "Too many -e options\n"); + exit(X_STARTUP); + } + iexclude_list[iexclude_num++] = numarg("inode to exclude",0L,0L); + if (iexclude_list[iexclude_num-1] <= ROOTINO) { + (void)fprintf(stderr, "Cannot exclude inode %ld\n", iexclude_list[iexclude_num-1]); + exit(X_STARTUP); + } msg("Added %d to exclude list\n", iexclude_list[iexclude_num-1]); break; @@ -287,9 +296,9 @@ main(int argc, char *argv[]) (void)fprintf(stderr, "Must specify disk or filesystem\n"); exit(X_STARTUP); } - disk = *argv++; - if (strlen(disk) >= MAXPATHLEN) { - (void)fprintf(stderr, "Disk or filesystem name too long: %s\n", disk); + diskparam = *argv++; + if (strlen(diskparam) >= MAXPATHLEN) { + (void)fprintf(stderr, "Disk or filesystem name too long: %s\n", diskparam); exit(X_STARTUP); } argc--; @@ -363,6 +372,14 @@ main(int argc, char *argv[]) signal(SIGINT, SIG_IGN); set_operators(); /* /etc/group snarfed */ getfstab(); /* /etc/fstab snarfed */ + + disk = get_device_name(diskparam); + if (!disk) { /* null means the disk is some form + of LABEL= or UID= but it was not + found */ + msg("Cannot find a disk having %s\n", diskparam); + exit(X_STARTUP); + } /* * disk may end in / and this can confuse * fstabsearch. @@ -381,26 +398,36 @@ main(int argc, char *argv[]) (void)strncpy(spcl.c_filesys, dt->fs_file, NAMELEN); #ifdef __linux__ } else { - /* - * The argument was not found in the fstab - * assume that this is a subtree and search for it - */ #ifdef HAVE_REALPATH if (realpath(disk, pathname) == NULL) #endif strcpy(pathname, disk); - dt = fstabsearchdir(pathname, directory); - if (dt != NULL) { - char name[MAXPATHLEN]; - (void)strncpy(spcl.c_dev, dt->fs_spec, NAMELEN); - (void)snprintf(name, sizeof(name), "%s (dir %s)", - dt->fs_file, directory); - (void)strncpy(spcl.c_filesys, name, NAMELEN); + /* + * The argument could be now a mountpoint of + * a filesystem specified in fstab. Search for it. + */ + if ((dt = fstabsearch(pathname)) != NULL) { disk = rawname(dt->fs_spec); + (void)strncpy(spcl.c_dev, dt->fs_spec, NAMELEN); + (void)strncpy(spcl.c_filesys, dt->fs_file, NAMELEN); } else { - (void)strncpy(spcl.c_dev, disk, NAMELEN); - (void)strncpy(spcl.c_filesys, "an unlisted file system", - NAMELEN); + /* + * The argument was not found in the fstab + * assume that this is a subtree and search for it + */ + dt = fstabsearchdir(pathname, directory); + if (dt != NULL) { + char name[MAXPATHLEN]; + (void)strncpy(spcl.c_dev, dt->fs_spec, NAMELEN); + (void)snprintf(name, sizeof(name), "%s (dir %s)", + dt->fs_file, directory); + (void)strncpy(spcl.c_filesys, name, NAMELEN); + disk = rawname(dt->fs_spec); + } else { + (void)strncpy(spcl.c_dev, disk, NAMELEN); + (void)strncpy(spcl.c_filesys, "an unlisted file system", + NAMELEN); + } } } #else @@ -421,7 +448,6 @@ main(int argc, char *argv[]) exit(X_STARTUP); } } - spcl.c_dev[NAMELEN-1]='\0'; spcl.c_filesys[NAMELEN-1]='\0'; (void)strncpy(spcl.c_label, labelstr, sizeof(spcl.c_label) - 1);