From b4a2906bf1921cd6cbc25621a6db0bae906616c8 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Fri, 8 Jul 2005 03:29:19 +0200 Subject: [PATCH 01/12] fix usb_id and let scsi_id ignore "illegal request" --- extras/scsi_id/scsi_id.c | 8 ++- extras/scsi_id/scsi_serial.c | 6 +++ extras/usb_id/usb_id.c | 94 ++++++++++++++++++++++-------------- 3 files changed, 70 insertions(+), 38 deletions(-) diff --git a/extras/scsi_id/scsi_id.c b/extras/scsi_id/scsi_id.c index 4003ee6af5..cbefb445df 100644 --- a/extras/scsi_id/scsi_id.c +++ b/extras/scsi_id/scsi_id.c @@ -52,7 +52,7 @@ * options are not supported, but other code is still left in place for * now. */ -static const char short_options[] = "bd:f:gip:s:uvVx"; +static const char short_options[] = "abd:f:gip:s:uvVx"; /* * Just duplicate per dev options. */ @@ -61,6 +61,7 @@ static const char dev_short_options[] = "bgp:"; char sysfs_mnt_path[SYSFS_PATH_MAX]; static int all_good; +static int always_info; static char *default_callout; static int dev_specified; static int sys_specified; @@ -485,6 +486,9 @@ static int set_options(int argc, char **argv, const char *short_opts, dprintf("option '%c'\n", option); switch (option) { + case 'a': + always_info = 1; + break; case 'b': all_good = 0; break; @@ -810,7 +814,7 @@ static int scsi_id(const char *target_path, char *maj_min_dev) retval = 1; } else if (scsi_get_serial(scsi_dev, maj_min_dev, page_code, serial, MAX_SERIAL_LEN)) { - retval = 1; + retval = always_info?0:1; } else { retval = 0; } diff --git a/extras/scsi_id/scsi_serial.c b/extras/scsi_id/scsi_serial.c index 20a7928553..7bfa9d1812 100644 --- a/extras/scsi_id/scsi_serial.c +++ b/extras/scsi_id/scsi_serial.c @@ -89,6 +89,7 @@ static const char hex_str[]="0123456789abcdef"; #define SG_ERR_CAT_RESET 2 /* interpreted from sense buffer */ #define SG_ERR_CAT_TIMEOUT 3 #define SG_ERR_CAT_RECOVERED 4 /* Successful command after recovered err */ +#define SG_ERR_CAT_NOTSUPPORTED 5 /* Illegal / unsupported command */ #define SG_ERR_CAT_SENSE 98 /* Something else in the sense buffer */ #define SG_ERR_CAT_OTHER 99 /* Some other error/warning */ @@ -130,6 +131,8 @@ static int sg_err_category_new(int scsi_status, int msg_status, int return SG_ERR_CAT_MEDIA_CHANGED; if (0x29 == asc) return SG_ERR_CAT_RESET; + } else if (sense_key == ILLEGAL_REQUEST) { + return SG_ERR_CAT_NOTSUPPORTED; } } return SG_ERR_CAT_SENSE; @@ -331,6 +334,9 @@ resend: retval = sg_err_category3(&io_hdr); switch (retval) { + case SG_ERR_CAT_NOTSUPPORTED: + buf[1] = 0; + /* Fallthrough */ case SG_ERR_CAT_CLEAN: case SG_ERR_CAT_RECOVERED: retval = 0; diff --git a/extras/usb_id/usb_id.c b/extras/usb_id/usb_id.c index bca80f8de1..f4011ee899 100644 --- a/extras/usb_id/usb_id.c +++ b/extras/usb_id/usb_id.c @@ -72,7 +72,9 @@ static char revision_str[16]; static char type_str[16]; static int use_usb_info; +static int use_num_info; static int export; +static int debug; static void set_str(char *to, const unsigned char *from, int count) { @@ -259,7 +261,7 @@ static int usb_id(const char *target_path) struct sysfs_device *target_dev; struct sysfs_device *host_dev, *interface_dev, *usb_dev; struct sysfs_attribute *scsi_model, *scsi_vendor, *scsi_type, *scsi_rev; - struct sysfs_attribute *usb_model, *usb_vendor, *usb_rev, *usb_serial; + struct sysfs_attribute *usb_model = NULL, *usb_vendor = NULL, *usb_rev, *usb_serial; struct sysfs_attribute *if_class, *if_subclass; int if_class_num; int protocol = 0; @@ -322,11 +324,12 @@ static int usb_id(const char *target_path) if_class = sysfs_get_device_attr(interface_dev, "bInterfaceClass"); if (!if_class) { info("%s: cannot get bInterfaceClass attribute", interface_dev->name); - return -1; + return 1; } if_class_num = strtoul(if_class->value, NULL, 16); if (if_class_num != 8) { set_usb_iftype(type_str, if_class->value, sizeof(type_str) - 1); + protocol = 0; } else { if_subclass = sysfs_get_device_attr(interface_dev, "bInterfaceSubClass"); @@ -338,29 +341,29 @@ static int usb_id(const char *target_path) /* Generic SPC-2 device */ scsi_vendor = sysfs_get_device_attr(scsi_dev, "vendor"); if (!scsi_vendor) { - info("%s: cannot get vendor attribute", scsi_dev->name); - return -1; + info("%s: cannot get SCSI vendor attribute", scsi_dev->name); + return 1; } set_str(vendor_str, scsi_vendor->value, sizeof(vendor_str)-1); scsi_model = sysfs_get_device_attr(scsi_dev, "model"); if (!scsi_model) { - info("%s: cannot get model attribute", scsi_dev->name); - return -1; + info("%s: cannot get SCSI model attribute", scsi_dev->name); + return 1; } set_str(model_str, scsi_model->value, sizeof(model_str)-1); scsi_type = sysfs_get_device_attr(scsi_dev, "type"); if (!scsi_type) { - info("%s: cannot get type attribute", scsi_dev->name); - return -1; + info("%s: cannot get SCSI type attribute", scsi_dev->name); + return 1; } set_scsi_type(type_str, scsi_type->value, sizeof(type_str)-1); scsi_rev = sysfs_get_device_attr(scsi_dev, "rev"); if (!scsi_rev) { - info("%s: cannot get type attribute", scsi_dev->name); - return -1; + info("%s: cannot get SCSI revision attribute", scsi_dev->name); + return 1; } set_str(revision_str, scsi_rev->value, sizeof(revision_str)-1); @@ -368,19 +371,29 @@ static int usb_id(const char *target_path) /* Fallback to USB vendor & device */ if (vendor_str[0] == '\0') { - usb_vendor = sysfs_get_device_attr(usb_dev, "manufacturer"); + if (!use_num_info) + if (!(usb_vendor = sysfs_get_device_attr(usb_dev, "manufacturer"))) + dbg("No USB vendor string found, using idVendor"); + if (!usb_vendor) { - dbg("No USB vendor string found, using idVendor"); - usb_vendor = sysfs_get_device_attr(usb_dev, "idVendor"); + if (!(usb_vendor = sysfs_get_device_attr(usb_dev, "idVendor"))) { + dbg("No USB vendor information available\n"); + sprintf(vendor_str,"0000"); + } } set_str(vendor_str,usb_vendor->value, sizeof(vendor_str) - 1); } if (model_str[0] == '\0') { - usb_model = sysfs_get_device_attr(usb_dev, "product"); + if (!use_num_info) + if (!(usb_model = sysfs_get_device_attr(usb_dev, "product"))) + dbg("No USB model string found, using idProduct"); + if (!usb_model) { - dbg("No USB model string found, using idProduct"); - usb_model = sysfs_get_device_attr(usb_dev, "idProduct"); + if (!(usb_model = sysfs_get_device_attr(usb_dev, "idProduct"))) { + dbg("No USB model information available\n"); + sprintf(model_str,"0000"); + } } set_str(model_str, usb_model->value, sizeof(model_str) - 1); } @@ -417,13 +430,20 @@ int main(int argc, char **argv) exit(1); } - while ((option = getopt(argc, argv, "ux")) != -1 ) { + while ((option = getopt(argc, argv, "dnux")) != -1 ) { if (optarg) dbg("option '%c' arg '%s'", option, optarg); else dbg("option '%c'", option); switch (option) { + case 'd': + debug = 1; + break; + case 'n': + use_num_info=1; + use_usb_info=1; + break; case 'u': use_usb_info=1; break; @@ -432,7 +452,7 @@ int main(int argc, char **argv) break; default: info("Unknown or bad option '%c' (0x%x)", option, option); - retval = -1; + retval = 1; break; } } @@ -452,25 +472,27 @@ int main(int argc, char **argv) retval = usb_id(target_path); - if (export) { - printf("ID_VENDOR=%s\n", vendor_str); - printf("ID_MODEL=%s\n", model_str); - printf("ID_REVISION=%s\n", revision_str); - if (serial_str[0] == '\0') { - printf("ID_SERIAL=%s_%s\n", - vendor_str, model_str); + if (retval == 0) { + if (export) { + printf("ID_VENDOR=%s\n", vendor_str); + printf("ID_MODEL=%s\n", model_str); + printf("ID_REVISION=%s\n", revision_str); + if (serial_str[0] == '\0') { + printf("ID_SERIAL=%s_%s\n", + vendor_str, model_str); + } else { + printf("ID_SERIAL=%s_%s_%s\n", + vendor_str, model_str, serial_str); + } + printf("ID_TYPE=%s\n", type_str); } else { - printf("ID_SERIAL=%s_%s_%s\n", - vendor_str, model_str, serial_str); - } - printf("ID_TYPE=%s\n", type_str); - } else { - if (serial_str[0] == '\0') { - printf("%s_%s\n", - vendor_str, model_str); - } else { - printf("%s_%s_%s\n", - vendor_str, model_str, serial_str); + if (serial_str[0] == '\0') { + printf("%s_%s\n", + vendor_str, model_str); + } else { + printf("%s_%s_%s\n", + vendor_str, model_str, serial_str); + } } } exit(retval); From 4431072fb8a95005976cd3316fb978ef6fb588ca Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Tue, 12 Jul 2005 11:39:56 +0200 Subject: [PATCH 02/12] compile dasd only on s390 Signed-off-by: Kay Sievers --- extras/volume_id/volume_id/dasd.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/extras/volume_id/volume_id/dasd.c b/extras/volume_id/volume_id/dasd.c index 6f403cb928..e02b15ce8a 100644 --- a/extras/volume_id/volume_id/dasd.c +++ b/extras/volume_id/volume_id/dasd.c @@ -39,8 +39,8 @@ #include "util.h" #include "dasd.h" -static unsigned char EBCtoASC[256] = -{ +#ifdef __s390__ +static unsigned char EBCtoASC[256] = { /* 0x00 NUL SOH STX ETX *SEL HT *RNL DEL */ 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F, /* 0x08 -GE -SPS -RPT VT FF CR SO SI */ @@ -144,20 +144,7 @@ typedef struct dasd_information_t { char configuration_data[256]; /* from read_configuration_data */ } dasd_information_t; -#define _IOC_NRBITS 8 -#define _IOC_TYPEBITS 8 -#define _IOC_SIZEBITS 14 -#define _IOC_DIRBITS 2 -#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) -#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) -#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) -#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) -#define _IOC_NRSHIFT 0 -#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) -#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) -#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) #define DASD_IOCTL_LETTER 'D' - #define BIODASDINFO _IOR(DASD_IOCTL_LETTER,1,dasd_information_t) #define BLKSSZGET _IO(0x12,104) @@ -170,7 +157,6 @@ int volume_id_probe_dasd(struct volume_id *id) unsigned char name[7]; dbg("probing"); - if (ioctl(id->fd, BIODASDINFO, &info) != 0) return -1; @@ -195,3 +181,11 @@ int volume_id_probe_dasd(struct volume_id *id) return 0; } + +#else +int volume_id_probe_dasd(struct volume_id *id) +{ + return -1; +} +#endif /* __s390__ */ + From e03bce632196dea1f6b18885225b46daaba7fa30 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Tue, 12 Jul 2005 11:41:09 +0200 Subject: [PATCH 03/12] ata_id: check for empty serial number Signed-off-by: Kay Sievers --- extras/ata_id/ata_id.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/extras/ata_id/ata_id.c b/extras/ata_id/ata_id.c index 34b1ccdff1..54c3c29feb 100644 --- a/extras/ata_id/ata_id.c +++ b/extras/ata_id/ata_id.c @@ -167,8 +167,12 @@ int main(int argc, char *argv[]) printf("ID_MODEL=%s\n", model); printf("ID_SERIAL=%s\n", serial); printf("ID_REVISION=%s\n", revision); - } else - printf("%s_%s\n", model, serial); + } else { + if (serial[0] != '\0') + printf("%s_%s\n", model, serial); + else + printf("%s\n", model); + } close: close(fd); From ef520ba25f540a3c552e941351f772fbba7be5d9 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Tue, 12 Jul 2005 11:42:39 +0200 Subject: [PATCH 04/12] remember mapped rules state Signed-off-by: Kay Sievers --- udev_rules.c | 2 +- udev_rules_parse.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/udev_rules.c b/udev_rules.c index a25c2e90a8..77b97d7f99 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -606,8 +606,8 @@ found: pos = getenv(attr); if (pos == NULL) break; - strlcat(string, pos, maxsize); dbg("substitute env '%s=%s'", attr, pos); + strlcat(string, pos, maxsize); break; default: err("unknown substitution type=%i", type); diff --git a/udev_rules_parse.c b/udev_rules_parse.c index a2f2f1804b..9483bcd71f 100644 --- a/udev_rules_parse.c +++ b/udev_rules_parse.c @@ -548,6 +548,7 @@ static int rules_map(struct udev_rules *rules, const char *filename) rules->buf = NULL; return -1; } + rules->mapped = 1; return 0; } From cbbde2ba6c19d6515f09a2ed0955eb2808c91198 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Tue, 12 Jul 2005 11:44:51 +0200 Subject: [PATCH 05/12] udevd: set incoming socket buffer SO_RCVBUF to maximum Signed-off-by: Kay Sievers --- udevd.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/udevd.c b/udevd.c index 8782c615e3..110d8e7c4d 100644 --- a/udevd.c +++ b/udevd.c @@ -167,7 +167,7 @@ static void msg_queue_insert(struct uevent_msg *msg) } /* forks event and removes event from run queue when finished */ -static void execute_udev(struct uevent_msg *msg) +static void udev_event_fork(struct uevent_msg *msg) { char *const argv[] = { "udev", msg->subsystem, NULL }; pid_t pid; @@ -181,12 +181,10 @@ static void execute_udev(struct uevent_msg *msg) close(uevent_netlink_sock); close(udevd_sock); logging_close(); - setpriority(PRIO_PROCESS, 0, UDEV_PRIORITY); execve(udev_bin, argv, msg->envp); err("exec of child failed"); _exit(1); - break; case -1: err("fork of child failed"); msg_queue_delete(msg); @@ -389,7 +387,7 @@ static void exec_queue_manager(void) if (running_with_devpath(loop_msg, max_childs) == 0) { /* move event to run list */ list_move_tail(&loop_msg->node, &running_list); - execute_udev(loop_msg); + udev_event_fork(loop_msg); running++; dbg("moved seq %llu to running list", loop_msg->seqnum); } else @@ -722,6 +720,7 @@ static void user_sighandler(void) static int init_udevd_socket(void) { struct sockaddr_un saddr; + const int buffersize = 1024 * 1024; socklen_t addrlen; const int feature_on = 1; int retval; @@ -738,6 +737,9 @@ static int init_udevd_socket(void) return -1; } + /* set receive buffersize */ + setsockopt(udevd_sock, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize)); + /* the bind takes care of ensuring only one copy running */ retval = bind(udevd_sock, (struct sockaddr *) &saddr, addrlen); if (retval < 0) { @@ -755,6 +757,7 @@ static int init_udevd_socket(void) static int init_uevent_netlink_sock(void) { struct sockaddr_nl snl; + const int buffersize = 1024 * 1024; int retval; memset(&snl, 0x00, sizeof(struct sockaddr_nl)); @@ -768,6 +771,9 @@ static int init_uevent_netlink_sock(void) return -1; } + /* set receive buffersize */ + setsockopt(uevent_netlink_sock, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize)); + retval = bind(uevent_netlink_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl)); if (retval < 0) { From 0cd4ac473a51577e33e700beccb3479e5565d661 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Tue, 12 Jul 2005 12:52:56 +0200 Subject: [PATCH 06/12] allow multiple values to be matched with KEY=="value1|value2" Signed-off-by: Kay Sievers --- test/udev-test.pl | 21 +++++++++++++++++++++ udev_rules.c | 43 +++++++++++++++++++++++++++---------------- 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/test/udev-test.pl b/test/udev-test.pl index 873780d70a..e8cb7c48a9 100755 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -1450,6 +1450,27 @@ EOF KERNEL=="ttyUSB[0-9]*", NAME="right" KERNEL=="ttyUSB[0-9]*", NAME="" KERNEL=="ttyUSB[0-9]*", NAME="wrong" +EOF + }, + { + desc => "test multi matches", + subsys => "tty", + devpath => "/class/tty/ttyUSB0", + exp_name => "right", + rules => < "test multi matches 2", + subsys => "tty", + devpath => "/class/tty/ttyUSB0", + exp_name => "right", + rules => <operation == KEY_OP_UNSET) return 0; - key_value = rule->buf + key->val_off; + strlcpy(value, rule->buf + key->val_off, sizeof(value)); + key_value = value; - dbg("check for %s '%s' <-> '%s'", key_name, key_value, val); - match = (strcmp_pattern(key_value, val) == 0); - if (match && (key->operation != KEY_OP_NOMATCH)) { - dbg("%s is matching (matching value)", key_name); - return 0; + dbg("key %s value='%s'", key_name, key_value); + while (key_value) { + pos = strchr(key_value, '|'); + if (pos) { + pos[0] = '\0'; + pos++; + } + dbg("match %s '%s' <-> '%s'", key_name, key_value, val); + match = (strcmp_pattern(key_value, val) == 0); + if (match && (key->operation != KEY_OP_NOMATCH)) { + dbg("%s is true (matching value)", key_name); + return 0; + } + if (!match && (key->operation == KEY_OP_NOMATCH)) { + dbg("%s is true (non-matching value)", key_name); + return 0; + } + key_value = pos; } - if (!match && (key->operation == KEY_OP_NOMATCH)) { - dbg("%s is matching, (non matching value)", key_name); - return 0; - } - - dbg("%s is not matching", key_name); + dbg("%s is false", key_name); return -1; } @@ -709,14 +720,14 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule, match = (wait_for_sysfs(udev, key_val(rule, &rule->wait_for_sysfs), 3) == 0); if (match && (rule->wait_for_sysfs.operation != KEY_OP_NOMATCH)) { - dbg("WAIT_FOR_SYSFS is matching (matching value)"); + dbg("WAIT_FOR_SYSFS is true (matching value)"); return 0; } if (!match && (rule->wait_for_sysfs.operation == KEY_OP_NOMATCH)) { - dbg("WAIT_FOR_SYSFS is matching, (non matching value)"); + dbg("WAIT_FOR_SYSFS is true, (non matching value)"); return 0; } - dbg("WAIT_FOR_SYSFS is not matching"); + dbg("WAIT_FOR_SYSFS is false"); return -1; } @@ -826,7 +837,7 @@ try_parent: apply_format(udev, program, sizeof(program), class_dev, sysfs_device); dbg("check for PROGRAM program='%s", program); if (execute_program(program, udev->subsystem, result, sizeof(result), NULL) != 0) { - dbg("PROGRAM is not matching"); + dbg("PROGRAM is false"); if (rule->program.operation != KEY_OP_NOMATCH) goto exit; } else { From 0bfb84e1edd96b1e82ffd74c43b865e5d6dbf204 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Tue, 12 Jul 2005 14:46:36 +0200 Subject: [PATCH 07/12] IMPORT: add {parent} to import the persistent data of the parent device Signed-off-by: Kay Sievers --- test/udev-test.pl | 21 +++++++++++++++++++ udev_rules.c | 51 +++++++++++++++++++++++++++++++++++++++++++--- udev_rules.h | 11 ++++++++-- udev_rules_parse.c | 13 +++++++++--- 4 files changed, 88 insertions(+), 8 deletions(-) diff --git a/test/udev-test.pl b/test/udev-test.pl index e8cb7c48a9..1bb60bb76e 100755 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -1471,6 +1471,27 @@ EOF KERNEL=="dontknow*|*nothing", NAME="nomatch" KERNEL=="dontknow*|ttyUSB*|nothing*", NAME="right" KERNEL=="ttyUSB*", NAME="wrong" +EOF + }, + { + desc => "IMPORT parent test sequence 1/2 (keep)", + subsys => "block", + devpath => "/block/sda", + exp_name => "parent", + option => "keep", + rules => < "IMPORT parent test sequence 2/2 (keep)", + subsys => "block", + devpath => "/block/sda/sda1", + exp_name => "parentenv-parent_right", + option => "clean", + rules => <path); + udev_init_device(&udev_parent, NULL, NULL, NULL); + /* import the udev_db of the parent */ + if (udev_db_get_device(&udev_parent, &parent->path[strlen(sysfs_path)]) == 0) { + dbg("import stored parent env '%s'", udev_parent.name); + list_for_each_entry(name_loop, &udev_parent.env_list, node) { + char name[NAME_SIZE]; + char *pos; + + strlcpy(name, name_loop->name, sizeof(name)); + pos = strchr(name, '='); + if (pos) { + pos[0] = '\0'; + pos++; + if (strcmp_pattern(filter, name) == 0) { + dbg("import key '%s'", name_loop->name); + name_list_add(&udev->env_list, name_loop->name, 0); + setenv(name, pos, 1); + } else + dbg("skip key '%s'", name_loop->name); + } + } + rc = 0; + } else + dbg("parent not found in database"); + udev_cleanup_device(&udev_parent); + } + + return rc; +} + /* finds the lowest positive N such that N isn't present in the udevdb * if doesn't exist, 0 is returned, N otherwise */ @@ -604,8 +644,10 @@ found: break; } pos = getenv(attr); - if (pos == NULL) + if (pos == NULL) { + dbg("env '%s' not avialable", attr); break; + } dbg("substitute env '%s=%s'", attr, pos); strlcat(string, pos, maxsize); break; @@ -812,12 +854,15 @@ try_parent: strlcpy(import, key_val(rule, &rule->import), sizeof(import)); apply_format(udev, import, sizeof(import), class_dev, sysfs_device); dbg("check for IMPORT import='%s'", import); - if (rule->import_exec) { + if (rule->import_type == IMPORT_PROGRAM) { dbg("run executable file import='%s'", import); rc = import_program_into_env(udev, import); - } else { + } else if (rule->import_type == IMPORT_FILE) { dbg("import file import='%s'", import); rc = import_file_into_env(udev, import); + } else if (rule->import_type == IMPORT_PARENT && class_dev) { + dbg("import parent import='%s'", import); + rc = import_parent_into_env(udev, class_dev, import); } if (rc) { dbg("IMPORT failed"); diff --git a/udev_rules.h b/udev_rules.h index 959524a802..3f37d4b0b4 100644 --- a/udev_rules.h +++ b/udev_rules.h @@ -54,6 +54,13 @@ struct key_pairs { struct key_pair keys[PAIRS_MAX]; }; +enum import_type { + IMPORT_UNSET, + IMPORT_PROGRAM, + IMPORT_FILE, + IMPORT_PARENT, +}; + struct udev_rule { struct key kernel_name; struct key subsystem; @@ -66,6 +73,7 @@ struct udev_rule { struct key result; struct key modalias; struct key import; + enum import_type import_type; struct key wait_for_sysfs; struct key_pairs sysfs; struct key_pairs env; @@ -81,8 +89,7 @@ struct udev_rule { unsigned int partitions; unsigned int last_rule:1, ignore_device:1, - ignore_remove:1, - import_exec:1; + ignore_remove:1; size_t bufsize; char buf[]; diff --git a/udev_rules_parse.c b/udev_rules_parse.c index 9483bcd71f..7c3c2e7fc2 100644 --- a/udev_rules_parse.c +++ b/udev_rules_parse.c @@ -311,9 +311,13 @@ static int add_to_rules(struct udev_rules *rules, char *line) attr = get_key_attribute(key + sizeof("IMPORT")-1); if (attr && strstr(attr, "program")) { dbg("IMPORT will be executed"); - rule->import_exec = 1; + rule->import_type = IMPORT_PROGRAM; } else if (attr && strstr(attr, "file")) { dbg("IMPORT will be included as file"); + rule->import_type = IMPORT_FILE; + } else if (attr && strstr(attr, "parent")) { + dbg("IMPORT will include the parent values"); + rule->import_type = IMPORT_PARENT; } else { /* figure it out if it is executable */ char file[PATH_SIZE]; @@ -326,8 +330,11 @@ static int add_to_rules(struct udev_rules *rules, char *line) pos[0] = '\0'; dbg("IMPORT auto mode for '%s'", file); if (!lstat(file, &stats) && (stats.st_mode & S_IXUSR)) { - dbg("IMPORT is executable, will be executed"); - rule->import_exec = 1; + dbg("IMPORT is executable, will be executed (autotype)"); + rule->import_type = IMPORT_PROGRAM; + } else { + dbg("IMPORT is not executable, will be included as file (autotype)"); + rule->import_type = IMPORT_FILE; } } add_rule_key(rule, &rule->import, operation, value); From 5f84d7264d752c9eff91e80070fa199286c25b12 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Wed, 13 Jul 2005 11:23:21 +0200 Subject: [PATCH 08/12] trivial fixes for *_id programs Signed-off-by: Kay Sievers --- extras/ata_id/ata_id.c | 2 ++ extras/volume_id/vol_id.c | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/extras/ata_id/ata_id.c b/extras/ata_id/ata_id.c index 54c3c29feb..9df0fdb107 100644 --- a/extras/ata_id/ata_id.c +++ b/extras/ata_id/ata_id.c @@ -107,6 +107,8 @@ int main(int argc, char *argv[]) int fd; int rc = 0; + logging_init("ata_id"); + for (i = 1 ; i < argc; i++) { char *arg = argv[i]; diff --git a/extras/volume_id/vol_id.c b/extras/volume_id/vol_id.c index 451fd355c1..1b180a7734 100644 --- a/extras/volume_id/vol_id.c +++ b/extras/volume_id/vol_id.c @@ -136,7 +136,7 @@ int main(int argc, char *argv[]) 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; } @@ -149,8 +149,9 @@ int main(int argc, char *argv[]) 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; From 15e5209b8e93eacfcc3440d383d5b05b5e054934 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 13 Jul 2005 11:35:51 +0200 Subject: [PATCH 09/12] dasd_id: add s390 disk-label prober Signed-off-by: Hannes Reinecke --- extras/dasd_id/Makefile | 52 +++++++ extras/dasd_id/dasd_id.c | 273 +++++++++++++++++++++++++++++++++++++ test/simple-build-check.sh | 1 + 3 files changed, 326 insertions(+) create mode 100644 extras/dasd_id/Makefile create mode 100644 extras/dasd_id/dasd_id.c diff --git a/extras/dasd_id/Makefile b/extras/dasd_id/Makefile new file mode 100644 index 0000000000..33bb6965cd --- /dev/null +++ b/extras/dasd_id/Makefile @@ -0,0 +1,52 @@ +# Makefile for dasd_id +# +# Copyright (C) 2004 Kay Sievers +# +# 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 = dasd_id + +all: $(PROG) + +prefix = +exec_prefix = ${prefix} +etcdir = ${prefix}/etc +sbindir = ${exec_prefix}/sbin +usrbindir = ${exec_prefix}/usr/bin +usrsbindir = ${exec_prefix}/usr/sbin +mandir = ${prefix}/usr/share/man +devddir = ${etcdir}/dev.d/default +configdir = ${etcdir}/udev/ +initdir = ${etcdir}/init.d/ +srcdir = . + +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_SCRIPT = ${INSTALL_PROGRAM} + +CFLAGS+=-D_FILE_OFFSET_BITS=64 + +OBJS = dasd_id.o ../../udev.a + +$(OBJS): $(HEADERS) + +.c.o: + $(QUIET) $(CC) $(CFLAGS) -c -o $@ $< + +$(PROG): $(OBJS) $(HEADERS) + $(QUIET) $(LD) $(LDFLAGS) -o $(PROG) $(OBJS) $(LIB_OBJS) + +clean: + rm -f $(PROG) $(OBJS) + +spotless: clean + +install: all + $(INSTALL_PROGRAM) $(PROG) $(DESTDIR)$(sbindir)/$(PROG) + +uninstall: + - rm $(DESTDIR)$(sbindir)/$(PROG) diff --git a/extras/dasd_id/dasd_id.c b/extras/dasd_id/dasd_id.c new file mode 100644 index 0000000000..5c2143f45d --- /dev/null +++ b/extras/dasd_id/dasd_id.c @@ -0,0 +1,273 @@ +/* + * dasdlabel - read label from s390 block device + * + * Copyright (C) 2004 Arnd Bergmann + * + * 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../logging.h" +#include "../../udev_utils.h" + +#ifdef USE_LOG +void log_message(int priority, const char *format, ...) +{ + va_list args; + static int udev_log = -1; + + if (udev_log == -1) { + const char *value; + + value = getenv("UDEV_LOG"); + if (value) + udev_log = log_priority(value); + else + udev_log = LOG_ERR; + } + + if (priority > udev_log) + return; + + va_start(args, format); + vsyslog(priority, format, args); + va_end(args); +} +#endif + +/* + * Only compile this on S/390. Doesn't make any sense + * for other architectures. + */ + +static unsigned char EBCtoASC[256] = +{ +/* 0x00 NUL SOH STX ETX *SEL HT *RNL DEL */ + 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F, +/* 0x08 -GE -SPS -RPT VT FF CR SO SI */ + 0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, +/* 0x10 DLE DC1 DC2 DC3 -RES -NL BS -POC + -ENP ->LF */ + 0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07, +/* 0x18 CAN EM -UBS -CU1 -IFS -IGS -IRS -ITB + -IUS */ + 0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +/* 0x20 -DS -SOS FS -WUS -BYP LF ETB ESC + -INP */ + 0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B, +/* 0x28 -SA -SFE -SM -CSP -MFA ENQ ACK BEL + -SW */ + 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07, +/* 0x30 ---- ---- SYN -IR -PP -TRN -NBS EOT */ + 0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04, +/* 0x38 -SBS -IT -RFF -CU3 DC4 NAK ---- SUB */ + 0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A, +/* 0x40 SP RSP ä ---- */ + 0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86, +/* 0x48 . < ( + | */ + 0x87, 0xA4, 0x9B, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, +/* 0x50 & ---- */ + 0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07, +/* 0x58 ß ! $ * ) ; */ + 0x8D, 0xE1, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAA, +/* 0x60 - / ---- Ä ---- ---- ---- */ + 0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F, +/* 0x68 ---- , % _ > ? */ + 0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, +/* 0x70 --- ---- ---- ---- ---- ---- ---- */ + 0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +/* 0x78 * ` : # @ ' = " */ + 0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, +/* 0x80 * a b c d e f g */ + 0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, +/* 0x88 h i ---- ---- ---- */ + 0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1, +/* 0x90 ° j k l m n o p */ + 0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, +/* 0x98 q r ---- ---- */ + 0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07, +/* 0xA0 ~ s t u v w x */ + 0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, +/* 0xA8 y z ---- ---- ---- ---- */ + 0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07, +/* 0xB0 ^ ---- § ---- */ + 0x5E, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC, +/* 0xB8 ---- [ ] ---- ---- ---- ---- */ + 0xAB, 0x07, 0x5B, 0x5D, 0x07, 0x07, 0x07, 0x07, +/* 0xC0 { A B C D E F G */ + 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, +/* 0xC8 H I ---- ö ---- */ + 0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07, +/* 0xD0 } J K L M N O P */ + 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, +/* 0xD8 Q R ---- ü */ + 0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98, +/* 0xE0 \ S T U V W X */ + 0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, +/* 0xE8 Y Z ---- Ö ---- ---- ---- */ + 0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07, +/* 0xF0 0 1 2 3 4 5 6 7 */ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, +/* 0xF8 8 9 ---- ---- Ü ---- ---- ---- */ + 0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07 +}; + +static void vtoc_ebcdic_dec (const unsigned char *source, char *target, int l) +{ + int i; + + for (i = 0; i < l; i++) + target[i]=(char)EBCtoASC[(unsigned char)(source[i])]; +} + +/* + * struct dasd_information_t + * represents any data about the data, which is visible to userspace + */ +typedef struct dasd_information_t { + unsigned int devno; /* S/390 devno */ + unsigned int real_devno; /* for aliases */ + unsigned int schid; /* S/390 subchannel identifier */ + unsigned int cu_type : 16; /* from SenseID */ + unsigned int cu_model : 8; /* from SenseID */ + unsigned int dev_type : 16; /* from SenseID */ + unsigned int dev_model : 8; /* from SenseID */ + unsigned int open_count; + unsigned int req_queue_len; + unsigned int chanq_len; /* length of chanq */ + char type[4]; /* from discipline.name, 'none' for unknown */ + unsigned int status; /* current device level */ + unsigned int label_block; /* where to find the VOLSER */ + unsigned int FBA_layout; /* fixed block size (like AIXVOL) */ + unsigned int characteristics_size; + unsigned int confdata_size; + char characteristics[64]; /* from read_device_characteristics */ + char configuration_data[256]; /* from read_configuration_data */ +} dasd_information_t; + +#define DASD_IOCTL_LETTER 'D' +#define BIODASDINFO _IOR(DASD_IOCTL_LETTER,1,dasd_information_t) +#define BLKSSZGET _IO(0x12,104) + +unsigned char serial[8]; + +static int dasd_id(int fd) +{ + int blocksize; + dasd_information_t info; + __u8 *data; + __u8 *label_raw; + + if (ioctl(fd, BIODASDINFO, &info) != 0) { + dbg("not a dasd"); + return -1; + } + + if (ioctl(fd, BLKSSZGET, &blocksize) != 0) { + err("failed to get blocksize"); + return -1; + } + + if (lseek(fd,info.label_block * blocksize, SEEK_SET) == -1) { + err("seek failed on dasd"); + return -1; + } + + data = malloc(blocksize); + if (data == NULL) + return -1; + + if (read(fd, data, blocksize) == -1) { + err("read disklabel failed"); + free(data); + return -1; + } + + if ((!info.FBA_layout) && (!strcmp(info.type, "ECKD"))) + label_raw = &data[8]; + else + label_raw = &data[4]; + serial[6] = '\0'; + + vtoc_ebcdic_dec(label_raw, serial, 6); + free(data); + + return 0; + } + +int main(int argc, char *argv[]) +{ + const char *node = NULL; + int i; + int export = 0; + int fd; + int rc = 0; + + logging_init("dasd_id"); + + for (i = 1; i < argc; i++) { + char *arg = argv[i]; + + if (strcmp(arg, "--export") == 0) { + export = 1; + } else + node = arg; + } + if (!node) { + err("no node specified"); + rc = 1; + goto exit; + } + + fd = open(node, O_RDONLY); + if (fd < 0) { + err("unable to open '%s'", node); + rc = 1; + goto exit; + } + + if (dasd_id(fd) < 0) { + err("dasd_id failed: %s", strerror(errno)); + rc = 1; + } + + if (export) { + printf("ID_TYPE=disk\n"); + printf("ID_SERIAL=%s\n",serial); + } else + printf("%s\n", serial); + + close(fd); +exit: + logging_close(); + return rc; +} + diff --git a/test/simple-build-check.sh b/test/simple-build-check.sh index c5b429d98d..7e9a940f85 100755 --- a/test/simple-build-check.sh +++ b/test/simple-build-check.sh @@ -6,6 +6,7 @@ EXTRAS="\ extras/ata_id \ extras/volume_id \ extras/usb_id \ + extras/dasd_id \ extras/run_directory" [ -z "$KERNEL_DIR" ] && KERNEL_DIR=/lib/modules/`uname -r`/build From b0f57eb066cd897dab536ee37daab4239d136d4c Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Wed, 13 Jul 2005 12:01:53 +0200 Subject: [PATCH 10/12] volume_id: remove s390 dasd handling, it is dasd_id now Signed-off-by: Kay Sievers --- extras/volume_id/README | 1 - extras/volume_id/vol_id.c | 4 - extras/volume_id/volume_id/Makefile.inc | 2 - extras/volume_id/volume_id/dasd.c | 191 ------------------------ extras/volume_id/volume_id/dasd.h | 26 ---- extras/volume_id/volume_id/volume_id.h | 2 +- 6 files changed, 1 insertion(+), 225 deletions(-) delete mode 100644 extras/volume_id/volume_id/dasd.c delete mode 100644 extras/volume_id/volume_id/dasd.h diff --git a/extras/volume_id/README b/extras/volume_id/README index a7635ff612..974a5016d9 100644 --- a/extras/volume_id/README +++ b/extras/volume_id/README @@ -37,7 +37,6 @@ luks * - * - hpfs * - - - romfs * minix * -dasd * highpoint * isw_raid * lsi_raid * diff --git a/extras/volume_id/vol_id.c b/extras/volume_id/vol_id.c index 1b180a7734..a4a866cfcf 100644 --- a/extras/volume_id/vol_id.c +++ b/extras/volume_id/vol_id.c @@ -32,7 +32,6 @@ #include "../../udev_utils.h" #include "../../logging.h" #include "volume_id/volume_id.h" -#include "volume_id/dasd.h" #define BLKGETSIZE64 _IOR(0x12,114,size_t) @@ -147,9 +146,6 @@ int main(int argc, char *argv[]) if (volume_id_probe_all(vid, 0, size) == 0) goto print; - if (volume_id_probe_dasd(vid) == 0) - goto print; - if (print != PRINT_EXPORT) fprintf(stderr, "%s: unknown volume type\n", node); rc = 3; diff --git a/extras/volume_id/volume_id/Makefile.inc b/extras/volume_id/volume_id/Makefile.inc index acd26ff101..266d1e4872 100644 --- a/extras/volume_id/volume_id/Makefile.inc +++ b/extras/volume_id/volume_id/Makefile.inc @@ -26,7 +26,6 @@ VOLUME_ID_OBJS= \ $(VOLUME_ID_BASE)/romfs.o \ $(VOLUME_ID_BASE)/sysv.o \ $(VOLUME_ID_BASE)/minix.o \ - $(VOLUME_ID_BASE)/dasd.o \ $(VOLUME_ID_BASE)/luks.o \ $(VOLUME_ID_BASE)/volume_id.o \ $(VOLUME_ID_BASE)/util.o @@ -58,7 +57,6 @@ VOLUME_ID_HEADERS= \ $(VOLUME_ID_BASE)/romfs.h \ $(VOLUME_ID_BASE)/sysv.h \ $(VOLUME_ID_BASE)/minix.h \ - $(VOLUME_ID_BASE)/dasd.h \ $(VOLUME_ID_BASE)/luks.h \ $(VOLUME_ID_BASE)/volume_id.h \ $(VOLUME_ID_BASE)/util.h diff --git a/extras/volume_id/volume_id/dasd.c b/extras/volume_id/volume_id/dasd.c deleted file mode 100644 index e02b15ce8a..0000000000 --- a/extras/volume_id/volume_id/dasd.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * dasdlabel - read label from s390 block device - * - * Copyright (C) 2004 Arnd Bergmann - * - * 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. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE 1 -#endif - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include "volume_id.h" -#include "logging.h" -#include "util.h" -#include "dasd.h" - -#ifdef __s390__ -static unsigned char EBCtoASC[256] = { -/* 0x00 NUL SOH STX ETX *SEL HT *RNL DEL */ - 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F, -/* 0x08 -GE -SPS -RPT VT FF CR SO SI */ - 0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -/* 0x10 DLE DC1 DC2 DC3 -RES -NL BS -POC - -ENP ->LF */ - 0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07, -/* 0x18 CAN EM -UBS -CU1 -IFS -IGS -IRS -ITB - -IUS */ - 0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -/* 0x20 -DS -SOS FS -WUS -BYP LF ETB ESC - -INP */ - 0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B, -/* 0x28 -SA -SFE -SM -CSP -MFA ENQ ACK BEL - -SW */ - 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07, -/* 0x30 ---- ---- SYN -IR -PP -TRN -NBS EOT */ - 0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04, -/* 0x38 -SBS -IT -RFF -CU3 DC4 NAK ---- SUB */ - 0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A, -/* 0x40 SP RSP ä ---- */ - 0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86, -/* 0x48 . < ( + | */ - 0x87, 0xA4, 0x9B, 0x2E, 0x3C, 0x28, 0x2B, 0x7C, -/* 0x50 & ---- */ - 0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07, -/* 0x58 ß ! $ * ) ; */ - 0x8D, 0xE1, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAA, -/* 0x60 - / ---- Ä ---- ---- ---- */ - 0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F, -/* 0x68 ---- , % _ > ? */ - 0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, -/* 0x70 --- ---- ---- ---- ---- ---- ---- */ - 0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -/* 0x78 * ` : # @ ' = " */ - 0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, -/* 0x80 * a b c d e f g */ - 0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, -/* 0x88 h i ---- ---- ---- */ - 0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1, -/* 0x90 ° j k l m n o p */ - 0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, -/* 0x98 q r ---- ---- */ - 0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07, -/* 0xA0 ~ s t u v w x */ - 0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, -/* 0xA8 y z ---- ---- ---- ---- */ - 0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07, -/* 0xB0 ^ ---- § ---- */ - 0x5E, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC, -/* 0xB8 ---- [ ] ---- ---- ---- ---- */ - 0xAB, 0x07, 0x5B, 0x5D, 0x07, 0x07, 0x07, 0x07, -/* 0xC0 { A B C D E F G */ - 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, -/* 0xC8 H I ---- ö ---- */ - 0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07, -/* 0xD0 } J K L M N O P */ - 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, -/* 0xD8 Q R ---- ü */ - 0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98, -/* 0xE0 \ S T U V W X */ - 0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, -/* 0xE8 Y Z ---- Ö ---- ---- ---- */ - 0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07, -/* 0xF0 0 1 2 3 4 5 6 7 */ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, -/* 0xF8 8 9 ---- ---- Ü ---- ---- ---- */ - 0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07 -}; - -static void vtoc_ebcdic_dec (const unsigned char *source, unsigned char *target, int l) -{ - int i; - - for (i = 0; i < l; i++) - target[i]=EBCtoASC[(unsigned char)(source[i])]; -} - -/* - * struct dasd_information_t - * represents any data about the data, which is visible to userspace - */ -typedef struct dasd_information_t { - unsigned int devno; /* S/390 devno */ - unsigned int real_devno; /* for aliases */ - unsigned int schid; /* S/390 subchannel identifier */ - unsigned int cu_type : 16; /* from SenseID */ - unsigned int cu_model : 8; /* from SenseID */ - unsigned int dev_type : 16; /* from SenseID */ - unsigned int dev_model : 8; /* from SenseID */ - unsigned int open_count; - unsigned int req_queue_len; - unsigned int chanq_len; /* length of chanq */ - char type[4]; /* from discipline.name, 'none' for unknown */ - unsigned int status; /* current device level */ - unsigned int label_block; /* where to find the VOLSER */ - unsigned int FBA_layout; /* fixed block size (like AIXVOL) */ - unsigned int characteristics_size; - unsigned int confdata_size; - char characteristics[64]; /* from read_device_characteristics */ - char configuration_data[256]; /* from read_configuration_data */ -} dasd_information_t; - -#define DASD_IOCTL_LETTER 'D' -#define BIODASDINFO _IOR(DASD_IOCTL_LETTER,1,dasd_information_t) -#define BLKSSZGET _IO(0x12,104) - -int volume_id_probe_dasd(struct volume_id *id) -{ - int blocksize; - dasd_information_t info; - __u8 *data; - __u8 *label_raw; - unsigned char name[7]; - - dbg("probing"); - if (ioctl(id->fd, BIODASDINFO, &info) != 0) - return -1; - - if (ioctl(id->fd, BLKSSZGET, &blocksize) != 0) - return -1; - - data = volume_id_get_buffer(id, info.label_block * blocksize, 16); - if (data == NULL) - return -1; - - if ((!info.FBA_layout) && (!strcmp(info.type, "ECKD"))) - label_raw = &data[8]; - else - label_raw = &data[4]; - - name[6] = '\0'; - volume_id_set_usage(id, VOLUME_ID_DISKLABEL); - id->type = "dasd"; - volume_id_set_label_raw(id, label_raw, 6); - vtoc_ebcdic_dec(label_raw, name, 6); - volume_id_set_label_string(id, name, 6); - - return 0; -} - -#else -int volume_id_probe_dasd(struct volume_id *id) -{ - return -1; -} -#endif /* __s390__ */ - diff --git a/extras/volume_id/volume_id/dasd.h b/extras/volume_id/volume_id/dasd.h deleted file mode 100644 index 751b9fda60..0000000000 --- a/extras/volume_id/volume_id/dasd.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * dasdlabel - read label from s390 block device - * - * Copyright (C) 2004 Arnd Bergmann - * - * 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. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef _VOLUME_ID_DASDLABEL_ -#define _VOLUME_ID_DASDLABEL_ - -extern int volume_id_probe_dasd(struct volume_id *id); - -#endif diff --git a/extras/volume_id/volume_id/volume_id.h b/extras/volume_id/volume_id/volume_id.h index 2266694f5e..c6aef50876 100644 --- a/extras/volume_id/volume_id/volume_id.h +++ b/extras/volume_id/volume_id/volume_id.h @@ -21,7 +21,7 @@ #ifndef _VOLUME_ID_H_ #define _VOLUME_ID_H_ -#define VOLUME_ID_VERSION 44 +#define VOLUME_ID_VERSION 45 #define VOLUME_ID_LABEL_SIZE 64 #define VOLUME_ID_UUID_SIZE 36 From 8cf97fb046ddcfaea48ab6182b0f69996158d280 Mon Sep 17 00:00:00 2001 From: Anton Farygin Date: Thu, 14 Jul 2005 11:39:55 +0200 Subject: [PATCH 11/12] fix typo in GROUP value application --- udev_rules.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/udev_rules.c b/udev_rules.c index d08edf7782..5669a8593e 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -987,7 +987,7 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev, struct s if (rule->group.operation == KEY_OP_ASSIGN_FINAL) udev->group_final = 1; strlcpy(udev->group, key_val(rule, &rule->group), sizeof(udev->group)); - apply_format(udev, key_val(rule, &rule->group), sizeof(udev->group), class_dev, sysfs_device); + apply_format(udev, udev->group, sizeof(udev->group), class_dev, sysfs_device); dbg("applied group='%s' to '%s'", udev->group, udev->kernel_name); } From 7fe082a8a42baa45ef45d82edde4f893410ebeea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Thu, 14 Jul 2005 11:43:05 +0200 Subject: [PATCH 12/12] correct default mode documentation in udev --- docs/writing_udev_rules/index.html | 2 +- etc/udev/redhat/udev.rules | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/writing_udev_rules/index.html b/docs/writing_udev_rules/index.html index 1ba43678c0..c2ccdc3663 100644 --- a/docs/writing_udev_rules/index.html +++ b/docs/writing_udev_rules/index.html @@ -321,7 +321,7 @@ Building on the style mentioned above, you can do even more flashy things. The u This prevents the need to excessively provide a GROUP="audio" key on every following rule which names sound devices.

-udev defaults to creating nodes with unix permissions of 0660 (read/write to owner and group), which is configured by the default_mode setting inside /etc/udev/udev.conf. There may be some situations where you do not want to use the default permissions on your device node. Fortunately, you can easily override the permissions in your rules using the MODE assignment key. As an example, the following rule defines that the inotify node shall be readable and writable to everyone: +udev defaults to creating nodes with unix permissions of 0660 (read/write to owner and group). There may be some situations where you do not want to use the default permissions on your device node. Fortunately, you can easily override the permissions in your rules using the MODE assignment key. As an example, the following rule defines that the inotify node shall be readable and writable to everyone:
KERNEL="inotify", NAME="misc/%k", SYMLINK="%k", MODE="0666"
diff --git a/etc/udev/redhat/udev.rules b/etc/udev/redhat/udev.rules index 2d4819f8c3..5bed782280 100644 --- a/etc/udev/redhat/udev.rules +++ b/etc/udev/redhat/udev.rules @@ -1,7 +1,7 @@ # There are a number of modifiers that are allowed to be used in some of the # fields. See the udev man page for a full description of them. # -# default is OWNER="root" GROUP="root", MODE="0600" +# default is OWNER="root" GROUP="root", MODE="0660" # # all block devices