From 7e518d625dbcb42f0b943ce5ba75106994d0cbb4 Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Tue, 30 Mar 2004 14:31:51 +0000 Subject: [PATCH] Move full mknodes functionality from dmsetup into libdevmapper. --- dmsetup/dmsetup.c | 75 ++++++++++++++------------------------ lib/ioctl/libdevmapper.c | 78 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 49 deletions(-) diff --git a/dmsetup/dmsetup.c b/dmsetup/dmsetup.c index 808027c..563dc29 100644 --- a/dmsetup/dmsetup.c +++ b/dmsetup/dmsetup.c @@ -325,40 +325,6 @@ static int _wait(int argc, char **argv, void *data) (argc == 3) ? atoi(argv[2]) : 0, 1); } -static int _process_mapper_dir(int argc, char **argv, - int (*fn) (int argc, char **argv, void *data)) -{ - struct dirent *dirent; - struct dm_names *names; - DIR *d; - const char *dir; - int r = 1; - - dir = dm_dir(); - if (!(d = opendir(dir))) { - fprintf(stderr, "opendir %s: %s", dir, strerror(errno)); - return 0; - } - - while ((dirent = readdir(d))) { - if (!strcmp(dirent->d_name, ".") || - !strcmp(dirent->d_name, "..") || - !strcmp(dirent->d_name, "control")) - continue; - /* Set up names->name for _info */ - names = (void *) dirent->d_name - - ((void *) &names->name - (void *) &names->dev); - if (!fn(argc, argv, names)) - r = 0; - } - - if (closedir(d)) { - fprintf(stderr, "closedir %s: %s", dir, strerror(errno)); - } - - return r; -} - static int _process_all(int argc, char **argv, int (*fn) (int argc, char **argv, void *data)) { @@ -368,9 +334,6 @@ static int _process_all(int argc, char **argv, struct dm_task *dmt; - if (!strcmp(argv[0], "mknodes")) - r = _process_mapper_dir(argc, argv, fn); - if (!(dmt = dm_task_create(DM_DEVICE_LIST))) return 0; @@ -495,14 +458,34 @@ static int _targets(int argc, char **argv, void *data) } +static int _mknodes(int argc, char **argv, void *data) +{ + struct dm_task *dmt; + int r = 0; + + if (!(dmt = dm_task_create(DM_DEVICE_MKNODES))) + return 0; + + if (argc == 2 && !dm_task_set_name(dmt, argv[1])) + goto out; + + if (!dm_task_run(dmt)) + goto out; + + r = 1; + + out: + dm_task_destroy(dmt); + return r; +} + static int _info(int argc, char **argv, void *data) { int r = 0; struct dm_task *dmt; struct dm_names *names = (struct dm_names *) data; - char *name; - int taskno; + char *name = NULL; if (argc == 1 && !data) return _process_all(argc, argv, _info); @@ -512,22 +495,16 @@ static int _info(int argc, char **argv, void *data) else name = argv[1]; - if (!strcmp(argv[0], "mknodes")) - taskno = DM_DEVICE_MKNODES; - else - taskno = DM_DEVICE_INFO; - - if (!(dmt = dm_task_create(taskno))) + if (!(dmt = dm_task_create(DM_DEVICE_INFO))) return 0; - if (!dm_task_set_name(dmt, name)) + if (name && !dm_task_set_name(dmt, name)) goto out; if (!dm_task_run(dmt)) goto out; - if (taskno == DM_DEVICE_INFO) - _display_info(dmt); + _display_info(dmt); r = 1; @@ -640,10 +617,10 @@ static struct command _commands[] = { {"ls", "", 0, 0, _ls}, {"info", "[]", 0, 1, _info}, {"deps", "[]", 0, 1, _deps}, - {"mknodes", "[]", 0, 1, _info}, {"status", "[]", 0, 1, _status}, {"table", "[]", 0, 1, _status}, {"wait", " []", 1, 2, _wait}, + {"mknodes", "[]", 0, 1, _mknodes}, {"targets", "", 0, 0, _targets}, {"version", "", 0, 0, _version}, {NULL, NULL, 0, 0, NULL} diff --git a/lib/ioctl/libdevmapper.c b/lib/ioctl/libdevmapper.c index 9c23531..8650471 100644 --- a/lib/ioctl/libdevmapper.c +++ b/lib/ioctl/libdevmapper.c @@ -929,6 +929,81 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt) return NULL; } +static int _process_mapper_dir(struct dm_task *dmt) +{ + struct dirent *dirent; + DIR *d; + const char *dir; + int r = 1; + + dir = dm_dir(); + if (!(d = opendir(dir))) { + fprintf(stderr, "opendir %s: %s", dir, strerror(errno)); + return 0; + } + + while ((dirent = readdir(d))) { + if (!strcmp(dirent->d_name, ".") || + !strcmp(dirent->d_name, "..") || + !strcmp(dirent->d_name, "control")) + continue; + dm_task_set_name(dmt, dirent->d_name); + dm_task_run(dmt); + } + + if (closedir(d)) { + fprintf(stderr, "closedir %s: %s", dir, strerror(errno)); + } + + return r; +} + +static int _process_all_v4(struct dm_task *dmt) +{ + struct dm_task *task; + struct dm_names *names; + unsigned next = 0; + int r = 1; + + if (!(task = dm_task_create(DM_DEVICE_LIST))) + return 0; + + if (!dm_task_run(task)) { + r = 0; + goto out; + } + + if (!(names = dm_task_get_names(task))) { + r = 0; + goto out; + } + + if (!names->dev) + goto out; + + do { + names = (void *) names + next; + if (!dm_task_set_name(dmt, names->name)) { + r = 0; + goto out; + } + if (!dm_task_run(dmt)) + r = 0; + next = names->next; + } while (next); + + out: + dm_task_destroy(task); + return r; +} + +static int _mknodes_v4(struct dm_task *dmt) +{ + (void) _process_mapper_dir(dmt); + + return _process_all_v4(dmt); +} + static int _create_and_load_v4(struct dm_task *dmt) { struct dm_task *task; @@ -1016,6 +1091,9 @@ int dm_task_run(struct dm_task *dmt) if (dmt->type == DM_DEVICE_CREATE && dmt->head) return _create_and_load_v4(dmt); + if (dmt->type == DM_DEVICE_MKNODES && !dmt->dev_name) + return _mknodes_v4(dmt); + if (!_open_control()) return 0; -- 2.43.5