chiark / gitweb /
vol_id: add -L to print raw partition label
[elogind.git] / extras / volume_id / vol_id.c
index d516eb5cbdf7861337c6b4d2d9f371d51160f048..73843ef6995d2cd2b9c92c1bba438c3bbcea7b3a 100644 (file)
@@ -27,6 +27,8 @@
 #include <unistd.h>
 #include <string.h>
 #include <ctype.h>
+#include <errno.h>
+#include <pwd.h>
 #include <grp.h>
 #include <sys/ioctl.h>
 
@@ -114,6 +116,7 @@ int main(int argc, char *argv[])
                            "  -t             filesystem type\n"
                            "  -l             filesystem label\n"
                            "  -u             filesystem uuid\n"
+                           "  -L             raw label\n"
                            " --skip-raid     don't probe for raid\n"
                            " --probe-all     find possibly conflicting signatures\n"
                            " --help\n"
@@ -123,6 +126,7 @@ int main(int argc, char *argv[])
                PRINT_TYPE,
                PRINT_LABEL,
                PRINT_UUID,
+               PRINT_RAW_LABEL,
        } print = PRINT_EXPORT;
        struct volume_id *vid = NULL;
        static char name[VOLUME_ID_LABEL_SIZE];
@@ -131,8 +135,7 @@ int main(int argc, char *argv[])
        int skip_raid = 0;
        int probe_all = 0;
        const char *node = NULL;
-       uid_t nobody_uid;
-       gid_t nobody_gid;
+       struct passwd *pw;
        int retval;
        int rc = 0;
 
@@ -152,6 +155,8 @@ int main(int argc, char *argv[])
                        print = PRINT_LABEL;
                } else if (strcmp(arg, "-u") == 0) {
                        print = PRINT_UUID;
+               } else if (strcmp(arg, "-L") == 0) {
+                       print = PRINT_RAW_LABEL;
                } else if (strcmp(arg, "--skip-raid") == 0) {
                        skip_raid = 1;
                } else if (strcmp(arg, "--probe-all") == 0) {
@@ -180,13 +185,14 @@ int main(int argc, char *argv[])
                size = 0;
        dbg("BLKGETSIZE64=%llu", size);
 
-       /* drop all privileges */
-       nobody_uid = lookup_user("nobody");
-       nobody_gid = lookup_group("nogroup");
-       if (nobody_uid > 0 && nobody_gid > 0) {
+       /* try to drop all privileges before reading disk content */
+       pw = getpwnam ("nobody");
+       if (pw != NULL && pw->pw_uid > 0 && pw->pw_gid > 0) {
+               dbg("dropping privileges to %u:%u", (unsigned int)pw->pw_uid, (unsigned int)pw->pw_gid);
                if (setgroups(0, NULL) != 0 ||
-                   setgid(nobody_gid) != 0 ||
-                   setuid(nobody_uid) != 0) {
+                   setgid(pw->pw_gid) != 0 ||
+                   setuid(pw->pw_uid) != 0) {
+                       fprintf(stderr, "error dropping privileges: %s\n", strerror(errno));
                        rc = 3;
                        goto exit;
                }
@@ -213,53 +219,53 @@ int main(int argc, char *argv[])
                        printf("%s\n", vid->type);
                if (volume_id_probe_jmicron_raid(vid, 0, size) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_vfat(vid, 0) == 0)
+               if (volume_id_probe_vfat(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_linux_swap(vid, 0) == 0)
+               if (volume_id_probe_linux_swap(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_luks(vid, 0) == 0)
+               if (volume_id_probe_luks(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_xfs(vid, 0) == 0)
+               if (volume_id_probe_xfs(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_ext(vid, 0) == 0)
+               if (volume_id_probe_ext(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_reiserfs(vid, 0) == 0)
+               if (volume_id_probe_reiserfs(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_jfs(vid, 0) == 0)
+               if (volume_id_probe_jfs(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_udf(vid, 0) == 0)
+               if (volume_id_probe_udf(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_iso9660(vid, 0) == 0)
+               if (volume_id_probe_iso9660(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_hfs_hfsplus(vid, 0) == 0)
+               if (volume_id_probe_hfs_hfsplus(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_ufs(vid, 0) == 0)
+               if (volume_id_probe_ufs(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_ntfs(vid, 0)  == 0)
+               if (volume_id_probe_ntfs(vid, 0, 0)  == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_cramfs(vid, 0) == 0)
+               if (volume_id_probe_cramfs(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_romfs(vid, 0) == 0)
+               if (volume_id_probe_romfs(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_hpfs(vid, 0) == 0)
+               if (volume_id_probe_hpfs(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_sysv(vid, 0) == 0)
+               if (volume_id_probe_sysv(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_minix(vid, 0) == 0)
+               if (volume_id_probe_minix(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_ocfs1(vid, 0) == 0)
+               if (volume_id_probe_ocfs1(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_ocfs2(vid, 0) == 0)
+               if (volume_id_probe_ocfs2(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_vxfs(vid, 0) == 0)
+               if (volume_id_probe_vxfs(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_squashfs(vid, 0) == 0)
+               if (volume_id_probe_squashfs(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_netware(vid, 0) == 0)
+               if (volume_id_probe_netware(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_gfs(vid, 0) == 0)
+               if (volume_id_probe_gfs(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
-               if (volume_id_probe_gfs2(vid, 0) == 0)
+               if (volume_id_probe_gfs2(vid, 0, 0) == 0)
                        printf("%s\n", vid->type);
 
                goto exit;
@@ -291,20 +297,26 @@ int main(int argc, char *argv[])
                printf("%s\n", vid->type);
                break;
        case PRINT_LABEL:
-               if (name[0] == '\0' ||
-                   (vid->usage_id != VOLUME_ID_FILESYSTEM && vid->usage_id != VOLUME_ID_DISKLABEL)) {
+               if (name[0] == '\0' || vid->usage_id == VOLUME_ID_RAID) {
                        rc = 3;
                        goto exit;
                }
                printf("%s\n", name);
                break;
        case PRINT_UUID:
-               if (vid->uuid[0] == '\0' || vid->usage_id != VOLUME_ID_FILESYSTEM) {
+               if (vid->uuid[0] == '\0' || vid->usage_id == VOLUME_ID_RAID) {
                        rc = 4;
                        goto exit;
                }
                printf("%s\n", vid->uuid);
                break;
+       case PRINT_RAW_LABEL:
+               if (vid->label[0] == '\0' || vid->usage_id == VOLUME_ID_RAID) {
+                       rc = 3;
+                       goto exit;
+               }
+               printf("%s\n", vid->label);
+               break;
        }
 
 exit: