1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-02-04 17:47:03 +03:00

rename udev_volume_id to vol_id and add --export option

Signed-off-by: Kay Sievers <kay.sievers@suse.de>
This commit is contained in:
Kay Sievers 2005-06-26 01:54:47 +02:00
parent 670e470543
commit 208f6aba21
5 changed files with 132 additions and 108 deletions

View File

@ -81,6 +81,7 @@ static void set_str(char *to, const unsigned char *from, int count)
case '/':
case ' ':
to[j++] = '_';
break;
default:
to[j++] = from[i];
}

View File

@ -1,13 +1,13 @@
# Makefile for udev_volume_id
# Makefile for volume_id
#
# Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
# Copyright (C) 2004, 2005 Kay Sievers <kay.sievers@vrfy.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
PROG = udev_volume_id
PROG = vol_id
all: $(PROG)
@ -33,7 +33,7 @@ override CFLAGS+=-D_FILE_OFFSET_BITS=64
VOLUME_ID_BASE=volume_id
include $(VOLUME_ID_BASE)/Makefile.inc
OBJS = udev_volume_id.o $(VOLUME_ID_OBJS) ../../udev.a
OBJS = vol_id.o $(VOLUME_ID_OBJS) ../../udev.a
HEADERS = $(VOLUME_ID_HEADERS)
$(OBJS): $(HEADERS)

View File

@ -1,43 +1,73 @@
udev_volume_id - partition, filesystem, disklabel reader
vol_id - partition, filesystem, disklabel reader
This program is normally called from a udev rule, to provide udev with the
name, uuid or the filesystem type of a partition to name a device node.
udev_volume_id opens the blockdevice node specified at the commandline.
The following commandline switches are supported to specify what udev_volume_id
should print to stdout:
vol_id opens the blockdevice node specified at the commandline.
The following commandline switches are supported to specify what vol_id
should print:
no option prints all values
-h prints help text
-l prints the label of the partition
-u prints the uuid of the partition
--export prints all values
-h prints help text
-l prints the label of the partition
-u prints the uuid of the partition
udev_volume_id will only return successful if the string asked for, is not
vol_id will only return successful if the string asked for, is not
empty. All trailing whitespace will be removed, spaces replaced by underscore
and slashes ignored.
The following rule will create a symlink named with the label string:
KERNEL="[hs]d*", PROGRAM="/sbin/udev_volume_id -l %N", SYMLINK="%c"
fstype probe label uuid fsversion
----------------------------------------------------
ext * * * *
reiserfs jr/3.5/3.6/4 * * * *
fat (12, 16, 32) * * * *
ntfs * * * *
jfs * * * -
xfs * * * -
hfs (plus, wrapped) * * * -
udf * * - -
iso9660 * * n/a -
ufs * - - -
linux swap * * * *
LVM 1 * - - -
LVM 2 * - - *
linux raid * - * *
cramfs * * - -
sysv * * - *
luks * - * -
hpfs * - - -
romfs *
minix *
dasd *
highpoint *
isw_raid *
lsi_raid *
nvidia_raid *
promise_raid *
silicon_raid *
via_raid *
mac partitons *
msdos partitions *
If no label is found udev_volume_id exits with nonzero and the rule will be
The following rule will create a symlink named with the label string:
KERNEL=="[hs]d*", PROGRAM=="/sbin/vol_id -l %N", SYMLINK+="%c"
If no label is found vol_id exits with nonzero and the rule will be
ignored.
To give it a try, you may call it on the commandline:
[root@pim udev.kay]# extras/volume_id/udev_volume_id /dev/hda3
[root@pim udev.kay]# extras/volume_id/vol_id /dev/hda3
T:ext3
L:Music Store
N:Music_Store
U:d2da42b5-bbd9-44eb-a72c-cc4542fcb71e
[root@pim udev.kay]# extras/volume_id/udev_volume_id -l /dev/hda3
[root@pim udev.kay]# extras/volume_id/vol_id -l /dev/hda3
Music_Store
[root@pim udev.kay]# extras/volume_id/udev_volume_id -t /dev/hda3
[root@pim udev.kay]# extras/volume_id/vol_id -t /dev/hda3
swap
Please send any comment/questions/concerns to me or:
linux-hotplug-devel@lists.sourceforge.net
Any comment/questions/concerns to me:
Kay Sievers <kay.sievers@vrfy.org>

View File

@ -1,7 +0,0 @@
# s390 block devices named by disk label
KERNEL="dasd*[a-z]", PROGRAM="/sbin/udev_volume_id -d -l" RESULT="[0-9A-Z]*", SYMLINK="dasd/%c/disc dasd/%b/disc"
KERNEL="dasd*[0-9]", PROGRAM="/sbin/udev_volume_id -d -l" RESULT="[0-9A-Z]*", SYMLINK="dasd/%c/part%n dasd/%b/part%n"
KERNEL="dasd*[a-z]", SYMLINK="dasd/%b/disc"
KERNEL="dasd*[0-9]", SYMLINK="dasd/%b/part%n"
KERNEL="dcssblk*", NAME="%k", SYMLINK="dcssblk/%b"

View File

@ -64,60 +64,83 @@ void log_message(int priority, const char *format, ...)
}
#endif
extern int optind;
static void set_str(char *to, const unsigned char *from, int count)
{
int i, j;
int len;
len = strnlen(from, count);
while (isspace(from[len-1]))
len--;
i = 0;
while (isspace(from[i]) && (i < len))
i++;
j = 0;
while (i < len) {
switch(from[i]) {
case '/':
break;
case ' ':
to[j++] = '_';
break;
default:
to[j++] = from[i];
}
i++;
}
to[j] = '\0';
}
int main(int argc, char *argv[])
{
const char help[] = "usage: udev_volume_id [-t|-l|-u] <device>\n"
const char help[] = "usage: udev_volume_id [--export|-t|-l|-u] <device>\n"
" --export\n"
" -t filesystem type\n"
" -l filesystem label\n"
" -u filesystem uuid\n"
"\n";
static const char short_options[] = "htlu";
enum print_type {
PRINT_EXPORT,
PRINT_TYPE,
PRINT_LABEL,
PRINT_UUID,
} print = PRINT_EXPORT;
struct volume_id *vid = NULL;
const char *device;
char print = 'a';
static char name[VOLUME_ID_LABEL_SIZE];
int len, i, j;
int i;
unsigned long long size;
int rc = 1;
const char *node = NULL;
int rc = 0;
logging_init("udev_volume_id");
while (1) {
int option;
for (i = 1 ; i < argc; i++) {
char *arg = argv[i];
option = getopt(argc, argv, short_options);
if (option == -1)
break;
switch (option) {
case 't':
print = 't';
continue;
case 'l':
print = 'l';
continue;
case 'u':
print = 'u';
continue;
case 'h':
case '?':
default:
printf(help);
exit(1);
}
if (strcmp(arg, "--export") == 0) {
print = PRINT_EXPORT;
} else if (strcmp(arg, "-t") == 0) {
print = PRINT_TYPE;
} else if (strcmp(arg, "-l") == 0) {
print = PRINT_LABEL;
} else if (strcmp(arg, "-u") == 0) {
print = PRINT_UUID;
} else
node = arg;
}
if (!node) {
err("no node specified");
fprintf(stderr, help);
rc = 1;
goto exit;
}
device = argv[optind];
if (device == NULL) {
printf(help);
exit(1);
}
vid = volume_id_open_node(device);
vid = volume_id_open_node(node);
if (vid == NULL) {
printf("error open volume\n");
fprintf(stderr, "error open volume\n");
rc = 2;
goto exit;
}
@ -130,69 +153,46 @@ int main(int argc, char *argv[])
if (volume_id_probe_dasd(vid) == 0)
goto print;
printf("unknown volume type\n");
fprintf(stderr, "unknown volume type\n");
rc = 3;
goto exit;
print:
len = strnlen(vid->label, VOLUME_ID_LABEL_SIZE);
/* remove trailing spaces */
while (len > 0 && isspace(vid->label[len-1]))
len--;
name[len] = '\0';
/* substitute chars */
i = 0;
j = 0;
while (j < len) {
switch(vid->label[j]) {
case '/' :
break;
case ' ' :
name[i++] = '_';
break;
default :
name[i++] = vid->label[j];
}
j++;
}
name[i] = '\0';
set_str(name, vid->label, sizeof(vid->label));
switch (print) {
case 't':
case PRINT_EXPORT:
printf("ID_FS_USAGE=%s\n", vid->usage);
printf("ID_FS_TYPE=%s\n", vid->type);
printf("ID_FS_VERSION=%s\n", vid->type_version);
printf("ID_FS_UUID=%s\n", vid->uuid);
printf("ID_FS_LABEL=%s\n", vid->label);
printf("ID_FS_LABEL_SAFE=%s\n", name);
break;
case PRINT_TYPE:
printf("%s\n", vid->type);
break;
case 'l':
case PRINT_LABEL:
if (name[0] == '\0' ||
(vid->usage_id != VOLUME_ID_FILESYSTEM && vid->usage_id != VOLUME_ID_DISKLABEL)) {
rc = 2;
rc = 3;
goto exit;
}
printf("%s\n", name);
break;
case 'u':
case PRINT_UUID:
if (vid->uuid[0] == '\0' || vid->usage_id != VOLUME_ID_FILESYSTEM) {
rc = 2;
rc = 4;
goto exit;
}
printf("%s\n", vid->uuid);
break;
case 'a':
printf("F:%s\n", vid->usage);
printf("T:%s\n", vid->type);
printf("V:%s\n", vid->type_version);
printf("L:%s\n", vid->label);
printf("N:%s\n", name);
printf("U:%s\n", vid->uuid);
}
rc = 0;
exit:
if (vid != NULL)
volume_id_close(vid);
logging_close();
exit(rc);
return rc;
}