aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libbb.h3
-rw-r--r--include/usage.h84
-rw-r--r--libbb/loop.c44
-rw-r--r--util-linux/losetup.c24
4 files changed, 65 insertions, 90 deletions
diff --git a/include/libbb.h b/include/libbb.h
index d1c6be670..96dc46a09 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -232,6 +232,7 @@ extern char *bb_askpass(int timeout, const char * prompt);
extern int device_open(const char *device, int mode);
+extern char *query_loop(const char *device);
extern int del_loop(const char *device);
extern int set_loop(char **device, const char *file, int offset);
@@ -466,7 +467,7 @@ typedef struct {
} procps_status_t;
extern procps_status_t * procps_scan(int save_user_arg0);
-extern int compare_string_array(const char * const string_array[], const char *key);
+extern unsigned short compare_string_array(const char *string_array[], const char *key);
extern int my_query_module(const char *name, int which, void **buf, size_t *bufsize, size_t *ret);
diff --git a/include/usage.h b/include/usage.h
index 912a88f4e..53832b987 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -1657,13 +1657,18 @@
"\t-f\t\toutput data as the log grows"
#define losetup_trivial_usage \
- "[OPTION]... LOOPDEVICE FILE\n" \
- "or: losetup [OPTION]... -d LOOPDEVICE"
+ "[-od] LOOPDEVICE [FILE]\n"
#define losetup_full_usage \
- "Associate LOOPDEVICE with FILE.\n\n" \
+ "Associate LOOPDEVICE with FILE, or display current association.\n\n" \
"Options:\n" \
"\t-d\t\tDisassociate LOOPDEVICE\n" \
"\t-o OFFSET\tStart OFFSET bytes into FILE"
+#define losetup_notes_usage \
+ "One argument (losetup /dev/loop1) will display the current association\n" \
+ "(if any), or disassociate it (with -d). The display shows the offset\n" \
+ "and filename of the file the loop device is currently bound to.\n\n" \
+ "Two arguments (losetup /dev/loop1 file.img) create a new association,\n" \
+ "with an optional offset (-o 12345). Encryption is not yet supported.\n\n"
#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
# define USAGE_LS_TIMESTAMPS(a) a
@@ -1946,74 +1951,18 @@
"-rw------- 1 andersen andersen 0 Apr 25 17:10 /tmp/temp.mWiLjM\n"
#define modprobe_trivial_usage \
- "[-knqrsv] MODULE [symbol=value ...]"
+ "[-knqrsv] [MODULE ...]"
#define modprobe_full_usage \
+ "Used for high level module loading and unloading.\n\n" \
"Options:\n" \
"\t-k\tMake module autoclean-able\n" \
"\t-n\tJust show what would be done\n" \
"\t-q\tQuiet output\n" \
"\t-r\tRemove module (stacks) or do autoclean\n" \
"\t-s\tReport via syslog instead of stderr\n" \
- "\t-v\tVerbose output\n\n"
-#define modprobe_notes_usage \
-"modprobe can (un)load a stack of modules, passing each module options (when\n" \
-"loading). modprobe uses a configuration file to determine what option(s) to\n" \
-"pass each module it loads.\n" \
-"\n" \
-"The configuration file is searched (in order) amongst:\n" \
-"\n" \
-" /etc/modprobe.conf (2.6 only)\n" \
-" /etc/modules.conf\n" \
-" /etc/conf.modules (deprecated)\n" \
-"\n" \
-"They all have the same syntax (see below). If none is present, it is\n" \
-"_not_ an error; each loaded module is then expected to load without\n" \
-"options. Once a file is found, the others are tested for.\n" \
-"\n" \
-"/etc/modules.conf entry format:\n" \
-"\n" \
-" alias <alias_name> <mod_name>\n" \
-" Makes it possible to modprobe alias_name, when there is no such module.\n" \
-" It makes sense if your mod_name is long, or you want a more reprenstative\n" \
-" name for that module (eg. 'scsi' in place of 'aha7xxx').\n" \
-" This makes it also possible to use a different set of options (below) for\n" \
-" the module and the alias.\n" \
-" A module can be aliased more than once.\n" \
-"\n" \
-" options <mod_name|alias_name> <symbol=value ...>\n" \
-" When loading module mod_name (or the module aliased by alias_name), pass\n" \
-" the \"symbol=value\" pairs as option to that module.\n" \
-"\n" \
-"Sample /etc/modules.conf file:\n" \
-"\n" \
-" options tulip irq=3\n" \
-" alias tulip tulip2\n" \
-" options tulip2 irq=4 io=0x308\n" \
-"\n" \
-"Other functionality offered by 'classic' modprobe is not available in\n" \
-"this implementation.\n" \
-"\n" \
-"If module options are present both in the config file, and on the command line,\n" \
-"then the options from the command line will be passed to the module _after_\n" \
-"the options from the config file. That way, you can have defaults in the config\n" \
-"file, and override them for a specific usage from the command line.\n"
+ "\t-v\tVerbose output"
#define modprobe_example_usage \
- "(with the above /etc/modules.conf):\n\n" \
- "$ modprobe tulip\n" \
- " will load the module 'tulip' with default option 'irq=3'\n\n" \
- "$ modprobe tulip irq=5\n" \
- " will load the module 'tulip' with option 'irq=5', thus overriding the default\n\n" \
- "$ modprobe tulip2\n" \
- " will load the module 'tulip' with default options 'irq=4 io=0x308',\n" \
- " which are the default for alias 'tulip2'\n\n" \
- "$ modprobe tulip2 irq=8\n" \
- " will load the module 'tulip' with default options 'irq=4 io=0x308 irq=8',\n" \
- " which are the default for alias 'tulip2' overriden by the option 'irq=8'\n\n" \
- " from the command line\n\n" \
- "$ modprobe tulip2 irq=2 io=0x210\n" \
- " will load the module 'tulip' with default options 'irq=4 io=0x308 irq=4 io=0x210',\n" \
- " which are the default for alias 'tulip2' overriden by the options 'irq=2 io=0x210'\n\n" \
- " from the command line\n"
+ "$ modprobe cdrom\n"
#define more_trivial_usage \
"[FILE ...]"
@@ -2054,12 +2003,13 @@
"\tdev/nodev:\tAllow use of special device files / disallow them\n" \
"\texec/noexec:\tAllow use of executable files / disallow them\n" \
USAGE_MOUNT_LOOP( \
- "\tloop:\t\tMounts a file via loop device\n" \
+ "\tloop:\t\t Ignored (loop devices are autodetected)\n" \
) \
"\tsuid/nosuid:\tAllow set-user-id-root programs / disallow them\n" \
"\tremount:\tRe-mount a mounted filesystem, changing its flags\n" \
"\tro/rw:\t\tMount for read-only / read-write\n" \
- "\tbind:\t\tUse the linux 2.4.x \"bind\" feature\n" \
+ "\tbind:\t\tBind a directory to an additional location\n" \
+ "\tmove:\t\tRelocate an existing mount point.\n" \
"\nThere are EVEN MORE flags that are specific to each filesystem\n" \
"You'll have to see the written documentation for those filesystems"
#define mount_example_usage \
@@ -2068,7 +2018,8 @@
"proc on /proc type proc (rw)\n" \
"devpts on /dev/pts type devpts (rw)\n" \
"$ mount /dev/fd0 /mnt -t msdos -o ro\n" \
- "$ mount /tmp/diskimage /opt -t ext2 -o loop\n"
+ "$ mount /tmp/diskimage /opt -t ext2 -o loop\n" \
+ "$ mount cd_image.iso mydir\n"
#define mountpoint_trivial_usage \
"[-q] <[-d] DIR | -x DEVICE>"
@@ -3008,7 +2959,6 @@
"Telnetd listens for incoming TELNET connections on PORT.\n" \
"Options:\n" \
"\t-p PORT\tlisten for connections on PORT (default 23)\n" \
- "\t-b ADDR\tlisten for connections on ADDR (default 0.0.0.0)\n"\
"\t-l LOGIN\texec LOGIN on connect (default /bin/sh)\n" \
"\t-f issue_file\tDisplay issue_file instead of /etc/issue"
#endif
diff --git a/libbb/loop.c b/libbb/loop.c
index 10217931b..00e3d6236 100644
--- a/libbb/loop.c
+++ b/libbb/loop.c
@@ -51,15 +51,30 @@ typedef struct {
} bb_loop_info;
#endif
-extern int del_loop(const char *device)
+char *query_loop(const char *device)
{
- int fd,rc=0;
+ int fd;
+ bb_loop_info loopinfo;
+ char *dev=0;
+
+ if ((fd = open(device, O_RDONLY)) < 0) return 0;
+ if (!ioctl(fd, BB_LOOP_GET_STATUS, &loopinfo))
+ dev=bb_xasprintf("%ld %s", (long) loopinfo.lo_offset,
+ loopinfo.lo_file_name);
+ close(fd);
- if ((fd = open(device, O_RDONLY)) < 0) rc=1;
- else {
- if (ioctl(fd, LOOP_CLR_FD, 0) < 0) rc=1;
- close(fd);
- }
+ return dev;
+}
+
+
+int del_loop(const char *device)
+{
+ int fd, rc;
+
+ if ((fd = open(device, O_RDONLY)) < 0) return 1;
+ rc=ioctl(fd, LOOP_CLR_FD, 0);
+ close(fd);
+
return rc;
}
@@ -69,9 +84,9 @@ extern int del_loop(const char *device)
search will re-use an existing loop device already bound to that
file/offset if it finds one.
*/
-extern int set_loop(char **device, const char *file, int offset)
+int set_loop(char **device, const char *file, int offset)
{
- char dev[20];
+ char dev[20], *try;
bb_loop_info loopinfo;
struct stat statbuf;
int i, dfd, ffd, mode, rc=1;
@@ -81,20 +96,21 @@ extern int set_loop(char **device, const char *file, int offset)
return errno;
/* Find a loop device. */
+ try=*device ? : dev;
for(i=0;rc;i++) {
sprintf(dev, LOOP_FORMAT, i++);
/* Ran out of block devices, return failure. */
- if(stat(*device ? *device : dev, &statbuf) ||
- !S_ISBLK(statbuf.st_mode)) {
+ if(stat(try, &statbuf) || !S_ISBLK(statbuf.st_mode)) {
rc=ENOENT;
break;
}
/* Open the sucker and check its loopiness. */
- if((dfd=open(dev, mode))<0 && errno==EROFS)
- dfd=open(dev,mode=O_RDONLY);
+ if((dfd=open(try, mode))<0 && errno==EROFS)
+ dfd=open(try,mode=O_RDONLY);
if(dfd<0) continue;
rc=ioctl(dfd, BB_LOOP_GET_STATUS, &loopinfo);
+
/* If device free, claim it. */
if(rc && errno==ENXIO) {
memset(&loopinfo, 0, sizeof(loopinfo));
@@ -110,7 +126,7 @@ extern int set_loop(char **device, const char *file, int offset)
without using losetup manually is problematic.)
*/
} else if(strcmp(file,loopinfo.lo_file_name)
- || offset!=loopinfo.lo_offset) rc=1;
+ || offset!=loopinfo.lo_offset) rc=-1;
close(dfd);
if(*device) break;
}
diff --git a/util-linux/losetup.c b/util-linux/losetup.c
index 11bd66ebf..b2af63dc0 100644
--- a/util-linux/losetup.c
+++ b/util-linux/losetup.c
@@ -24,8 +24,7 @@
#include "busybox.h"
-int
-losetup_main (int argc, char **argv)
+int losetup_main (int argc, char **argv)
{
int offset = 0;
@@ -34,18 +33,27 @@ losetup_main (int argc, char **argv)
switch(getopt(argc,argv, "do:")) {
case 'd':
/* detach takes exactly one argument */
- if(optind+1==argc)
- return del_loop(argv[optind]) ? EXIT_SUCCESS : EXIT_FAILURE;
- break;
+ if(optind+1==argc && !del_loop(argv[optind])) return EXIT_SUCCESS;
+die_failed:
+ bb_perror_msg_and_die("%s",argv[optind]);
case 'o':
offset = bb_xparse_number (optarg, NULL);
/* Fall through to do the losetup */
case -1:
/* losetup takes two argument:, loop_device and file */
- if(optind+2==argc)
- return set_loop(&argv[optind], argv[optind + 1], offset)<0
- ? EXIT_FAILURE : EXIT_SUCCESS;
+ if(optind+2==argc) {
+ if(set_loop(&argv[optind], argv[optind + 1], offset)>=0)
+ return EXIT_SUCCESS;
+ else goto die_failed;
+ }
+ if(optind+1==argc) {
+ char *s=query_loop(argv[optind]);
+ if (!s) goto die_failed;
+ printf("%s: %s\n",argv[optind],s);
+ if(ENABLE_FEATURE_CLEAN_UP) free(s);
+ return EXIT_SUCCESS;
+ }
break;
}
bb_show_usage();