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:
parent
670e470543
commit
208f6aba21
@ -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];
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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>
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user