X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=lib%2Flibzfs%2Flibzfs_util.c;h=982a6f05fd97d87fea28ad1bec6b83208f42a34c;hb=c6327b63e6d3a11bb333829a8341d572e2fa7d9f;hp=163cd1671fa9f0b17a528d9a29ca5b7062026b03;hpb=b4ead57cfb410247eee4d2a8a6e488cf4542ac77;p=zfs.git diff --git a/lib/libzfs/libzfs_util.c b/lib/libzfs/libzfs_util.c index 163cd16..982a6f0 100644 --- a/lib/libzfs/libzfs_util.c +++ b/lib/libzfs/libzfs_util.c @@ -632,15 +632,26 @@ libzfs_module_loaded(const char *module) } int -libzfs_run_process(const char *path, char *argv[]) +libzfs_run_process(const char *path, char *argv[], int flags) { pid_t pid; - int rc; + int rc, devnull_fd; pid = vfork(); if (pid == 0) { - close(1); - close(2); + devnull_fd = open("/dev/null", O_WRONLY); + + if (devnull_fd < 0) + _exit(-1); + + if (!(flags & STDOUT_VERBOSE)) + (void) dup2(devnull_fd, STDOUT_FILENO); + + if (!(flags & STDERR_VERBOSE)) + (void) dup2(devnull_fd, STDERR_FILENO); + + close(devnull_fd); + (void) execvp(path, argv); _exit(-1); } else if (pid > 0) { @@ -665,7 +676,7 @@ libzfs_load_module(const char *module) if (libzfs_module_loaded(module)) return 0; - return libzfs_run_process("/sbin/modprobe", argv); + return libzfs_run_process("/sbin/modprobe", argv, 0); } libzfs_handle_t * @@ -810,16 +821,29 @@ int zfs_resolve_shortname(const char *name, char *path, size_t pathlen) { int i, err; - char dirs[5][9] = {"by-id", "by-label", "by-path", "by-uuid", "zpool"}; + char dirs[6][9] = {"by-id", "by-label", "by-path", "by-uuid", "zpool", + "by-vdev"}; + /* /dev/ */ (void) snprintf(path, pathlen, "%s/%s", DISK_ROOT, name); err = access(path, F_OK); - for (i = 0; i < 5 && err < 0; i++) { + if (err == 0) + return (err); + + /* /dev/mapper/ */ + (void) snprintf(path, pathlen, "%s/mapper/%s", DISK_ROOT, name); + err = access(path, F_OK); + if (err == 0) + return (err); + + /* /dev/disk// */ + for (i = 0; i < 6 && err < 0; i++) { (void) snprintf(path, pathlen, "%s/%s/%s", UDISK_ROOT, dirs[i], name); err = access(path, F_OK); } - return err; + + return (err); } /* @@ -1182,11 +1206,14 @@ str2shift(libzfs_handle_t *hdl, const char *buf) } /* - * We want to allow trailing 'b' characters for 'GB' or 'Mb'. But don't - * allow 'BB' - that's just weird. + * Allow 'G' = 'GB' = 'GiB', case-insensitively. + * However, 'BB' and 'BiB' are disallowed. */ - if (buf[1] == '\0' || (toupper(buf[1]) == 'B' && buf[2] == '\0' && - toupper(buf[0]) != 'B')) + if (buf[1] == '\0' || + (toupper(buf[0]) != 'B' && + ((toupper(buf[1]) == 'B' && buf[2] == '\0') || + (toupper(buf[1]) == 'I' && toupper(buf[2]) == 'B' && + buf[3] == '\0')))) return (10*i); zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,