X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Fmain.c;h=61afed803398fa5e486422f35a03e80949013399;hb=4f4eee3d2e237c2f0becd9c5ce41524f8f5bc1c1;hp=c2e4eaf329c94e77e671c50915ec4e027313d792;hpb=79e318657e7faa7b2951ff554dc6f1b92624a477;p=dump.git diff --git a/dump/main.c b/dump/main.c index c2e4eaf..61afed8 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.27 2000/11/10 13:22:10 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__ @@ -141,6 +143,7 @@ main(int argc, char *argv[]) #endif tsize = 0; /* Default later, based on 'c' option for cart tapes */ + unlimited = 1; eot_script = NULL; if ((tapeprefix = getenv("TAPE")) == NULL) tapeprefix = _PATH_DEFTAPE; @@ -173,6 +176,7 @@ main(int argc, char *argv[]) break; case 'B': /* blocks per output file */ + unlimited = 0; blocksperfile = numarg("number of blocks per file", 1L, 0L); break; @@ -189,10 +193,12 @@ main(int argc, char *argv[]) break; case 'c': /* Tape is cart. not 9-track */ + unlimited = 0; cartridge = 1; break; case 'd': /* density, in bits per inch */ + unlimited = 0; density = numarg("density", 10L, 327670L) / 10; if (density >= 625 && !bflag) ntrec = HIGHDENSITYTREC; @@ -200,8 +206,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; @@ -250,6 +263,7 @@ main(int argc, char *argv[]) break; case 's': /* tape size, feet */ + unlimited = 0; tsize = numarg("tape size", 1L, 0L) * 12 * 10; break; @@ -287,9 +301,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 +377,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 +403,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 +453,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);