1
0
mirror of https://github.com/systemd/systemd.git synced 2024-10-28 11:55:44 +03:00

add ID_TYPE to the id probers

Export the type of device from ata_id and scsi_id, also strip
leading and trailing whitespace and substitute consecutive
whitespace with a single underline char.

From: Hannes Reinecke <hare@suse.de>
Signed-off-by: Kay Sievers <kay.sievers@suse.de>
This commit is contained in:
Kay Sievers 2005-06-27 17:04:56 +02:00
parent 34129109a1
commit aaff09a30a
5 changed files with 108 additions and 19 deletions

View File

@ -67,25 +67,30 @@ static void set_str(char *to, const unsigned char *from, int count)
int i, j;
int len;
/* strip trailing whitespace */
len = strnlen(from, count);
while (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 '/':
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';
}
@ -137,6 +142,28 @@ int main(int argc, char *argv[])
set_str(revision, id.fw_rev, 8);
if (export) {
if ((id.config >> 8) & 0x80) {
/* This is an ATAPI device */
switch ((id.config >> 8) & 0x1f) {
case 0:
printf("ID_TYPE=cd\n");
break;
case 1:
printf("ID_TYPE=tape\n");
break;
case 5:
printf("ID_TYPE=cd\n");
break;
case 7:
printf("ID_TYPE=optical\n");
break;
default:
printf("ID_TYPE=generic\n");
break;
}
} else {
printf("ID_TYPE=disk\n");
}
printf("ID_MODEL=%s\n", model);
printf("ID_SERIAL=%s\n", serial);
printf("ID_REVISION=%s\n", revision);

View File

@ -74,6 +74,8 @@ static int reformat_serial;
static int export;
static char vendor_str[64];
static char model_str[64];
static char revision_str[16];
static char type_str[16];
void log_message (int level, const char *format, ...)
{
@ -103,29 +105,72 @@ static void set_str(char *to, const unsigned char *from, int count)
int i, j;
int len;
/* strip trailing whitespace */
len = strnlen(from, count);
while (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 '/':
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';
}
static void set_type(char *to, const char *from, int count)
{
int type_num;
char *eptr;
type_num = strtoul(from, &eptr, 0);
if (eptr != from) {
switch (type_num) {
case 0:
sprintf(to, "disk");
break;
case 1:
sprintf(to, "tape");
break;
case 4:
sprintf(to, "optical");
break;
case 5:
sprintf(to, "cd");
break;
case 7:
sprintf(to, "optical");
break;
case 0xe:
sprintf(to, "disk");
break;
case 0xf:
sprintf(to, "optical");
break;
default:
sprintf(to, "generic");
break;
}
} else {
sprintf(to, "generic");
}
}
static int get_major_minor(struct sysfs_class_device *class_dev, int *maj,
int *min)
{
@ -521,7 +566,7 @@ static int per_dev_options(struct sysfs_device *scsi_dev, int *good_bad,
int retval;
int newargc;
char **newargv = NULL;
struct sysfs_attribute *vendor, *model;
struct sysfs_attribute *vendor, *model, *type;
int option;
*good_bad = all_good;
@ -547,6 +592,22 @@ static int per_dev_options(struct sysfs_device *scsi_dev, int *good_bad,
}
set_str(model_str, model->value, sizeof(model_str)-1);
type = sysfs_get_device_attr(scsi_dev, "type");
if (!type) {
log_message(LOG_WARNING, "%s: cannot get type attribute\n",
scsi_dev->name);
return -1;
}
set_type(type_str, type->value, sizeof(type_str)-1);
type = sysfs_get_device_attr(scsi_dev, "rev");
if (!type) {
log_message(LOG_WARNING, "%s: cannot get type attribute\n",
scsi_dev->name);
return -1;
}
set_str(revision_str, type->value, sizeof(revision_str)-1);
retval = get_file_options(vendor->value, model->value, &newargc,
&newargv);
@ -616,7 +677,6 @@ static void format_serial(char *serial)
*p = '_';
p++;
}
return;
}
/*
@ -759,8 +819,10 @@ static int scsi_id(const char *target_path, char *maj_min_dev)
static char serial_str[64];
printf("ID_VENDOR=%s\n", vendor_str);
printf("ID_MODEL=%s\n", model_str);
printf("ID_REVISION=%s\n", revision_str);
set_str(serial_str, serial, sizeof(serial_str));
printf("ID_SERIAL=%s\n", serial_str);
printf("ID_TYPE=%s\n", type_str);
} else {
if (reformat_serial)
format_serial(serial);

View File

@ -793,7 +793,7 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule,
len = strlen(value);
while (len > 0 && isspace(value[len-1]))
value[--len] = '\0';
dbg("removed %i trailing whitespace chars from '%s'", strlen(value)-len, value);
dbg("removed %zi trailing whitespace chars from '%s'", strlen(value)-len, value);
}
dbg("compare attribute '%s' value '%s' with '%s'", pair->name, value, pair->value);

View File

@ -485,7 +485,7 @@ int execute_program(const char *command, const char *subsystem,
len += count;
if (len >= ressize-1) {
err("ressize %d too short", ressize);
err("ressize %ld too short", (long)ressize);
retval = -1;
break;
}

View File

@ -600,7 +600,7 @@ static struct uevent_msg *get_netlink_msg(void)
if ((size_t)size > sizeof(buffer)-1)
size = sizeof(buffer)-1;
buffer[size] = '\0';
dbg("uevent_size=%i", size);
dbg("uevent_size=%li", (long)size);
/* start of event payload */
bufpos = strlen(buffer)+1;