]> sourceware.org Git - lvm2.git/commitdiff
Allow $DM_DEV_DIR envvar to override default of "/dev".
authorJim Meyering <jim@meyering.net>
Tue, 9 Oct 2007 12:14:48 +0000 (12:14 +0000)
committerJim Meyering <jim@meyering.net>
Tue, 9 Oct 2007 12:14:48 +0000 (12:14 +0000)
* dmsetup/dmsetup.c (DEV_PATH): Remove definition.
(parse_loop_device_name): Add parameter: dev_dir.
Declare the "dev" parameter to be "const".
Use dev_dir, not DEV_PATH.  Handle the case in which dev_dir
does not end in a "/".
(_get_abspath): Declare "path" parameter "const", to match.
(_process_losetup_switches): Add parameter: dev_dir.
Pass dev_dir to parse_loop_device_name.
(_process_switches): Add parameter: dev_dir.
Pass dev_dir to _process_losetup_switches.
(main): Set dev_dir from the DM_DEV_DIR envvar, else to "/dev".
Call dm_set_dev_dir.
* lib/libdm-common.c (dm_set_dev_dir): Rewrite to be careful
about boundary conditions, now that dev_dir may be tainted.
* man/dmsetup.8: Mention $DM_DEV_DIR.

Author: Jim Meyering <meyering@redhat.com>

WHATS_NEW_DM
libdm/libdm-common.c
man/dmsetup.8.in
tools/dmsetup.c

index 32b9680968edb0a1528c445800e0a2726165cba9..a707704d2516a78da131f9d612d01ae668f02e11 100644 (file)
@@ -1,5 +1,6 @@
 Version 1.02.23 - 
 ==================================
+  Allow $DM_DEV_DIR envvar to override default of "/dev".
   Create e.g., libdevmapper.so.1.02, in build dir alongside the .so file.
   Avoid static link failure with some SELinux libraries.
   Remove obsolete dmfs code from tree and update INSTALL.
index c8c3500a483f6ef31f6f3c66922817c9ff669994..d2e212aa720e79c6d3ad1329ae18aef4c68549dc 100644 (file)
@@ -463,9 +463,25 @@ void update_devs(void)
        _pop_node_ops();
 }
 
-int dm_set_dev_dir(const char *dir)
+int dm_set_dev_dir(const char *dev_dir)
 {
-       snprintf(_dm_dir, sizeof(_dm_dir), "%s%s", dir, DM_DIR);
+       size_t len;
+       const char *slash;
+       if (*dev_dir != '/') {
+               log_debug("Invalid dev_dir value, %s: "
+                         "not an absolute name.", dev_dir);
+               return 0;
+       }
+
+       len = strlen(dev_dir);
+       slash = dev_dir[len-1] == '/' ? "" : "/";
+
+       if (snprintf(_dm_dir, sizeof _dm_dir, "%s%s%s", dev_dir, slash, DM_DIR)
+           >= sizeof _dm_dir) {
+               log_debug("Invalid dev_dir value, %s: name too long.", dev_dir);
+               return 0;
+       }
+
        return 1;
 }
 
index 5b2ed9f85ab5c840d9bf36e6d2dc1405f0bde484..5e5debe17d6697defa8d9c56548c8c25521b398b 100644 (file)
@@ -341,6 +341,12 @@ for creating devices with holes in them.
 .br
 2056320 2875602 linear /dev/hdb 1028160
 
+.SH ENVIRONMENT VARIABLES
+.TP
+\fBDM_DEV_DIR\fP
+The device directory name.
+Defaults to "/dev" and must be an absolute name.
+
 .SH AUTHORS
 Original version: Joe Thornber (thornber@sistina.com)
 
index 562f6288b3042a63791f184bb5c33cc9d1ef62bd..7adaf0d8ec551c691bfc98f1e440cd1f4d88dcd0 100644 (file)
@@ -90,6 +90,8 @@ extern char *optarg;
 #define ARGS_MAX 256
 #define LOOP_TABLE_SIZE (PATH_MAX + 255)
 
+#define DEFAULT_DM_DEV_DIR "/dev"
+
 /* FIXME Should be imported */
 #ifndef DM_MAX_TYPE_NAME
 #  define DM_MAX_TYPE_NAME 16
@@ -97,7 +99,6 @@ extern char *optarg;
 
 /* FIXME Should be elsewhere */
 #define SECTOR_SHIFT 9L
-#define DEV_PATH "/dev/"
 
 #define err(msg, x...) fprintf(stderr, msg "\n", ##x)
 
@@ -2129,7 +2130,7 @@ static int _process_tree_options(const char *options)
  * Returns the full absolute path, or NULL if the path could
  * not be resolved.
  */
-static char *_get_abspath(char *path)
+static char *_get_abspath(const char *path)
 {
        char *_path;
 
@@ -2141,7 +2142,7 @@ static char *_get_abspath(char *path)
        return _path;
 }
 
-static char *parse_loop_device_name(char *dev)
+static char *parse_loop_device_name(const char *dev, const char *dev_dir)
 {
        char *buf;
        char *device;
@@ -2153,7 +2154,13 @@ static char *parse_loop_device_name(char *dev)
                if (!(device = _get_abspath(dev)))
                        goto error;
 
-               if (strncmp(device, DEV_PATH, strlen(DEV_PATH)))
+               if (strncmp(device, dev_dir, strlen(dev_dir)))
+                       goto error;
+
+               /* If dev_dir does not end in a slash, ensure that the
+                  following byte in the device string is "/".  */
+               if (dev_dir[strlen(dev_dir) - 1] != '/'
+                   && device[strlen(dev_dir)] != '/')
                        goto error;
 
                strncpy(buf, strrchr(device, '/') + 1, (size_t) PATH_MAX);
@@ -2234,7 +2241,8 @@ error:
        return 0;
 }
 
-static int _process_losetup_switches(const char *base, int *argc, char ***argv)
+static int _process_losetup_switches(const char *base, int *argc, char ***argv,
+                                    const char *dev_dir)
 {
        static int ind;
        int c;
@@ -2297,7 +2305,7 @@ static int _process_losetup_switches(const char *base, int *argc, char ***argv)
                return 0;
        }
 
-       if (!(device_name = parse_loop_device_name((*argv)[0]))) {
+       if (!(device_name = parse_loop_device_name((*argv)[0], dev_dir))) {
                fprintf(stderr, "%s: Could not parse loop_device %s\n",
                        base, (*argv)[0]);
                _losetup_usage(stderr);
@@ -2344,7 +2352,7 @@ static int _process_losetup_switches(const char *base, int *argc, char ***argv)
        return 1;
 }
 
-static int _process_switches(int *argc, char ***argv)
+static int _process_switches(int *argc, char ***argv, const char *dev_dir)
 {
        char *base, *namebase;
        static int ind;
@@ -2422,7 +2430,7 @@ static int _process_switches(int *argc, char ***argv)
        }
 
        if (!strcmp(base, "losetup") || !strcmp(base, "dmlosetup")){
-               r = _process_losetup_switches(base, argc, argv);
+               r = _process_losetup_switches(base, argc, argv, dev_dir);
                free(namebase);
                return r;
        }
@@ -2539,10 +2547,21 @@ int main(int argc, char **argv)
 {
        struct command *c;
        int r = 1;
+       const char *dev_dir;
 
        (void) setlocale(LC_ALL, "");
 
-       if (!_process_switches(&argc, &argv)) {
+       dev_dir = getenv ("DM_DEV_DIR");
+       if (dev_dir && *dev_dir) {
+               if (!dm_set_dev_dir(dev_dir)) {
+                       fprintf(stderr, "Invalid DM_DEV_DIR envvar value.\n");
+                       goto out;
+               }
+       } else {
+               dev_dir = DEFAULT_DM_DEV_DIR;
+       }
+
+       if (!_process_switches(&argc, &argv, dev_dir)) {
                fprintf(stderr, "Couldn't process command line.\n");
                goto out;
        }
This page took 0.058527 seconds and 5 git commands to generate.