/*
- * udev_volume_id - udev callout to read filesystem label and uuid
+ * vol_id - udev callout to read filesystem label and uuid
*
* Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
*
- * sample udev rule for creation of a symlink with the filsystem uuid:
- * KERNEL="sd*", PROGRAM="/sbin/udev_volume_id -u %N", SYMLINK="%c"
- *
* 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.
#include "../../udev_utils.h"
#include "../../logging.h"
-#include "volume_id/volume_id.h"
-#include "volume_id/dasd.h"
+#include "libvolume_id/volume_id.h"
#define BLKGETSIZE64 _IOR(0x12,114,size_t)
}
#endif
-static void set_str(char *to, const unsigned char *from, int count)
+static void set_str(char *to, const char *from, size_t count)
{
- int i, j;
- int len;
+ size_t i, j, len;
+ /* strip trailing whitespace */
len = strnlen(from, count);
- while (isspace(from[len-1]))
+ while (len && isspace(from[len-1]))
len--;
+ /* strip leading whitespace */
i = 0;
while (isspace(from[i]) && (i < len))
i++;
j = 0;
while (i < len) {
- switch(from[i]) {
- case '/':
- break;
- case ' ':
+ /* substitute multiple whitespace */
+ if (isspace(from[i])) {
+ while (isspace(from[i]))
+ i++;
to[j++] = '_';
- break;
- default:
- to[j++] = from[i];
}
- i++;
+ /* skip chars */
+ if (from[i] == '/') {
+ i++;
+ continue;
+ }
+ to[j++] = from[i++];
}
to[j] = '\0';
}
int main(int argc, char *argv[])
{
- const char help[] = "usage: udev_volume_id [--export|-t|-l|-u] <device>\n"
+ const char help[] = "usage: vol_id [--export|-t|-l|-u] <device>\n"
" --export\n"
" -t filesystem type\n"
" -l filesystem label\n"
struct volume_id *vid = NULL;
static char name[VOLUME_ID_LABEL_SIZE];
int i;
- unsigned long long size;
+ uint64_t size;
const char *node = NULL;
int rc = 0;
- logging_init("udev_volume_id");
+ logging_init("vol_id");
for (i = 1 ; i < argc; i++) {
char *arg = argv[i];
vid = volume_id_open_node(node);
if (vid == NULL) {
- fprintf(stderr, "error open volume\n");
+ fprintf(stderr, "%s: error open volume\n", node);
rc = 2;
goto exit;
}
if (ioctl(vid->fd, BLKGETSIZE64, &size) != 0)
size = 0;
+ dbg("BLKGETSIZE64=%llu", size);
if (volume_id_probe_all(vid, 0, size) == 0)
goto print;
- if (volume_id_probe_dasd(vid) == 0)
- goto print;
-
- fprintf(stderr, "unknown volume type\n");
+ if (print != PRINT_EXPORT)
+ fprintf(stderr, "%s: unknown volume type\n", node);
rc = 3;
goto exit;
print:
set_str(name, vid->label, sizeof(vid->label));
+ replace_untrusted_chars(name);
switch (print) {
case PRINT_EXPORT: