swaponoff: add uuid/label support. By Natanael Copa
No binary (build failed)
—
(log yok)
| @@ -21,3 +21,10 @@ | |
| char *get_devname_from_label(const char *spec); | |
| char *get_devname_from_uuid(const char *spec); | |
| void display_uuid_cache(void); | |
| + | |
| + | /* Returns: |
| + | * 0: no UUID= or LABEL= prefix found |
| + | * 1: UUID= or LABEL= prefix found. In this case, |
| + | * *fsname is replaced if device with such UUID or LABEL is found |
| + | */ |
| + | int resolve_mount_spec(char **fsname); |
| @@ -689,6 +689,7 @@ config FEATURE_MOUNT_LABEL | |
| help | |
| This allows for specifying a device by label or uuid, rather than by | |
| name. This feature utilizes the same functionality as blkid/findfs. | |
| + | This also enables label or uuid support for swapon. |
| config FEATURE_MOUNT_NFS | |
| bool "Support mounting NFS file systems" | |
| @@ -12,26 +12,27 @@ | |
| #include "volume_id.h" | |
| int findfs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |
| - | int findfs_main(int argc, char **argv) |
| + | int findfs_main(int argc UNUSED_PARAM, char **argv) |
| { | |
| - | char *tmp = NULL; |
| + | char *dev = *++argv; |
| - | if (argc != 2) |
| + | if (!dev) |
| bb_show_usage(); | |
| - | if (!strncmp(argv[1], "LABEL=", 6)) |
| - | tmp = get_devname_from_label(argv[1] + 6); |
| - | else if (!strncmp(argv[1], "UUID=", 5)) |
| - | tmp = get_devname_from_uuid(argv[1] + 5); |
| - | else if (!strncmp(argv[1], "/dev/", 5)) { |
| - | /* Just pass a device name right through. This might aid in some scripts |
| - | being able to call this unconditionally */ |
| - | tmp = argv[1]; |
| - | } else |
| - | bb_show_usage(); |
| + | if (strncmp(dev, "/dev/", 5) == 0) { |
| + | /* Just pass any /dev/xxx name right through. |
| + | * This might aid in some scripts being able |
| + | * to call this unconditionally */ |
| + | dev = NULL; |
| + | } else { |
| + | /* Otherwise, handle LABEL=xxx and UUID=xxx, |
| + | * fail on anything else */ |
| + | if (!resolve_mount_spec(argv)) |
| + | bb_show_usage(); |
| + | } |
| - | if (tmp) { |
| - | puts(tmp); |
| + | if (*argv != dev) { |
| + | puts(*argv); |
| return 0; | |
| } | |
| return 1; | |
| @@ -50,7 +50,9 @@ | |
| #include "libbb.h" | |
| #if ENABLE_FEATURE_MOUNT_LABEL | |
| - | #include "volume_id.h" |
| + | # include "volume_id.h" |
| + | #else |
| + | # define resolve_mount_spec(fsname) ((void)0) |
| #endif | |
| // Needed for nfs support only | |
| @@ -290,23 +292,6 @@ static int verbose_mount(const char *source, const char *target, | |
| #define verbose_mount(...) mount(__VA_ARGS__) | |
| #endif | |
| - | #if ENABLE_FEATURE_MOUNT_LABEL |
| - | static void resolve_mount_spec(char **fsname) |
| - | { |
| - | char *tmp = NULL; |
| - | |
| - | if (!strncmp(*fsname, "UUID=", 5)) |
| - | tmp = get_devname_from_uuid(*fsname + 5); |
| - | else if (!strncmp(*fsname, "LABEL=", 6)) |
| - | tmp = get_devname_from_label(*fsname + 6); |
| - | |
| - | if (tmp) |
| - | *fsname = tmp; |
| - | } |
| - | #else |
| - | #define resolve_mount_spec(fsname) ((void)0) |
| - | #endif |
| - | |
| // Append mount options to string | |
| static void append_mount_options(char **oldopts, const char *newopts) | |
| { | |
| @@ -11,6 +11,12 @@ | |
| #include <mntent.h> | |
| #include <sys/swap.h> | |
| + | #if ENABLE_FEATURE_MOUNT_LABEL |
| + | # include "volume_id.h" |
| + | #else |
| + | # define resolve_mount_spec(fsname) ((void)0) |
| + | #endif |
| + | |
| #if ENABLE_FEATURE_SWAPON_PRI | |
| struct globals { | |
| int flags; | |
| @@ -26,6 +32,7 @@ static int swap_enable_disable(char *device) | |
| int status; | |
| struct stat st; | |
| + | resolve_mount_spec(&device); |
| xstat(device, &st); | |
| #if ENABLE_DESKTOP | |
| @@ -260,3 +260,20 @@ char *get_devname_from_uuid(const char *spec) | |
| } | |
| return NULL; | |
| } | |
| + | |
| + | int resolve_mount_spec(char **fsname) |
| + | { |
| + | char *tmp = *fsname; |
| + | |
| + | if (strncmp(*fsname, "UUID=", 5) == 0) |
| + | tmp = get_devname_from_uuid(*fsname + 5); |
| + | else if (strncmp(*fsname, "LABEL=", 6) == 0) |
| + | tmp = get_devname_from_label(*fsname + 6); |
| + | |
| + | if (tmp == *fsname) |
| + | return 0; /* no UUID= or LABEL= prefix found */ |
| + | |
| + | if (tmp) |
| + | *fsname = tmp; |
| + | return 1; |
| + | } |