diff --git a/HISTORY b/HISTORY index 4050dbc19..9a8de494c 100644 --- a/HISTORY +++ b/HISTORY @@ -1,11 +1,3 @@ -util-linux 2.12 - -* losetup: -p option specifies fd for passphrase -* fdisk: sgi layout fix -* mount: -p option specifies fd for passphrase -* mount: recognize some PCDOS floppies -* umount: in "umount name", first try to interpret "name" as a mount point - util-linux 2.12pre * Catalan messages (Antoni Bella Perez) diff --git a/VERSION b/VERSION index 3e162f02e..b86a93044 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.12 +2.12pre diff --git a/fdisk/fdisksgilabel.c b/fdisk/fdisksgilabel.c index 2359e17bf..ce05418e5 100644 --- a/fdisk/fdisksgilabel.c +++ b/fdisk/fdisksgilabel.c @@ -190,10 +190,12 @@ check_sgi_label() { void sgi_list_table(int xtra) { - int i, w, wd; + int i, w; int kpi = 0; /* kernel partition ID */ char *type; + w = strlen(disk_device); + if (xtra) { printf(_("\nDisk %s (SGI disk label): %d heads, %d sectors\n" "%d cylinders, %d physical cylinders\n" @@ -213,15 +215,9 @@ sgi_list_table(int xtra) { disk_device, heads, sectors, cylinders, str_units(PLURAL), units_per_sector); } - - w = strlen(disk_device); - wd = strlen(_("Device")); - if (w < wd) - w = wd; - printf(_("----- partitions -----\n" "Pt# %*s Info Start End Sectors Id System\n"), - w + 2, _("Device")); + w + 1, _("Device")); for (i = 0 ; i < partitions; i++) { if (sgi_get_num_sectors(i) || debug) { __u32 start = sgi_get_start_sector(i); @@ -230,7 +226,7 @@ sgi_list_table(int xtra) { printf( "%2d: %s %4s %9ld %9ld %9ld %2x %s\n", /* fdisk part number */ i+1, -/* device */ partname(disk_device, kpi, w+3), +/* device */ partname(disk_device, kpi, w+2), /* flags */ (sgi_get_swappartition() == i) ? "swap" : /* flags */ (sgi_get_bootpartition() == i) ? "boot" : " ", /* start */ (long) scround(start), diff --git a/mount/Makefile b/mount/Makefile index 964349412..5e5ca58a4 100644 --- a/mount/Makefile +++ b/mount/Makefile @@ -72,7 +72,7 @@ mount.o: $(LIB)/setproctitle.h mount.o umount.o getusername.o: getusername.h -mount.o umount.o losetup.o lomount.o: lomount.h loop.h my_dev_t.h +mount.o umount.o losetup.o lomount.o: lomount.h loop.h swapon.o: swap_constants.h swapargs.h @@ -118,9 +118,12 @@ nfsmount.o: nfs_mount4.h swapargs.h: sh swap.configure +loop.h: + sh mk_loop_h + clean: rm -f a.out core *~ *.o swapargs.h $(PROGS) $(MAYBE) - rm -f nfs_mountversion.h + rm -f loop.h nfs_mountversion.h clobber distclean realclean: clean rm -f $(GEN_FILES) diff --git a/mount/fstab.c b/mount/fstab.c index 85a5d2df3..0d9b6e94f 100644 --- a/mount/fstab.c +++ b/mount/fstab.c @@ -100,7 +100,7 @@ read_mntentchn(mntFILE *mfp, const char *fnam, struct mntentchn *mc0) { struct mntent *mnt; while ((mnt = my_getmntent (mfp)) != NULL) { - if (!streq(mnt->mnt_type, MNTTYPE_IGNORE)) { + if (!streq (mnt->mnt_type, MNTTYPE_IGNORE)) { mc->nxt = (struct mntentchn *) xmalloc(sizeof(*mc)); mc->nxt->prev = mc; mc = mc->nxt; @@ -179,62 +179,30 @@ getmntfile (const char *name) { mc0 = mtab_head(); for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) - if (streq(mc->m.mnt_dir, name) || - streq(mc->m.mnt_fsname, name)) + if (streq (mc->m.mnt_dir, name) || + streq (mc->m.mnt_fsname, name)) return mc; return NULL; } /* - * Given the directory name NAME, and the place MCPREV we found it last time, + * Given the name NAME, and the place MCPREV we found it last time, * try to find more occurrences. */ struct mntentchn * -getmntdirbackward (const char *name, struct mntentchn *mcprev) { +getmntfilesbackward (const char *name, struct mntentchn *mcprev) { struct mntentchn *mc, *mc0; mc0 = mtab_head(); if (!mcprev) mcprev = mc0; for (mc = mcprev->prev; mc && mc != mc0; mc = mc->prev) - if (streq(mc->m.mnt_dir, name)) + if (streq (mc->m.mnt_dir, name) || + streq (mc->m.mnt_fsname, name)) return mc; return NULL; } -/* - * Given the device name NAME, and the place MCPREV we found it last time, - * try to find more occurrences. - */ -struct mntentchn * -getmntdevbackward (const char *name, struct mntentchn *mcprev) { - struct mntentchn *mc, *mc0; - - mc0 = mtab_head(); - if (!mcprev) - mcprev = mc0; - for (mc = mcprev->prev; mc && mc != mc0; mc = mc->prev) - if (streq(mc->m.mnt_fsname, name)) - return mc; - return NULL; -} - -/* - * Given the name NAME, check that it occurs precisely once as dir or dev. - */ -int -is_mounted_once(const char *name) { - struct mntentchn *mc, *mc0; - int ct = 0; - - mc0 = mtab_head(); - for (mc = mc0->prev; mc && mc != mc0; mc = mc->prev) - if (streq(mc->m.mnt_dir, name) || - streq(mc->m.mnt_fsname, name)) - ct++; - return (ct == 1); -} - /* Given the name FILE, try to find the option "loop=FILE" in mtab. */ struct mntentchn * getmntoptfile (const char *file) { @@ -285,29 +253,29 @@ getfsspecfile (const char *spec, const char *file) { /* first attempt: names occur precisely as given */ for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) - if (streq(mc->m.mnt_dir, file) && - streq(mc->m.mnt_fsname, spec)) + if (streq (mc->m.mnt_dir, file) && + streq (mc->m.mnt_fsname, spec)) return mc; /* second attempt: names found after symlink resolution */ for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) - if ((streq(mc->m.mnt_dir, file) || - streq(canonicalize(mc->m.mnt_dir), file)) - && (streq(mc->m.mnt_fsname, spec) || - streq(canonicalize(mc->m.mnt_fsname), spec))) + if ((streq (mc->m.mnt_dir, file) || + streq (canonicalize(mc->m.mnt_dir), file)) + && (streq (mc->m.mnt_fsname, spec) || + streq (canonicalize(mc->m.mnt_fsname), spec))) return mc; /* third attempt: names found after LABEL= or UUID= resolution */ for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) { if (!strncmp (mc->m.mnt_fsname, "LABEL=", 6) && - (streq(mc->m.mnt_dir, file) || - streq(canonicalize(mc->m.mnt_dir), file))) { + (streq (mc->m.mnt_dir, file) || + streq (canonicalize(mc->m.mnt_dir), file))) { if (has_label(spec, mc->m.mnt_fsname+6)) return mc; } if (!strncmp (mc->m.mnt_fsname, "UUID=", 5) && - (streq(mc->m.mnt_dir, file) || - streq(canonicalize(mc->m.mnt_dir), file))) { + (streq (mc->m.mnt_dir, file) || + streq (canonicalize(mc->m.mnt_dir), file))) { if (has_uuid(spec, mc->m.mnt_fsname+5)) return mc; } @@ -322,7 +290,7 @@ getfsfile (const char *file) { mc0 = fstab_head(); for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) - if (streq(mc->m.mnt_dir, file)) + if (streq (mc->m.mnt_dir, file)) return mc; return NULL; } @@ -334,7 +302,7 @@ getfsspec (const char *spec) { mc0 = fstab_head(); for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt) - if (streq(mc->m.mnt_fsname, spec)) + if (streq (mc->m.mnt_fsname, spec)) return mc; return NULL; } @@ -563,7 +531,7 @@ update_mtab (const char *dir, struct mntent *instead) { /* find last occurrence of dir */ for (mc = mc0->prev; mc && mc != mc0; mc = mc->prev) - if (streq(mc->m.mnt_dir, dir)) + if (streq (mc->m.mnt_dir, dir)) break; if (mc && mc != mc0) { if (instead == NULL) { diff --git a/mount/fstab.h b/mount/fstab.h index b55b6b5b6..820f418a0 100644 --- a/mount/fstab.h +++ b/mount/fstab.h @@ -12,7 +12,6 @@ int mtab_is_writable(void); int mtab_does_not_exist(void); int mtab_is_a_symlink(void); -int is_mounted_once(const char *name); struct mntentchn { struct mntentchn *nxt, *prev; @@ -22,8 +21,7 @@ struct mntentchn { struct mntentchn *mtab_head (void); struct mntentchn *getmntfile (const char *name); struct mntentchn *getmntoptfile (const char *file); -struct mntentchn *getmntdirbackward (const char *dir, struct mntentchn *mc); -struct mntentchn *getmntdevbackward (const char *dev, struct mntentchn *mc); +struct mntentchn *getmntfilesbackward (const char *file, struct mntentchn *mc); struct mntentchn *fstab_head (void); struct mntentchn *getfsfile (const char *file); diff --git a/mount/h/loop.h b/mount/h/loop.h new file mode 100644 index 000000000..1bd7fa87a --- /dev/null +++ b/mount/h/loop.h @@ -0,0 +1,37 @@ +/* + * include/linux/loop.h + * + * Written by Theodore Ts'o, 3/29/93. + * + * Copyright 1993 by Theodore Ts'o. Redistribution of this file is + * permitted under the GNU Public License. + */ + +#define LO_NAME_SIZE 64 +#define LO_KEY_SIZE 32 + +struct loop_info { + int lo_number; /* ioctl r/o */ + dev_t lo_device; /* ioctl r/o */ + unsigned long lo_inode; /* ioctl r/o */ + dev_t lo_rdevice; /* ioctl r/o */ + int lo_offset; + int lo_encrypt_type; + int lo_encrypt_key_size; /* ioctl w/o */ + int lo_flags; /* ioctl r/o */ + char lo_name[LO_NAME_SIZE]; + unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ + unsigned long lo_init[2]; + char reserved[4]; +}; + +#define LO_CRYPT_NONE 0 +#define LO_CRYPT_XOR 1 +#define LO_CRYPT_DES 2 +#define LO_CRYPT_IDEA 3 +#define MAX_LO_CRYPT 4 + +#define LOOP_SET_FD 0x4C00 +#define LOOP_CLR_FD 0x4C01 +#define LOOP_SET_STATUS 0x4C02 +#define LOOP_GET_STATUS 0x4C03 diff --git a/mount/lomount.c b/mount/lomount.c index 0874f3ea0..97cd9a092 100644 --- a/mount/lomount.c +++ b/mount/lomount.c @@ -2,18 +2,13 @@ /* Added vfs mount options - aeb - 960223 */ /* Removed lomount - aeb - 960224 */ -/* - * 1999-02-22 Arkadiusz Mi¶kiewicz +/* 1999-02-22 Arkadiusz Mi¶kiewicz * - added Native Language Support - * 1999-03-21 Arnaldo Carvalho de Melo + * Sun Mar 21 1999 - Arnaldo Carvalho de Melo * - fixed strerr(errno) in gettext calls - * 2000-09-24 Marc Mutz - * - added -p option to pass passphrases via fd's to losetup/mount. - * Used for encryption in non-interactive environments. - * The idea behind xgetpass() is stolen from GnuPG, v.1.0.3. */ -#define LOOPMAJOR 7 +#define PROC_DEVICES "/proc/devices" /* * losetup.c - setup and control loop devices @@ -41,114 +36,93 @@ extern char *xstrdup (const char *s); /* not: #include "sundries.h" */ extern void error (const char *fmt, ...); /* idem */ #ifdef LOOP_SET_FD +struct crypt_type_struct { + int id; + char *name; +} crypt_type_tbl[] = { + { LO_CRYPT_NONE, "no" }, + { LO_CRYPT_NONE, "none" }, + { LO_CRYPT_XOR, "xor" }, + { LO_CRYPT_DES, "DES" }, + { -1, NULL } +}; -static int -loop_info64_to_old(const struct loop_info64 *info64, struct loop_info *info) -{ - memset(info, 0, sizeof(*info)); - info->lo_number = info64->lo_number; - info->lo_device = info64->lo_device; - info->lo_inode = info64->lo_inode; - info->lo_rdevice = info64->lo_rdevice; - info->lo_offset = info64->lo_offset; - info->lo_encrypt_type = info64->lo_encrypt_type; - info->lo_encrypt_key_size = info64->lo_encrypt_key_size; - info->lo_flags = info64->lo_flags; - info->lo_init[0] = info64->lo_init[0]; - info->lo_init[1] = info64->lo_init[1]; - if (info->lo_encrypt_type == LO_CRYPT_CRYPTOAPI) - memcpy(info->lo_name, info64->lo_crypt_name, LO_NAME_SIZE); - else - memcpy(info->lo_name, info64->lo_file_name, LO_NAME_SIZE); - memcpy(info->lo_encrypt_key, info64->lo_encrypt_key, LO_KEY_SIZE); +static int +crypt_type (const char *name) { + int i; - /* error in case values were truncated */ - if (info->lo_device != info64->lo_device || - info->lo_rdevice != info64->lo_rdevice || - info->lo_inode != info64->lo_inode || - info->lo_offset != info64->lo_offset) - return -EOVERFLOW; - - return 0; + if (name) { + for (i = 0; crypt_type_tbl[i].id != -1; i++) + if (!strcasecmp (name, crypt_type_tbl[i].name)) + return crypt_type_tbl[i].id; + } + return -1; } #ifdef MAIN +static char * +crypt_name (int id) { + int i; + + for (i = 0; crypt_type_tbl[i].id != -1; i++) + if (id == crypt_type_tbl[i].id) + return crypt_type_tbl[i].name; + return "undefined"; +} static int -show_loop(char *device) { +show_loop (char *device) { struct loop_info loopinfo; - struct loop_info64 loopinfo64; - int fd, errsv; + int fd; - if ((fd = open(device, O_RDONLY)) < 0) { + if ((fd = open (device, O_RDONLY)) < 0) { int errsv = errno; fprintf(stderr, _("loop: can't open device %s: %s\n"), device, strerror (errsv)); return 2; } - - if (ioctl(fd, LOOP_GET_STATUS64, &loopinfo64) == 0) { - - loopinfo64.lo_file_name[LO_NAME_SIZE-2] = '*'; - loopinfo64.lo_file_name[LO_NAME_SIZE-1] = 0; - loopinfo64.lo_crypt_name[LO_NAME_SIZE-1] = 0; - - printf("%s: [%04llx]:%llu (%s)", - device, loopinfo64.lo_device, loopinfo64.lo_inode, - loopinfo64.lo_file_name); - - if (loopinfo64.lo_offset) - printf(_(", offset %lld"), loopinfo64.lo_offset); - - if (loopinfo64.lo_sizelimit) - printf(_(", sizelimit %lld"), loopinfo64.lo_sizelimit); - - if (loopinfo64.lo_encrypt_type || - loopinfo64.lo_crypt_name[0]) { - char *e = loopinfo64.lo_crypt_name; - - if (*e == 0 && loopinfo64.lo_encrypt_type == 1) - e = "XOR"; - printf(_(", encryption %s (type %d)"), - e, loopinfo64.lo_encrypt_type); - } - printf("\n"); + if (ioctl (fd, LOOP_GET_STATUS, &loopinfo) < 0) { + int errsv = errno; + fprintf(stderr, _("loop: can't get info on device %s: %s\n"), + device, strerror (errsv)); close (fd); - return 0; + return 1; } - - if (ioctl(fd, LOOP_GET_STATUS, &loopinfo) == 0) { - printf ("%s: [%04x]:%ld (%s)", - device, loopinfo.lo_device, loopinfo.lo_inode, - loopinfo.lo_name); - - if (loopinfo.lo_offset) - printf(_(", offset %d"), loopinfo.lo_offset); - - if (loopinfo.lo_encrypt_type) - printf(_(", encryption type %d\n"), - loopinfo.lo_encrypt_type); - - printf("\n"); - close (fd); - return 0; - } - - errsv = errno; - fprintf(stderr, _("loop: can't get info on device %s: %s\n"), - device, strerror (errsv)); + printf (_("%s: [%04x]:%ld (%s) offset %d, %s encryption\n"), + device, loopinfo.lo_device, loopinfo.lo_inode, + loopinfo.lo_name, loopinfo.lo_offset, + crypt_name (loopinfo.lo_encrypt_type)); close (fd); - return 1; + + return 0; } #endif int is_loop_device (const char *device) { struct stat statbuf; + int loopmajor; +#if 1 + loopmajor = 7; +#else + FILE *procdev; + char line[100], *cp; - return (stat(device, &statbuf) == 0 && + loopmajor = 0; + if ((procdev = fopen(PROC_DEVICES, "r")) != NULL) { + while (fgets (line, sizeof(line), procdev)) { + if ((cp = strstr (line, " loop\n")) != NULL) { + *cp='\0'; + loopmajor=atoi(line); + break; + } + } + fclose(procdev); + } +#endif + return (loopmajor && stat(device, &statbuf) == 0 && S_ISBLK(statbuf.st_mode) && - major(statbuf.st_rdev) == LOOPMAJOR); + major(statbuf.st_rdev) == loopmajor); } #define SIZE(a) (sizeof(a)/sizeof(a[0])) @@ -160,9 +134,10 @@ find_unused_loop_device (void) { So, we just try /dev/loop[0-7]. */ char dev[20]; char *loop_formats[] = { "/dev/loop%d", "/dev/loop/%d" }; - int i, j, fd, somedev = 0, someloop = 0; + int i, j, fd, somedev = 0, someloop = 0, loop_known = 0; struct stat statbuf; struct loop_info loopinfo; + FILE *procdev; for (j = 0; j < SIZE(loop_formats); j++) { for(i = 0; i < 256; i++) { @@ -185,103 +160,73 @@ find_unused_loop_device (void) { } } + /* Nothing found. Why not? */ + if ((procdev = fopen(PROC_DEVICES, "r")) != NULL) { + char line[100]; + while (fgets (line, sizeof(line), procdev)) + if (strstr (line, " loop\n")) { + loop_known = 1; + break; + } + fclose(procdev); + if (!loop_known) + loop_known = -1; + } + if (!somedev) error(_("mount: could not find any device /dev/loop#")); else if (!someloop) { + if (loop_known == 1) error(_( - "mount: Could not find any loop device. Maybe this kernel " - "does not know\n" - " about the loop device? (If so, recompile or " - "`modprobe loop'.)")); + "mount: Could not find any loop device.\n" + " Maybe /dev/loop# has a wrong major number?")); + else if (loop_known == -1) + error(_( + "mount: Could not find any loop device, and, according to %s,\n" + " this kernel does not know about the loop device.\n" + " (If so, then recompile or `insmod loop.o'.)"), + PROC_DEVICES); + else + error(_( + "mount: Could not find any loop device. Maybe this kernel does not know\n" + " about the loop device (then recompile or `insmod loop.o'), or\n" + " maybe /dev/loop# has the wrong major number?")); } else error(_("mount: could not find any free loop device")); return 0; } -/* - * A function to read the passphrase either from the terminal or from - * an open file descriptor. - */ -static char * -xgetpass(int pfd, const char *prompt) { - char *pass; - int buflen, i; - - if (pfd < 0) /* terminal */ - return getpass(prompt); - - pass = NULL; - buflen = 0; - for (i=0; ; i++) { - if (i >= buflen-1) { - /* we're running out of space in the buffer. - * Make it bigger: */ - char *tmppass = pass; - buflen += 128; - pass = realloc(tmppass, buflen); - if (pass == NULL) { - /* realloc failed. Stop reading. */ - error("Out of memory while reading passphrase"); - pass = tmppass; /* the old buffer hasn't changed */ - break; - } - } - if (read(pfd, pass+i, 1) != 1 || pass[i] == '\n') - break; - } - if (pass == NULL) - return ""; - else { - pass[i] = 0; - return pass; - } -} - -static int -digits_only(const char *s) { - while (*s) - if (!isdigit(*s++)) - return 0; - return 1; -} - int -set_loop(const char *device, const char *file, int offset, - const char *encryption, int pfd, int *loopro) { - struct loop_info64 loopinfo64; - int fd, ffd, mode; +set_loop (const char *device, const char *file, int offset, + const char *encryption, int *loopro) { + struct loop_info loopinfo; + int fd, ffd, mode, i; char *pass; mode = (*loopro ? O_RDONLY : O_RDWR); - if ((ffd = open(file, mode)) < 0) { + if ((ffd = open (file, mode)) < 0) { if (!*loopro && errno == EROFS) - ffd = open(file, mode = O_RDONLY); + ffd = open (file, mode = O_RDONLY); if (ffd < 0) { - perror(file); + perror (file); return 1; } } - if ((fd = open(device, mode)) < 0) { + if ((fd = open (device, mode)) < 0) { perror (device); return 1; } *loopro = (mode == O_RDONLY); - memset(&loopinfo64, 0, sizeof(loopinfo64)); - - xstrncpy(loopinfo64.lo_file_name, file, LO_NAME_SIZE); - - if (encryption && *encryption) { - if (digits_only(encryption)) { - loopinfo64.lo_encrypt_type = atoi(encryption); - } else { - loopinfo64.lo_encrypt_type = LO_CRYPT_CRYPTOAPI; - snprintf(loopinfo64.lo_crypt_name, LO_NAME_SIZE, - "%s", encryption); - } + memset (&loopinfo, 0, sizeof (loopinfo)); + xstrncpy (loopinfo.lo_name, file, LO_NAME_SIZE); + if (encryption && (loopinfo.lo_encrypt_type = crypt_type (encryption)) + < 0) { + fprintf (stderr, _("Unsupported encryption type %s\n"), + encryption); + return 1; } - - loopinfo64.lo_offset = offset; + loopinfo.lo_offset = offset; #ifdef MCL_FUTURE /* @@ -296,55 +241,53 @@ set_loop(const char *device, const char *file, int offset, } #endif - switch (loopinfo64.lo_encrypt_type) { + switch (loopinfo.lo_encrypt_type) { case LO_CRYPT_NONE: - loopinfo64.lo_encrypt_key_size = 0; + loopinfo.lo_encrypt_key_size = 0; break; case LO_CRYPT_XOR: - pass = getpass(_("Password: ")); - xstrncpy(loopinfo64.lo_encrypt_key, pass, LO_KEY_SIZE); - loopinfo64.lo_encrypt_key_size = - strlen(loopinfo64.lo_encrypt_key); + pass = getpass (_("Password: ")); + xstrncpy (loopinfo.lo_encrypt_key, pass, LO_KEY_SIZE); + loopinfo.lo_encrypt_key_size = strlen(loopinfo.lo_encrypt_key); + break; + case LO_CRYPT_DES: + pass = getpass (_("Password: ")); + strncpy (loopinfo.lo_encrypt_key, pass, 8); + loopinfo.lo_encrypt_key[8] = 0; + loopinfo.lo_encrypt_key_size = 8; + pass = getpass (_("Init (up to 16 hex digits): ")); + for (i = 0; i < 16 && pass[i]; i++) + if (isxdigit (pass[i])) { + loopinfo.lo_init[i >> 3] |= (pass[i] > '9' ? + (islower (pass[i]) ? toupper (pass[i]) : + pass[i])-'A'+10 : pass[i]-'0') << (i&7) * 4; + } else { + fprintf (stderr, _("Non-hex digit '%c'.\n"), + pass[i]); + return 1; + } break; default: - pass = xgetpass(pfd, _("Password: ")); - xstrncpy(loopinfo64.lo_encrypt_key, pass, LO_KEY_SIZE); - loopinfo64.lo_encrypt_key_size = LO_KEY_SIZE; - } - - if (ioctl(fd, LOOP_SET_FD, ffd) < 0) { - perror("ioctl: LOOP_SET_FD"); + fprintf (stderr, + _("Don't know how to get key for encryption system %d\n"), + loopinfo.lo_encrypt_type); return 1; } - close (ffd); - - if (ioctl(fd, LOOP_SET_STATUS64, &loopinfo64) < 0) { - struct loop_info loopinfo; - int errsv = errno; - - errno = loop_info64_to_old(&loopinfo64, &loopinfo); - if (errno) { - errno = errsv; - perror("ioctl: LOOP_SET_STATUS64"); - goto fail; - } - - if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { - perror("ioctl: LOOP_SET_STATUS"); - goto fail; - } + if (ioctl (fd, LOOP_SET_FD, ffd) < 0) { + perror ("ioctl: LOOP_SET_FD"); + return 1; + } + if (ioctl (fd, LOOP_SET_STATUS, &loopinfo) < 0) { + (void) ioctl (fd, LOOP_CLR_FD, 0); + perror ("ioctl: LOOP_SET_STATUS"); + return 1; } - close (fd); + close (ffd); if (verbose > 1) printf(_("set_loop(%s,%s,%d): success\n"), device, file, offset); return 0; - - fail: - (void) ioctl (fd, LOOP_CLR_FD, 0); - close (fd); - return 1; } int @@ -445,34 +388,29 @@ error (const char *fmt, ...) { int main(int argc, char **argv) { - char *offset, *encryption, *passfd; - int delete, off, c; + char *offset, *encryption; + int delete,off,c; int res = 0; int ro = 0; - int pfd = -1; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); delete = off = 0; - offset = encryption = passfd = NULL; + offset = encryption = NULL; progname = argv[0]; - while ((c = getopt(argc,argv,"de:E:o:p:v")) != -1) { + while ((c = getopt(argc,argv,"de:o:v")) != -1) { switch (c) { case 'd': delete = 1; break; - case 'E': case 'e': encryption = optarg; break; case 'o': offset = optarg; break; - case 'p': - passfd = optarg; - break; case 'v': verbose = 1; break; @@ -492,10 +430,7 @@ main(int argc, char **argv) { } else { if (offset && sscanf(offset,"%d",&off) != 1) usage(); - if (passfd && sscanf(passfd,"%d",&pfd) != 1) - usage(); - res = set_loop(argv[optind], argv[optind+1], off, - encryption, pfd, &ro); + res = set_loop(argv[optind],argv[optind+1],off,encryption,&ro); } return res; } diff --git a/mount/lomount.h b/mount/lomount.h index d81fc3b5a..1a93c693f 100644 --- a/mount/lomount.h +++ b/mount/lomount.h @@ -1,6 +1,5 @@ extern int verbose; -extern int set_loop(const char *, const char *, int, const char *, - int, int *); -extern int del_loop(const char *); -extern int is_loop_device(const char *); -extern char * find_unused_loop_device(void); +extern int set_loop (const char *, const char *, int, const char *, int *); +extern int del_loop (const char *); +extern int is_loop_device (const char *); +extern char * find_unused_loop_device (void); diff --git a/mount/loop.h b/mount/loop.h deleted file mode 100644 index 951a5d183..000000000 --- a/mount/loop.h +++ /dev/null @@ -1,51 +0,0 @@ -#define LO_CRYPT_NONE 0 -#define LO_CRYPT_XOR 1 -#define LO_CRYPT_DES 2 -#define LO_CRYPT_CRYPTOAPI 18 - -#define LOOP_SET_FD 0x4C00 -#define LOOP_CLR_FD 0x4C01 -#define LOOP_SET_STATUS 0x4C02 -#define LOOP_GET_STATUS 0x4C03 -#define LOOP_SET_STATUS64 0x4C04 -#define LOOP_GET_STATUS64 0x4C05 - -#define LO_NAME_SIZE 64 -#define LO_KEY_SIZE 32 - -#include "my_dev_t.h" - -struct loop_info { - int lo_number; - my_dev_t lo_device; - unsigned long lo_inode; - my_dev_t lo_rdevice; - int lo_offset; - int lo_encrypt_type; - int lo_encrypt_key_size; - int lo_flags; - char lo_name[LO_NAME_SIZE]; - unsigned char lo_encrypt_key[LO_KEY_SIZE]; - unsigned long lo_init[2]; - char reserved[4]; -}; - -/* - * Where to get __u8, __u32, __u64? Let us use unsigned char/int/long long - * and get punished when someone comes with 128-bit long longs. - */ -struct loop_info64 { - unsigned long long lo_device; - unsigned long long lo_inode; - unsigned long long lo_rdevice; - unsigned long long lo_offset; - unsigned long long lo_sizelimit; /* bytes, 0 == max available */ - unsigned int lo_number; - unsigned int lo_encrypt_type; - unsigned int lo_encrypt_key_size; - unsigned int lo_flags; - unsigned char lo_file_name[LO_NAME_SIZE]; - unsigned char lo_crypt_name[LO_NAME_SIZE]; - unsigned char lo_encrypt_key[LO_KEY_SIZE]; - unsigned long long lo_init[2]; -}; diff --git a/mount/losetup.8 b/mount/losetup.8 index 9a42d70a0..d364f4f1e 100644 --- a/mount/losetup.8 +++ b/mount/losetup.8 @@ -1,18 +1,15 @@ -.TH LOSETUP 8 "2003-07-01" "Linux" "MAINTENANCE COMMANDS" +.TH LOSETUP 8 "Nov 24 1993" "Linux" "MAINTENANCE COMMANDS" .SH NAME losetup \- set up and control loop devices .SH SYNOPSIS .ad l .B losetup [ -.RB [ \-e | \-E ] +.B \-e .I encryption ] [ .B \-o .I offset -] [ -.B \-p -.I pfd ] .I loop_device file .br @@ -28,41 +25,27 @@ is used to associate loop devices with regular files or block devices, to detach loop devices and to query the status of a loop device. If only the \fIloop_device\fP argument is given, the status of the corresponding loop device is shown. - -.SS "Encryption" -It is possible to specify transfer functions (for encryption/decryption -or other purposes) using one of the -.B \-E -and -.B \-e -options. -There are two mechanisms to specify the desired encryption: by number -and by name. If an encryption is specified by number then one -has to make sure that the Linux kernel knows about the encryption with that -number, probably by patching the kernel. Standard numbers that are -always present are 0 (no encryption) and 1 (XOR encryption). -When the cryptoloop module is loaded (or compiled in), it uses number 18. -This cryptoloop module wil take the name of an arbitrary encryption type -and finds the module that knows how to perform that encryption. -(Thus, either one uses a number different from 18 with the -.B \-E -option, or one uses a name with the -.B \-e -option.) .SH OPTIONS .IP \fB\-d\fP -Detach the file or device associated with the specified loop device. -.IP "\fB\-E \fIencryption_type\fP" -Enable data encryption with specified number. -.IP "\fB\-e \fIencryption_name\fP" -Enable data encryption with specified name. +detach the file or device associated with the specified loop device. +.IP "\fB\-e \fIencryption\fP" +.RS +enable data encryption. The following keywords are recognized: +.IP \fBNONE\fP +use no encryption (default). +.PD 0 +.IP \fBXOR\fP +use a simple XOR encryption. +.IP \fBDES\fP +use DES encryption. DES encryption is only available if the optional +DES package has been added to the kernel. DES encryption uses an additional +start value that is used to protect passwords against dictionary +attacks. +.PD +.RE .IP "\fB\-o \fIoffset\fP" -The data start is moved \fIoffset\fP bytes into the specified file or +the data start is moved \fIoffset\fP bytes into the specified file or device. -.IP "\fB\-p \fInum\fP" -Read the passphrase from file descriptor with number -.I num -instead of from the terminal. .SH RETURN VALUE .B losetup returns 0 on success, nonzero on failure. When @@ -74,7 +57,7 @@ from determining the status of the device. .SH FILES .nf -/dev/loop0, /dev/loop1, ... loop devices (major=7) +/dev/loop0,/dev/loop1,... loop devices (major=7) .fi .SH EXAMPLE If you are using the loadable module you must have the module loaded @@ -82,23 +65,18 @@ first with the command .IP # insmod loop.o .LP -Maybe also encryption modules are needed. -.IP -# insmod des.o -# insmod cryptoloop.o -.LP The following commands can be used as an example of using the loop device. .nf .IP -# dd if=/dev/zero of=/file bs=1k count=100 -# losetup -e des /dev/loop0 /file +dd if=/dev/zero of=/file bs=1k count=100 +losetup -e des /dev/loop0 /file Password: Init (up to 16 hex digits): -# mkfs -t ext2 /dev/loop0 100 -# mount -t ext2 /dev/loop0 /mnt +mkfs -t ext2 /dev/loop0 100 +mount -t ext2 /dev/loop0 /mnt ... -# umount /dev/loop0 -# losetup -d /dev/loop0 +umount /dev/loop0 +losetup -d /dev/loop0 .fi .LP If you are using the loadable module you may remove the module with @@ -109,8 +87,8 @@ the command .fi .SH RESTRICTION DES encryption is painfully slow. On the other hand, XOR is terribly weak. -.\" .SH AUTHORS -.\" .nf -.\" Original version: Theodore Ts'o -.\" Original DES by: Eric Young -.\" .fi +.SH AUTHORS +.nf +Original version: Theodore Ts'o +Original DES by: Eric Young +.fi diff --git a/mount/mk_loop_h b/mount/mk_loop_h new file mode 100644 index 000000000..86e76f35e --- /dev/null +++ b/mount/mk_loop_h @@ -0,0 +1,34 @@ +#!/bin/sh +# +# Figure out (i) the type of dev_t (ii) the defines for loop stuff +# + +rm -f loop.h + +# Since 1.3.79 there is an include file +# that defines __kernel_dev_t. +# (The file itself appeared in 1.3.78, but there it defined __dev_t.) +# If it exists, we use it, or, rather, which +# avoids namespace pollution. Otherwise we guess that __kernel_dev_t +# is an unsigned short (which is true on i386, but false on alpha). + +if [ -f /usr/include/linux/posix_types.h ]; then + echo '#include ' >> loop.h + echo '#undef dev_t' >> loop.h + echo '#define dev_t __kernel_dev_t' >> loop.h +else + echo '#undef dev_t' >> loop.h + echo '#define dev_t unsigned short' >> loop.h +fi + +# Next we have to find the loop stuff itself. +# First try kernel source, then a private version. + +if [ -f /usr/include/linux/loop.h ]; then + echo '#include ' >> loop.h +else + echo '#include "h/loop.h"' >> loop.h +fi + +echo '#undef dev_t' >> loop.h + diff --git a/mount/mount.8 b/mount/mount.8 index 794cc32fd..690b12dfd 100644 --- a/mount/mount.8 +++ b/mount/mount.8 @@ -315,12 +315,6 @@ This is necessary for example when .I /etc is on a read-only file system. .TP -.BI \-p " num" -In case of a loop mount with encryption, read the passphrase from -file descriptor -.I num -instead of from the terminal. -.TP .B \-s Tolerate sloppy mount options rather than failing. This will ignore mount options not supported by a filesystem type. Not all filesystems diff --git a/mount/mount.c b/mount/mount.c index 6059460c9..04a3cd74e 100644 --- a/mount/mount.c +++ b/mount/mount.c @@ -113,9 +113,6 @@ static int mounttype = 0; /* True if ruid != euid. */ static int suid = 0; -/* Contains the fd to read the passphrase from, if any. */ -static int pfd = -1; - /* Map from -o and fstab option strings to the flag argument to mount(2). */ struct opt_map { const char *opt; /* option name */ @@ -604,8 +601,7 @@ loop_check(char **spec, char **type, int *flags, if (verbose) printf(_("mount: going to use the loop device %s\n"), *loopdev); offset = opt_offset ? strtoul(opt_offset, NULL, 0) : 0; - if (set_loop(*loopdev, *loopfile, offset, - opt_encryption, pfd, &loopro)) { + if (set_loop (*loopdev, *loopfile, offset, opt_encryption, &loopro)) { if (verbose) printf(_("mount: failed setting up loop device\n")); return EX_FAIL; @@ -663,14 +659,6 @@ update_mtab_entry(char *spec, char *node, char *type, char *opts, } } -static void -set_pfd(char *s) { - if (!isdigit(*s)) - die(EX_USAGE, - _("mount: argument to -p or --pass-fd must be a number")); - pfd = atoi(optarg); -} - static void cdrom_setspeed(char *spec) { #define CDROM_SELECT_SPEED 0x5322 /* Set the CD-ROM speed */ @@ -780,7 +768,7 @@ try_mount_one (const char *spec0, const char *node0, char *types0, if (mount_all && (flags & MS_NOAUTO)) return 0; - suid_check(spec, node, &flags, &user); + suid_check (spec, node, &flags, &user); mount_opts = extra_opts; @@ -788,12 +776,11 @@ try_mount_one (const char *spec0, const char *node0, char *types0, cdrom_setspeed(spec); if (!(flags & MS_REMOUNT)) { - /* - * Don't set up a (new) loop device if we only remount - this left + /* don't set up a (new) loop device if we only remount - this left * stale assignments of files to loop devices. Nasty when used for * encryption. */ - res = loop_check(&spec, &types, &flags, &loop, &loopdev, &loopfile); + res = loop_check (&spec, &types, &flags, &loop, &loopdev, &loopfile); if (res) return res; } @@ -1370,7 +1357,6 @@ static struct option longopts[] = { { "rw", 0, 0, 'w' }, { "options", 1, 0, 'o' }, { "test-opts", 1, 0, 'O' }, - { "pass-fd", 1, 0, 'p' }, { "types", 1, 0, 't' }, { "bind", 0, 0, 128 }, { "replace", 0, 0, 129 }, @@ -1408,7 +1394,7 @@ usage (FILE *fp, int n) { " mount --move olddir newdir\n" "A device can be given by name, say /dev/hda1 or /dev/cdrom,\n" "or by label, using -L label or by uuid, using -U uuid .\n" - "Other options: [-nfFrsvw] [-o options] [-p passwdfd].\n" + "Other options: [-nfFrsvw] [-o options].\n" "For many more details, say man 8 mount .\n" )); /* @@ -1447,7 +1433,7 @@ main (int argc, char *argv[]) { initproctitle(argc, argv); #endif - while ((c = getopt_long (argc, argv, "afFhilL:no:O:p:rsU:vVwt:", + while ((c = getopt_long (argc, argv, "afFhilL:no:O:rsU:vVwt:", longopts, NULL)) != -1) { switch (c) { case 'a': /* mount everything in fstab */ @@ -1486,9 +1472,6 @@ main (int argc, char *argv[]) { else test_opts = xstrdup(optarg); break; - case 'p': /* fd on which to read passwd */ - set_pfd(optarg); - break; case 'r': /* mount readonly */ readonly = 1; readwrite = 0; diff --git a/mount/mount_guess_fstype.c b/mount/mount_guess_fstype.c index ab47b4552..f23cfc84b 100644 --- a/mount/mount_guess_fstype.c +++ b/mount/mount_guess_fstype.c @@ -297,8 +297,6 @@ do_guess_fstype(const char *device) { else if ((!strncmp(xsb.fatsb.s_os, "MSDOS", 5) || !strncmp(xsb.fatsb.s_os, "MSWIN", 5) || !strncmp(xsb.fatsb.s_os, "MTOOL", 5) || - !strncmp(xsb.fatsb.s_os, "IBM", 3) || - !strncmp(xsb.fatsb.s_os, "DRDOS", 5) || !strncmp(xsb.fatsb.s_os, "mkdosfs", 7) || !strncmp(xsb.fatsb.s_os, "kmkdosfs", 8) || /* Michal Svec: created by fdformat, old msdos utility for diff --git a/mount/my_dev_t.h b/mount/my_dev_t.h deleted file mode 100644 index 5ef97154e..000000000 --- a/mount/my_dev_t.h +++ /dev/null @@ -1,7 +0,0 @@ -/* silliness to get dev_t defined as the kernel defines it */ -/* glibc uses a different dev_t */ -/* maybe we need __kernel_old_dev_t -- later */ -/* for ancient systems use "unsigned short" */ - -#include -#define my_dev_t __kernel_dev_t diff --git a/mount/umount.c b/mount/umount.c index eed00d8e1..29feff4fa 100644 --- a/mount/umount.c +++ b/mount/umount.c @@ -400,23 +400,15 @@ umount_one (const char *spec, const char *node, const char *type, * In both cases, it is best to try the last occurrence first. */ static int -umount_one_bw (const char *file, struct mntentchn *mc0) { - struct mntentchn *mc; - int res = 1; +umount_one_bw (const char *file, struct mntentchn *mc) { + int res = 1; - mc = mc0; - while (res && mc) { - res = umount_one(mc->m.mnt_fsname, mc->m.mnt_dir, - mc->m.mnt_type, mc->m.mnt_opts, mc); - mc = getmntdirbackward(file, mc); - } - mc = mc0; - while (res && mc) { - res = umount_one(mc->m.mnt_fsname, mc->m.mnt_dir, - mc->m.mnt_type, mc->m.mnt_opts, mc); - mc = getmntdevbackward(file, mc); - } - return res; + while (res && mc) { + res = umount_one(mc->m.mnt_fsname, mc->m.mnt_dir, + mc->m.mnt_type, mc->m.mnt_opts, mc); + mc = getmntfilesbackward (file, mc); + } + return res; } /* Unmount all filesystems of type VFSTYPES found in mtab. Since we are @@ -533,6 +525,7 @@ get_value(string_list list, char *s) { } return 0; } +/*=======================================================================*/ static int umount_file (char *arg) { @@ -541,25 +534,19 @@ umount_file (char *arg) { string_list options; int fstab_has_user, fstab_has_users, fstab_has_owner, ok; - file = canonicalize(arg); /* mtab paths are canonicalized */ + file = canonicalize (arg); /* mtab paths are canonicalized */ if (verbose > 1) printf(_("Trying to umount %s\n"), file); - mc = getmntdirbackward(file, NULL); - if (!mc) - mc = getmntdevbackward(file, NULL); + mc = getmntfilesbackward (file, NULL); if (!mc && verbose) printf(_("Could not find %s in mtab\n"), file); if (suid) { if (!mc) - die(2, - _("umount: %s is not mounted (according to mtab)"), - file); - if (!is_mounted_once(file)) - die(2, - _("umount: it seems %s is mounted multiple times"), - file); + die (2, _("umount: %s is not mounted (according to mtab)"), file); + if (getmntfilesbackward (file, mc)) + die (2, _("umount: it seems %s is mounted multiple times"), file); /* If fstab contains the two lines /dev/sda1 /mnt/zip auto user,noauto 0 0 diff --git a/po/cat-id-tbl.c b/po/cat-id-tbl.c index 53e4eda82..9b1b03d34 100644 --- a/po/cat-id-tbl.c +++ b/po/cat-id-tbl.c @@ -2046,7 +2046,7 @@ mount: the kernel does not recognize %s as a block device\n\ {"label", 1552}, {"mount: no such partition found", 1553}, {"mount: no type was given - I'll assume nfs because of the colon\n", 1554}, - {"mount: no type was given - I'll assume smbfs because of the // prefix\n", 1555}, + {"mount: no type was given - I'll assume smb because of the // prefix\n", 1555}, {"mount: backgrounding \"%s\"\n", 1556}, {"mount: giving up \"%s\"\n", 1557}, {"mount: %s already mounted on %s\n", 1558}, @@ -2070,292 +2070,291 @@ or move a subtree:\n\ mount --move olddir newdir\n\ A device can be given by name, say /dev/hda1 or /dev/cdrom,\n\ or by label, using -L label or by uuid, using -U uuid .\n\ -Other options: [-nfFrsvw] [-o options] [-p passwdfd].\n\ +Other options: [-nfFrsvw] [-o options].\n\ For many more details, say man 8 mount .\n", 1559}, - {"mount: argument to -p or --pass-fd must be a number", 1560}, - {"mount: only root can do that", 1561}, - {"mount: no %s found - creating it..\n", 1562}, - {"mount: the label %s occurs on both %s and %s - not mounted\n", 1563}, - {"mount: mounting %s\n", 1564}, - {"nothing was mounted", 1565}, - {"mount: cannot find %s in %s", 1566}, - {"mount: can't find %s in %s or %s", 1567}, + {"mount: only root can do that", 1560}, + {"mount: no %s found - creating it..\n", 1561}, + {"mount: the label %s occurs on both %s and %s - not mounted\n", 1562}, + {"mount: mounting %s\n", 1563}, + {"nothing was mounted", 1564}, + {"mount: cannot find %s in %s", 1565}, + {"mount: can't find %s in %s or %s", 1566}, {"\ -mount: could not open %s, so UUID and LABEL conversion cannot be done.\n", 1568}, - {"mount: bad UUID", 1569}, - {"mount: error while guessing filesystem type\n", 1570}, - {"mount: you didn't specify a filesystem type for %s\n", 1571}, - {" I will try all types mentioned in %s or %s\n", 1572}, - {" and it looks like this is swapspace\n", 1573}, - {" I will try type %s\n", 1574}, - {"Trying %s\n", 1575}, - {"mount: excessively long host:dir argument\n", 1576}, - {"mount: warning: multiple hostnames not supported\n", 1577}, - {"mount: directory to mount not in host:dir format\n", 1578}, - {"mount: can't get address for %s\n", 1579}, - {"mount: got bad hp->h_length\n", 1580}, - {"mount: excessively long option argument\n", 1581}, - {"Warning: Unrecognized proto= option.\n", 1582}, - {"Warning: Option namlen is not supported.\n", 1583}, - {"unknown nfs mount parameter: %s=%d\n", 1584}, - {"Warning: option nolock is not supported.\n", 1585}, - {"unknown nfs mount option: %s%s\n", 1586}, - {"mount: got bad hp->h_length?\n", 1587}, - {"NFS over TCP is not supported.\n", 1588}, - {"nfs socket", 1589}, - {"nfs bindresvport", 1590}, - {"nfs server reported service unavailable", 1591}, - {"used portmapper to find NFS port\n", 1592}, - {"using port %d for nfs deamon\n", 1593}, - {"nfs connect", 1594}, - {"unknown nfs status return value: %d", 1595}, - {"bug in xstrndup call", 1596}, +mount: could not open %s, so UUID and LABEL conversion cannot be done.\n", 1567}, + {"mount: bad UUID", 1568}, + {"mount: error while guessing filesystem type\n", 1569}, + {"mount: you didn't specify a filesystem type for %s\n", 1570}, + {" I will try all types mentioned in %s or %s\n", 1571}, + {" and it looks like this is swapspace\n", 1572}, + {" I will try type %s\n", 1573}, + {"Trying %s\n", 1574}, + {"mount: excessively long host:dir argument\n", 1575}, + {"mount: warning: multiple hostnames not supported\n", 1576}, + {"mount: directory to mount not in host:dir format\n", 1577}, + {"mount: can't get address for %s\n", 1578}, + {"mount: got bad hp->h_length\n", 1579}, + {"mount: excessively long option argument\n", 1580}, + {"Warning: Unrecognized proto= option.\n", 1581}, + {"Warning: Option namlen is not supported.\n", 1582}, + {"unknown nfs mount parameter: %s=%d\n", 1583}, + {"Warning: option nolock is not supported.\n", 1584}, + {"unknown nfs mount option: %s%s\n", 1585}, + {"mount: got bad hp->h_length?\n", 1586}, + {"NFS over TCP is not supported.\n", 1587}, + {"nfs socket", 1588}, + {"nfs bindresvport", 1589}, + {"nfs server reported service unavailable", 1590}, + {"used portmapper to find NFS port\n", 1591}, + {"using port %d for nfs deamon\n", 1592}, + {"nfs connect", 1593}, + {"unknown nfs status return value: %d", 1594}, + {"bug in xstrndup call", 1595}, {"\ usage: %s [-hV]\n\ %s -a [-e] [-v]\n\ %s [-v] [-p priority] special ...\n\ - %s [-s]\n", 1597}, + %s [-s]\n", 1596}, {"\ usage: %s [-hV]\n\ %s -a [-v]\n\ - %s [-v] special ...\n", 1598}, - {"%s on %s\n", 1599}, - {"swapon: cannot stat %s: %s\n", 1600}, - {"swapon: warning: %s has insecure permissions %04o, %04o suggested\n", 1601}, - {"swapon: Skipping file %s - it appears to have holes.\n", 1602}, - {"Not superuser.\n", 1603}, - {"%s: cannot open %s: %s\n", 1604}, - {"umount: compiled without support for -f\n", 1605}, - {"host: %s, directory: %s\n", 1606}, - {"umount: can't get address for %s\n", 1607}, - {"umount: got bad hostp->h_length\n", 1608}, - {"umount: %s: invalid block device", 1609}, - {"umount: %s: not mounted", 1610}, - {"umount: %s: can't write superblock", 1611}, - {"umount: %s: device is busy", 1612}, - {"umount: %s: not found", 1613}, - {"umount: %s: must be superuser to umount", 1614}, - {"umount: %s: block devices not permitted on fs", 1615}, - {"umount: %s: %s", 1616}, - {"no umount2, trying umount...\n", 1617}, - {"could not umount %s - trying %s instead\n", 1618}, - {"umount: %s busy - remounted read-only\n", 1619}, - {"umount: could not remount %s read-only\n", 1620}, - {"%s umounted\n", 1621}, - {"umount: cannot find list of filesystems to unmount", 1622}, + %s [-v] special ...\n", 1597}, + {"%s on %s\n", 1598}, + {"swapon: cannot stat %s: %s\n", 1599}, + {"swapon: warning: %s has insecure permissions %04o, %04o suggested\n", 1600}, + {"swapon: Skipping file %s - it appears to have holes.\n", 1601}, + {"Not superuser.\n", 1602}, + {"%s: cannot open %s: %s\n", 1603}, + {"umount: compiled without support for -f\n", 1604}, + {"host: %s, directory: %s\n", 1605}, + {"umount: can't get address for %s\n", 1606}, + {"umount: got bad hostp->h_length\n", 1607}, + {"umount: %s: invalid block device", 1608}, + {"umount: %s: not mounted", 1609}, + {"umount: %s: can't write superblock", 1610}, + {"umount: %s: device is busy", 1611}, + {"umount: %s: not found", 1612}, + {"umount: %s: must be superuser to umount", 1613}, + {"umount: %s: block devices not permitted on fs", 1614}, + {"umount: %s: %s", 1615}, + {"no umount2, trying umount...\n", 1616}, + {"could not umount %s - trying %s instead\n", 1617}, + {"umount: %s busy - remounted read-only\n", 1618}, + {"umount: could not remount %s read-only\n", 1619}, + {"%s umounted\n", 1620}, + {"umount: cannot find list of filesystems to unmount", 1621}, {"\ Usage: umount [-hV]\n\ umount -a [-f] [-r] [-n] [-v] [-t vfstypes] [-O opts]\n\ - umount [-f] [-r] [-n] [-v] special | node...\n", 1623}, - {"Trying to umount %s\n", 1624}, - {"Could not find %s in mtab\n", 1625}, - {"umount: %s is not mounted (according to mtab)", 1626}, - {"umount: it seems %s is mounted multiple times", 1627}, - {"umount: %s is not in the fstab (and you are not root)", 1628}, - {"umount: %s mount disagrees with the fstab", 1629}, - {"umount: only root can unmount %s from %s", 1630}, - {"umount: only root can do that", 1631}, - {"You must be root to set the Ctrl-Alt-Del behaviour.\n", 1632}, - {"Usage: ctrlaltdel hard|soft\n", 1633}, + umount [-f] [-r] [-n] [-v] special | node...\n", 1622}, + {"Trying to umount %s\n", 1623}, + {"Could not find %s in mtab\n", 1624}, + {"umount: %s is not mounted (according to mtab)", 1625}, + {"umount: it seems %s is mounted multiple times", 1626}, + {"umount: %s is not in the fstab (and you are not root)", 1627}, + {"umount: %s mount disagrees with the fstab", 1628}, + {"umount: only root can unmount %s from %s", 1629}, + {"umount: only root can do that", 1630}, + {"You must be root to set the Ctrl-Alt-Del behaviour.\n", 1631}, + {"Usage: ctrlaltdel hard|soft\n", 1632}, {"\ File %s, For threshold value %lu, Maximum characters in fifo were %d,\n\ -and the maximum transfer rate in characters/second was %f\n", 1634}, +and the maximum transfer rate in characters/second was %f\n", 1633}, {"\ File %s, For threshold value %lu and timrout value %lu, Maximum characters \ in fifo were %d,\n\ -and the maximum transfer rate in characters/second was %f\n", 1635}, - {"Invalid interval value: %s\n", 1636}, - {"Invalid set value: %s\n", 1637}, - {"Invalid default value: %s\n", 1638}, - {"Invalid set time value: %s\n", 1639}, - {"Invalid default time value: %s\n", 1640}, +and the maximum transfer rate in characters/second was %f\n", 1634}, + {"Invalid interval value: %s\n", 1635}, + {"Invalid set value: %s\n", 1636}, + {"Invalid default value: %s\n", 1637}, + {"Invalid set time value: %s\n", 1638}, + {"Invalid default time value: %s\n", 1639}, {"\ Usage: %s [-q [-i interval]] ([-s value]|[-S value]) ([-t value]|[-T value]) \ -[-g|-G] file [file...]\n", 1641}, - {"Can't open %s: %s\n", 1642}, - {"Can't set %s to threshold %d: %s\n", 1643}, - {"Can't set %s to time threshold %d: %s\n", 1644}, - {"Can't get threshold for %s: %s\n", 1645}, - {"Can't get timeout for %s: %s\n", 1646}, - {"%s: %ld current threshold and %ld current timeout\n", 1647}, - {"%s: %ld default threshold and %ld default timeout\n", 1648}, - {"Can't set signal handler", 1649}, - {"gettimeofday failed", 1650}, - {"Can't issue CYGETMON on %s: %s\n", 1651}, +[-g|-G] file [file...]\n", 1640}, + {"Can't open %s: %s\n", 1641}, + {"Can't set %s to threshold %d: %s\n", 1642}, + {"Can't set %s to time threshold %d: %s\n", 1643}, + {"Can't get threshold for %s: %s\n", 1644}, + {"Can't get timeout for %s: %s\n", 1645}, + {"%s: %ld current threshold and %ld current timeout\n", 1646}, + {"%s: %ld default threshold and %ld default timeout\n", 1647}, + {"Can't set signal handler", 1648}, + {"gettimeofday failed", 1649}, + {"Can't issue CYGETMON on %s: %s\n", 1650}, {"\ -%s: %lu ints, %lu/%lu chars; fifo: %lu thresh, %lu tmout, %lu max, %lu now\n", 1652}, - {" %f int/sec; %f rec, %f send (char/sec)\n", 1653}, +%s: %lu ints, %lu/%lu chars; fifo: %lu thresh, %lu tmout, %lu max, %lu now\n", 1651}, + {" %f int/sec; %f rec, %f send (char/sec)\n", 1652}, {"\ -%s: %lu ints, %lu chars; fifo: %lu thresh, %lu tmout, %lu max, %lu now\n", 1654}, - {" %f int/sec; %f rec (char/sec)\n", 1655}, - {"Usage: %s [-c] [-n level] [-s bufsize]\n", 1656}, - {"invalid id: %s\n", 1657}, - {"cannot remove id %s (%s)\n", 1658}, - {"deprecated usage: %s {shm | msg | sem} id ...\n", 1659}, - {"unknown resource type: %s\n", 1660}, - {"resource(s) deleted\n", 1661}, +%s: %lu ints, %lu chars; fifo: %lu thresh, %lu tmout, %lu max, %lu now\n", 1653}, + {" %f int/sec; %f rec (char/sec)\n", 1654}, + {"Usage: %s [-c] [-n level] [-s bufsize]\n", 1655}, + {"invalid id: %s\n", 1656}, + {"cannot remove id %s (%s)\n", 1657}, + {"deprecated usage: %s {shm | msg | sem} id ...\n", 1658}, + {"unknown resource type: %s\n", 1659}, + {"resource(s) deleted\n", 1660}, {"\ usage: %s [ [-q msqid] [-m shmid] [-s semid]\n\ - [-Q msgkey] [-M shmkey] [-S semkey] ... ]\n", 1662}, - {"%s: illegal option -- %c\n", 1663}, - {"%s: illegal key (%s)\n", 1664}, - {"permission denied for key", 1665}, - {"already removed key", 1666}, - {"invalid key", 1667}, - {"unknown error in key", 1668}, - {"permission denied for id", 1669}, - {"invalid id", 1670}, - {"already removed id", 1671}, - {"unknown error in id", 1672}, - {"%s: %s (%s)\n", 1673}, - {"%s: unknown argument: %s\n", 1674}, - {"usage : %s -asmq -tclup \n", 1675}, - {"\t%s [-s -m -q] -i id\n", 1676}, - {"\t%s -h for help.\n", 1677}, + [-Q msgkey] [-M shmkey] [-S semkey] ... ]\n", 1661}, + {"%s: illegal option -- %c\n", 1662}, + {"%s: illegal key (%s)\n", 1663}, + {"permission denied for key", 1664}, + {"already removed key", 1665}, + {"invalid key", 1666}, + {"unknown error in key", 1667}, + {"permission denied for id", 1668}, + {"invalid id", 1669}, + {"already removed id", 1670}, + {"unknown error in id", 1671}, + {"%s: %s (%s)\n", 1672}, + {"%s: unknown argument: %s\n", 1673}, + {"usage : %s -asmq -tclup \n", 1674}, + {"\t%s [-s -m -q] -i id\n", 1675}, + {"\t%s -h for help.\n", 1676}, {"\ -%s provides information on ipc facilities for which you have read access.\n", 1678}, +%s provides information on ipc facilities for which you have read access.\n", 1677}, {"\ Resource Specification:\n\ \t-m : shared_mem\n\ -\t-q : messages\n", 1679}, +\t-q : messages\n", 1678}, {"\ \t-s : semaphores\n\ -\t-a : all (default)\n", 1680}, +\t-a : all (default)\n", 1679}, {"\ Output Format:\n\ \t-t : time\n\ \t-p : pid\n\ -\t-c : creator\n", 1681}, +\t-c : creator\n", 1680}, {"\ \t-l : limits\n\ -\t-u : summary\n", 1682}, - {"-i id [-s -q -m] : details on resource identified by id\n", 1683}, - {"kernel not configured for shared memory\n", 1684}, - {"------ Shared Memory Limits --------\n", 1685}, - {"max number of segments = %ld\n", 1686}, - {"max seg size (kbytes) = %ld\n", 1687}, - {"max total shared memory (kbytes) = %ld\n", 1688}, - {"min seg size (bytes) = %ld\n", 1689}, - {"------ Shared Memory Status --------\n", 1690}, - {"segments allocated %d\n", 1691}, - {"pages allocated %ld\n", 1692}, - {"pages resident %ld\n", 1693}, - {"pages swapped %ld\n", 1694}, - {"Swap performance: %ld attempts\t %ld successes\n", 1695}, - {"------ Shared Memory Segment Creators/Owners --------\n", 1696}, - {"%-10s %-10s %-10s %-10s %-10s %-10s\n", 1697}, - {"shmid", 1698}, - {"perms", 1699}, - {"cuid", 1700}, - {"cgid", 1701}, - {"uid", 1702}, - {"gid", 1703}, - {"------ Shared Memory Attach/Detach/Change Times --------\n", 1704}, - {"%-10s %-10s %-20s %-20s %-20s\n", 1705}, - {"owner", 1706}, - {"attached", 1707}, - {"detached", 1708}, - {"changed", 1709}, - {"------ Shared Memory Creator/Last-op --------\n", 1710}, - {"%-10s %-10s %-10s %-10s\n", 1711}, - {"cpid", 1712}, - {"lpid", 1713}, - {"------ Shared Memory Segments --------\n", 1714}, - {"%-10s %-10s %-10s %-10s %-10s %-10s %-12s\n", 1715}, - {"key", 1716}, - {"bytes", 1717}, - {"nattch", 1718}, - {"status", 1719}, - {"Not set", 1720}, - {"dest", 1721}, - {"locked", 1722}, - {"kernel not configured for semaphores\n", 1723}, - {"------ Semaphore Limits --------\n", 1724}, - {"max number of arrays = %d\n", 1725}, - {"max semaphores per array = %d\n", 1726}, - {"max semaphores system wide = %d\n", 1727}, - {"max ops per semop call = %d\n", 1728}, - {"semaphore max value = %d\n", 1729}, - {"------ Semaphore Status --------\n", 1730}, - {"used arrays = %d\n", 1731}, - {"allocated semaphores = %d\n", 1732}, - {"------ Semaphore Arrays Creators/Owners --------\n", 1733}, - {"semid", 1734}, - {"------ Shared Memory Operation/Change Times --------\n", 1735}, - {"%-8s %-10s %-26.24s %-26.24s\n", 1736}, - {"last-op", 1737}, - {"last-changed", 1738}, - {"------ Semaphore Arrays --------\n", 1739}, - {"%-10s %-10s %-10s %-10s %-10s\n", 1740}, - {"nsems", 1741}, - {"kernel not configured for message queues\n", 1742}, - {"------ Messages: Limits --------\n", 1743}, - {"max queues system wide = %d\n", 1744}, - {"max size of message (bytes) = %d\n", 1745}, - {"default max size of queue (bytes) = %d\n", 1746}, - {"------ Messages: Status --------\n", 1747}, - {"allocated queues = %d\n", 1748}, - {"used headers = %d\n", 1749}, - {"used space = %d bytes\n", 1750}, - {"------ Message Queues: Creators/Owners --------\n", 1751}, - {"msqid", 1752}, - {"------ Message Queues Send/Recv/Change Times --------\n", 1753}, - {"%-8s %-10s %-20s %-20s %-20s\n", 1754}, - {"send", 1755}, - {"recv", 1756}, - {"change", 1757}, - {"------ Message Queues PIDs --------\n", 1758}, - {"lspid", 1759}, - {"lrpid", 1760}, - {"------ Message Queues --------\n", 1761}, - {"%-10s %-10s %-10s %-10s %-12s %-12s\n", 1762}, - {"used-bytes", 1763}, - {"messages", 1764}, +\t-u : summary\n", 1681}, + {"-i id [-s -q -m] : details on resource identified by id\n", 1682}, + {"kernel not configured for shared memory\n", 1683}, + {"------ Shared Memory Limits --------\n", 1684}, + {"max number of segments = %ld\n", 1685}, + {"max seg size (kbytes) = %ld\n", 1686}, + {"max total shared memory (kbytes) = %ld\n", 1687}, + {"min seg size (bytes) = %ld\n", 1688}, + {"------ Shared Memory Status --------\n", 1689}, + {"segments allocated %d\n", 1690}, + {"pages allocated %ld\n", 1691}, + {"pages resident %ld\n", 1692}, + {"pages swapped %ld\n", 1693}, + {"Swap performance: %ld attempts\t %ld successes\n", 1694}, + {"------ Shared Memory Segment Creators/Owners --------\n", 1695}, + {"%-10s %-10s %-10s %-10s %-10s %-10s\n", 1696}, + {"shmid", 1697}, + {"perms", 1698}, + {"cuid", 1699}, + {"cgid", 1700}, + {"uid", 1701}, + {"gid", 1702}, + {"------ Shared Memory Attach/Detach/Change Times --------\n", 1703}, + {"%-10s %-10s %-20s %-20s %-20s\n", 1704}, + {"owner", 1705}, + {"attached", 1706}, + {"detached", 1707}, + {"changed", 1708}, + {"------ Shared Memory Creator/Last-op --------\n", 1709}, + {"%-10s %-10s %-10s %-10s\n", 1710}, + {"cpid", 1711}, + {"lpid", 1712}, + {"------ Shared Memory Segments --------\n", 1713}, + {"%-10s %-10s %-10s %-10s %-10s %-10s %-12s\n", 1714}, + {"key", 1715}, + {"bytes", 1716}, + {"nattch", 1717}, + {"status", 1718}, + {"Not set", 1719}, + {"dest", 1720}, + {"locked", 1721}, + {"kernel not configured for semaphores\n", 1722}, + {"------ Semaphore Limits --------\n", 1723}, + {"max number of arrays = %d\n", 1724}, + {"max semaphores per array = %d\n", 1725}, + {"max semaphores system wide = %d\n", 1726}, + {"max ops per semop call = %d\n", 1727}, + {"semaphore max value = %d\n", 1728}, + {"------ Semaphore Status --------\n", 1729}, + {"used arrays = %d\n", 1730}, + {"allocated semaphores = %d\n", 1731}, + {"------ Semaphore Arrays Creators/Owners --------\n", 1732}, + {"semid", 1733}, + {"------ Shared Memory Operation/Change Times --------\n", 1734}, + {"%-8s %-10s %-26.24s %-26.24s\n", 1735}, + {"last-op", 1736}, + {"last-changed", 1737}, + {"------ Semaphore Arrays --------\n", 1738}, + {"%-10s %-10s %-10s %-10s %-10s\n", 1739}, + {"nsems", 1740}, + {"kernel not configured for message queues\n", 1741}, + {"------ Messages: Limits --------\n", 1742}, + {"max queues system wide = %d\n", 1743}, + {"max size of message (bytes) = %d\n", 1744}, + {"default max size of queue (bytes) = %d\n", 1745}, + {"------ Messages: Status --------\n", 1746}, + {"allocated queues = %d\n", 1747}, + {"used headers = %d\n", 1748}, + {"used space = %d bytes\n", 1749}, + {"------ Message Queues: Creators/Owners --------\n", 1750}, + {"msqid", 1751}, + {"------ Message Queues Send/Recv/Change Times --------\n", 1752}, + {"%-8s %-10s %-20s %-20s %-20s\n", 1753}, + {"send", 1754}, + {"recv", 1755}, + {"change", 1756}, + {"------ Message Queues PIDs --------\n", 1757}, + {"lspid", 1758}, + {"lrpid", 1759}, + {"------ Message Queues --------\n", 1760}, + {"%-10s %-10s %-10s %-10s %-12s %-12s\n", 1761}, + {"used-bytes", 1762}, + {"messages", 1763}, {"\ \n\ -Shared memory Segment shmid=%d\n", 1765}, - {"uid=%d\tgid=%d\tcuid=%d\tcgid=%d\n", 1766}, - {"mode=%#o\taccess_perms=%#o\n", 1767}, - {"bytes=%ld\tlpid=%d\tcpid=%d\tnattch=%ld\n", 1768}, - {"att_time=%-26.24s\n", 1769}, - {"det_time=%-26.24s\n", 1770}, - {"change_time=%-26.24s\n", 1771}, +Shared memory Segment shmid=%d\n", 1764}, + {"uid=%d\tgid=%d\tcuid=%d\tcgid=%d\n", 1765}, + {"mode=%#o\taccess_perms=%#o\n", 1766}, + {"bytes=%ld\tlpid=%d\tcpid=%d\tnattch=%ld\n", 1767}, + {"att_time=%-26.24s\n", 1768}, + {"det_time=%-26.24s\n", 1769}, + {"change_time=%-26.24s\n", 1770}, {"\ \n\ -Message Queue msqid=%d\n", 1772}, - {"uid=%d\tgid=%d\tcuid=%d\tcgid=%d\tmode=%#o\n", 1773}, - {"cbytes=%ld\tqbytes=%ld\tqnum=%ld\tlspid=%d\tlrpid=%d\n", 1774}, - {"send_time=%-26.24s\n", 1775}, - {"rcv_time=%-26.24s\n", 1776}, +Message Queue msqid=%d\n", 1771}, + {"uid=%d\tgid=%d\tcuid=%d\tcgid=%d\tmode=%#o\n", 1772}, + {"cbytes=%ld\tqbytes=%ld\tqnum=%ld\tlspid=%d\tlrpid=%d\n", 1773}, + {"send_time=%-26.24s\n", 1774}, + {"rcv_time=%-26.24s\n", 1775}, {"\ \n\ -Semaphore Array semid=%d\n", 1777}, - {"uid=%d\t gid=%d\t cuid=%d\t cgid=%d\n", 1778}, - {"mode=%#o, access_perms=%#o\n", 1779}, - {"nsems = %ld\n", 1780}, - {"otime = %-26.24s\n", 1781}, - {"ctime = %-26.24s\n", 1782}, - {"semnum", 1783}, - {"value", 1784}, - {"ncount", 1785}, - {"zcount", 1786}, - {"pid", 1787}, - {"usage: rdev [ -rv ] [ -o OFFSET ] [ IMAGE [ VALUE [ OFFSET ] ] ]", 1788}, +Semaphore Array semid=%d\n", 1776}, + {"uid=%d\t gid=%d\t cuid=%d\t cgid=%d\n", 1777}, + {"mode=%#o, access_perms=%#o\n", 1778}, + {"nsems = %ld\n", 1779}, + {"otime = %-26.24s\n", 1780}, + {"ctime = %-26.24s\n", 1781}, + {"semnum", 1782}, + {"value", 1783}, + {"ncount", 1784}, + {"zcount", 1785}, + {"pid", 1786}, + {"usage: rdev [ -rv ] [ -o OFFSET ] [ IMAGE [ VALUE [ OFFSET ] ] ]", 1787}, {"\ - rdev /dev/fd0 (or rdev /linux, etc.) displays the current ROOT device", 1789}, - {" rdev /dev/fd0 /dev/hda2 sets ROOT to /dev/hda2", 1790}, - {" rdev -R /dev/fd0 1 set the ROOTFLAGS (readonly status)", 1791}, - {" rdev -r /dev/fd0 627 set the RAMDISK size", 1792}, - {" rdev -v /dev/fd0 1 set the bootup VIDEOMODE", 1793}, - {" rdev -o N ... use the byte offset N", 1794}, - {" rootflags ... same as rdev -R", 1795}, - {" ramsize ... same as rdev -r", 1796}, - {" vidmode ... same as rdev -v", 1797}, + rdev /dev/fd0 (or rdev /linux, etc.) displays the current ROOT device", 1788}, + {" rdev /dev/fd0 /dev/hda2 sets ROOT to /dev/hda2", 1789}, + {" rdev -R /dev/fd0 1 set the ROOTFLAGS (readonly status)", 1790}, + {" rdev -r /dev/fd0 627 set the RAMDISK size", 1791}, + {" rdev -v /dev/fd0 1 set the bootup VIDEOMODE", 1792}, + {" rdev -o N ... use the byte offset N", 1793}, + {" rootflags ... same as rdev -R", 1794}, + {" ramsize ... same as rdev -r", 1795}, + {" vidmode ... same as rdev -v", 1796}, {"\ -Note: video modes are: -3=Ask, -2=Extended, -1=NormalVga, 1=key1, 2=key2,...", 1798}, - {" use -R 1 to mount root readonly, -R 0 for read/write.", 1799}, - {"missing comma", 1800}, - {"out of memory", 1801}, +Note: video modes are: -3=Ask, -2=Extended, -1=NormalVga, 1=key1, 2=key2,...", 1797}, + {" use -R 1 to mount root readonly, -R 0 for read/write.", 1798}, + {"missing comma", 1799}, + {"out of memory", 1800}, {"\ %s: Usage: \"%s [options]\n\ \t -m (defaults: \"%s\" and\n\ @@ -2368,76 +2367,76 @@ Note: video modes are: -3=Ask, -2=Extended, -1=NormalVga, 1=key1, 2=key2,...", 1 \t -b print individual histogram-bin counts\n\ \t -r reset all the counters (root only)\n\ \t -n disable byte order auto-detection\n\ -\t -V print version and exit\n", 1802}, - {"%s version %s\n", 1803}, - {"Sampling_step: %i\n", 1804}, - {"%s: %s(%i): wrong map line\n", 1805}, - {"%s: can't find \"_stext\" in %s\n", 1806}, - {"%s: profile address out of range. Wrong map file?\n", 1807}, - {"total", 1808}, +\t -V print version and exit\n", 1801}, + {"%s version %s\n", 1802}, + {"Sampling_step: %i\n", 1803}, + {"%s: %s(%i): wrong map line\n", 1804}, + {"%s: can't find \"_stext\" in %s\n", 1805}, + {"%s: profile address out of range. Wrong map file?\n", 1806}, + {"total", 1807}, {"\ -usage: renice priority [ [ -p ] pids ] [ [ -g ] pgrps ] [ [ -u ] users ]\n", 1809}, - {"renice: %s: unknown user\n", 1810}, - {"renice: %s: bad value\n", 1811}, - {"getpriority", 1812}, - {"setpriority", 1813}, - {"%d: old priority %d, new priority %d\n", 1814}, - {"usage: %s program [arg ...]\n", 1815}, +usage: renice priority [ [ -p ] pids ] [ [ -g ] pgrps ] [ [ -u ] users ]\n", 1808}, + {"renice: %s: unknown user\n", 1809}, + {"renice: %s: bad value\n", 1810}, + {"getpriority", 1811}, + {"setpriority", 1812}, + {"%d: old priority %d, new priority %d\n", 1813}, + {"usage: %s program [arg ...]\n", 1814}, {"\ Usage: %s [ -i | -t