* Re: [PATCH] add options to udevtrigger to control scanning
2006-08-31 0:41 [PATCH] add options to udevtrigger to control scanning Greg KH
` (3 preceding siblings ...)
2006-08-31 17:52 ` Greg KH
@ 2006-08-31 20:02 ` Scott James Remnant
2006-09-02 17:46 ` Roy Marples
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Scott James Remnant @ 2006-08-31 20:02 UTC (permalink / raw)
To: linux-hotplug
[-- Attachment #1.1.1: Type: text/plain, Size: 736 bytes --]
On Thu, 2006-08-31 at 10:31 -0700, Greg KH wrote:
> > The Ubuntu guys use a patch which can filter on values to have control
> > over what is triggered and what not. If we are going that road, I like
> > their patch more than this.
>
> Do you have a pointer to where this patch is?
>
Attached; I sent it to this list a while back as part of my "patches
collection" mail.
The reason we use this is that we try and have an initramfs that works
on every single machine, rather than produce a tailored one for the
machine underneath.
So we take a little more care about what we coldplug and when -- rather
than just probing for everything and hoping for the best.
Scott
--
Scott James Remnant
scott@ubuntu.com
[-- Attachment #1.1.2: 40-udevtrigger-filters.patch --]
[-- Type: text/x-patch, Size: 16480 bytes --]
diff -ruNp udev-093~/udevtrigger.8 udev-093/udevtrigger.8
--- udev-093~/udevtrigger.8 2006-05-29 10:18:16.000000000 +0100
+++ udev-093/udevtrigger.8 2006-06-07 19:30:30.000000000 +0100
@@ -1,37 +1,100 @@
-.\" ** You probably do not want to edit this file directly **
-.\" It was generated using the DocBook XSL Stylesheets (version 1.69.1).
-.\" Instead of manually editing it, you probably should edit the DocBook XML
-.\" source for it and then use the DocBook XSL Stylesheets to regenerate it.
-.TH "UDEVTRIGGER" "8" "March 2006" "udev" "udevtrigger"
-.\" disable hyphenation
-.nh
-.\" disable justification (adjust text to left margin only)
-.ad l
-.SH "NAME"
+.\"Generated by db2man.xsl. Don't modify this, modify the source.
+.de Sh \" Subsection
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Ip \" List item
+.br
+.ie \\n(.$>=3 .ne \\$3
+.el .ne 3
+.IP "\\$1" \\$2
+..
+.TH "UDEVTRIGGER" 8 "March 2006" "udev" "udevtrigger"
+.SH NAME
udevtrigger \- request kernel devices events for coldplug
.SH "SYNOPSIS"
+.ad l
+.hy 0
.HP 12
-\fBudevtrigger\fR [\fB\-\-verbose\fR] [\fB\-\-dry\-run\fR]
+\fBudevtrigger\fR [\fB\-\-verbose\fR] [\fB\-\-dry\-run\fR] [\fB\-\-serial\fR] [\fBFILTER\&.\&.\&.\fR]
+.ad
+.hy
+
.SH "DESCRIPTION"
+
.PP
-Trigger kernel device uevents to replay missing events at system coldplug.
+Trigger kernel device uevents to replay missing events at system coldplug\&.
+
.SH "OPTIONS"
+
.TP
\fB\-\-verbose\fR
-print out the devices found in sysfs.
+print out the devices found in sysfs\&.
+
.TP
\fB\-\-dry\-run\fR
-don't actually trigger the event.
+don't actually trigger the event\&.
+
+.TP
+\fB\-\-serial\fR
+run udevsettle between events\&.
+
+.SH "FILTER OPTIONS"
+
+.PP
+All options are accumulative and may be specified multiple times
+
+.TP
+\fB\-I\fIattr\fR=\fIvalue\fR\fR
+only those devices for which the given attribute matches the value (which may include wildcards) are triggered
+
+.TP
+\fB\-X\fIattr\fR=\fIvalue\fR\fR
+only those devices for which the given attribute DOES NOT MATCH the value (which may include wildcards) are triggered
+
+.TP
+\fB\-B\fIbus\fR\fR
+devices on the given bus are triggered
+
+.TP
+\fB\-C\fIclass\fR\fR
+devices in the given class are triggered
+
+.TP
+\fB\-F\fR
+devices that have previously failed are triggered
+
+.TP
+\fB\-b\fR
+block devices are triggered
+
+.TP
+\fB\-c\fR
+class devices are triggered
+
.SH "ENVIRONMENT"
+
.TP
\fBUDEV_LOG\fR
-Overrides the syslog priority specified in the config file.
+Overrides the syslog priority specified in the config file\&.
+
.SH "AUTHOR"
+
.PP
-Written by Kay Sievers
-<kay.sievers@vrfy.org>
-and Hannes Reinecke
-<hare@suse.de>.
+Written by Kay Sievers <kay\&.sievers@vrfy\&.org> and Hannes Reinecke <hare@suse\&.de>\&.
+
.SH "SEE ALSO"
+
.PP
\fBudev\fR(7)
+
+.SH AUTHOR
+Kay Sievers.
diff -ruNp udev-093~/udevtrigger.c udev-093/udevtrigger.c
--- udev-093~/udevtrigger.c 2006-05-29 10:18:16.000000000 +0100
+++ udev-093/udevtrigger.c 2006-06-07 20:06:31.000000000 +0100
@@ -27,15 +27,19 @@
#include <errno.h>
#include <dirent.h>
#include <fcntl.h>
+#include <ctype.h>
#include <syslog.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <sys/wait.h>
#include "udev.h"
+#include "udevd.h"
static const char *udev_log_str;
static int verbose;
static int dry_run;
+static int serial_plug;
#ifdef USE_LOG
void log_message(int priority, const char *format, ...)
@@ -96,11 +100,89 @@ static int device_list_insert(const char
return 0;
}
+struct filter {
+ struct list_head node;
+ char name[NAME_SIZE];
+ char value[VALUE_SIZE];
+ int include;
+};
+
+LIST_HEAD(filter_list);
+
+static int filter_list_insert(int include, const char *filter)
+{
+ struct filter *new_filter;
+ const char *ptr;
+
+ new_filter = malloc(sizeof(struct filter));
+ if (!new_filter) {
+ dbg("error malloc");
+ return -ENOMEM;
+ }
+ new_filter->include = include;
+
+ ptr = strchr(filter, '=');
+ if (ptr) {
+ if ((size_t)(ptr + 1 - filter) > sizeof(new_filter->name)) {
+ err("attribute name too long in filter %s", filter);
+ free(new_filter);
+ return 1;
+ }
+ memcpy(new_filter->name, filter, ptr - filter);
+ new_filter->name[ptr - filter] = '\0';
+
+ strlcpy(new_filter->value, ptr + 1, sizeof(new_filter->value));
+ } else {
+ strlcpy(new_filter->name, filter, sizeof(new_filter->name));
+ strlcpy(new_filter->value, "?*", sizeof(new_filter->value));
+ }
+
+ list_add_tail(&new_filter->node, &filter_list);
+ dbg("add %s filter '%s' value '%s'",
+ new_filter->include ? "include" : "exclude",
+ new_filter->name, new_filter->value);
+ return 0;
+}
+
static void trigger_uevent(const char *path)
{
+ struct filter *loop_filter;
+ const char *devpath;
char filename[PATH_SIZE];
int fd;
+ devpath = path;
+ if (!strncmp (devpath, sysfs_path, strlen(sysfs_path)))
+ devpath += strlen(sysfs_path);
+
+ list_for_each_entry(loop_filter, &filter_list, node) {
+ char *attr, value[256];
+ int i;
+
+ attr = sysfs_attr_get_value(devpath, loop_filter->name);
+ if (!attr) {
+ if (loop_filter->include)
+ return;
+
+ continue;
+ }
+
+ i = strlcpy(value, attr, sizeof(value));
+ while (i > 0 && isspace(value[i-1]))
+ value[--i] = '\0';
+
+ if (strcmp_pattern(loop_filter->value, value) == 0) {
+ dbg("device '%s' attr '%s' matched filter '%s' <-> '%s'",
+ path, loop_filter->name, value, loop_filter->value);
+
+ if (!loop_filter->include)
+ return;
+ } else {
+ if (loop_filter->include)
+ return;
+ }
+ }
+
strlcpy(filename, path, sizeof(filename));
strlcat(filename, "/uevent", sizeof(filename));
@@ -120,6 +202,24 @@ static void trigger_uevent(const char *p
info("error on triggering %s: %s\n", filename, strerror(errno));
close(fd);
+
+ if (serial_plug && !dry_run) {
+ pid_t pid;
+
+ pid = fork();
+ switch(pid) {
+ case 0:
+ execl("/sbin/udevsettle", "/sbin/udevsettle", NULL);
+
+ /* we should never reach this */
+ err("exec of udevsettle failed");
+ _exit(1);
+ case -1:
+ err("fork of udevsettle failed: %s", strerror(errno));
+ default:
+ waitpid(pid, NULL, 0);
+ }
+ }
}
static void exec_lists(void)
@@ -166,6 +266,35 @@ static int is_device(const char *path)
return 1;
}
+static void udev_scan_bus_devices(const char *devpath)
+{
+ char dirname[PATH_SIZE];
+ DIR *dir2;
+ struct dirent *dent2;
+
+ strlcpy(dirname, devpath, sizeof(dirname));
+ strlcat(dirname, "/devices", sizeof(dirname));
+
+ /* look for devices */
+ dir2 = opendir(dirname);
+ if (dir2 != NULL) {
+ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
+ char dirname2[PATH_SIZE];
+
+ if (dent2->d_name[0] == '.')
+ continue;
+
+ strlcpy(dirname2, dirname, sizeof(dirname2));
+ strlcat(dirname2, "/", sizeof(dirname2));
+ strlcat(dirname2, dent2->d_name, sizeof(dirname2));
+
+ if (is_device(dirname2))
+ device_list_insert(dirname2);
+ }
+ closedir(dir2);
+ }
+}
+
static void udev_scan_bus(void)
{
char base[PATH_SIZE];
@@ -179,8 +308,6 @@ static void udev_scan_bus(void)
if (dir != NULL) {
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
char dirname[PATH_SIZE];
- DIR *dir2;
- struct dirent *dent2;
if (dent->d_name[0] == '.')
continue;
@@ -188,31 +315,24 @@ static void udev_scan_bus(void)
strlcpy(dirname, base, sizeof(dirname));
strlcat(dirname, "/", sizeof(dirname));
strlcat(dirname, dent->d_name, sizeof(dirname));
- strlcat(dirname, "/devices", sizeof(dirname));
-
- /* look for devices */
- dir2 = opendir(dirname);
- if (dir2 != NULL) {
- for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
- char dirname2[PATH_SIZE];
- if (dent2->d_name[0] == '.')
- continue;
-
- strlcpy(dirname2, dirname, sizeof(dirname2));
- strlcat(dirname2, "/", sizeof(dirname2));
- strlcat(dirname2, dent2->d_name, sizeof(dirname2));
-
- if (is_device(dirname2))
- device_list_insert(dirname2);
- }
- closedir(dir2);
- }
+ udev_scan_bus_devices(dirname);
}
closedir(dir);
}
}
+static void udev_scan_one_bus(const char *bus)
+{
+ char base[PATH_SIZE];
+
+ strlcpy(base, sysfs_path, sizeof(base));
+ strlcat(base, "/bus/", sizeof(base));
+ strlcat(base, bus, sizeof(base));
+
+ udev_scan_bus_devices(base);
+}
+
static void udev_scan_block(void)
{
char base[PATH_SIZE];
@@ -272,6 +392,32 @@ static void udev_scan_block(void)
}
}
+static void udev_scan_class_devices(const char *devpath)
+{
+ DIR *dir2;
+ struct dirent *dent2;
+
+ dir2 = opendir(devpath);
+ if (dir2 != NULL) {
+ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
+ char dirname[PATH_SIZE];
+
+ if (dent2->d_name[0] == '.')
+ continue;
+
+ if (!strcmp(dent2->d_name, "device"))
+ continue;
+
+ strlcpy(dirname, devpath, sizeof(dirname));
+ strlcat(dirname, "/", sizeof(dirname));
+ strlcat(dirname, dent2->d_name, sizeof(dirname));
+ if (is_device(dirname))
+ device_list_insert(dirname);
+ }
+ closedir(dir2);
+ }
+}
+
static void udev_scan_class(void)
{
char base[PATH_SIZE];
@@ -285,8 +431,6 @@ static void udev_scan_class(void)
if (dir != NULL) {
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
char dirname[PATH_SIZE];
- DIR *dir2;
- struct dirent *dent2;
if (dent->d_name[0] == '.')
continue;
@@ -294,25 +438,54 @@ static void udev_scan_class(void)
strlcpy(dirname, base, sizeof(dirname));
strlcat(dirname, "/", sizeof(dirname));
strlcat(dirname, dent->d_name, sizeof(dirname));
- dir2 = opendir(dirname);
- if (dir2 != NULL) {
- for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
- char dirname2[PATH_SIZE];
- if (dent2->d_name[0] == '.')
- continue;
+ udev_scan_class_devices(dirname);
+ }
+ closedir(dir);
+ }
+}
- if (!strcmp(dent2->d_name, "device"))
- continue;
+static void udev_scan_one_class(const char *class)
+{
+ char base[PATH_SIZE];
- strlcpy(dirname2, dirname, sizeof(dirname2));
- strlcat(dirname2, "/", sizeof(dirname2));
- strlcat(dirname2, dent2->d_name, sizeof(dirname2));
- if (is_device(dirname2))
- device_list_insert(dirname2);
- }
- closedir(dir2);
- }
+ strlcpy(base, sysfs_path, sizeof(base));
+ strlcat(base, "/class/", sizeof(base));
+ strlcat(base, class, sizeof(base));
+
+ udev_scan_class_devices(base);
+}
+
+static void udev_scan_failed(void)
+{
+ char base[PATH_SIZE];
+ DIR *dir;
+ struct dirent *dent;
+
+ strlcpy(base, udev_root, sizeof(base));
+ strlcat(base, "/", sizeof(base));
+ strlcat(base, EVENT_FAILED_DIR, sizeof(base));
+
+ dir = opendir(base);
+ if (dir != NULL) {
+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+ char linkname[PATH_SIZE];
+ char dirname[PATH_SIZE];
+
+ if (dent->d_name[0] == '.')
+ continue;
+
+ strlcpy(linkname, base, sizeof(linkname));
+ strlcat(linkname, "/", sizeof(linkname));
+ strlcat(linkname, dent->d_name, sizeof(linkname));
+
+ if (readlink(linkname, dirname, sizeof(dirname)) == 0)
+ continue;
+
+ if (is_device(dirname))
+ device_list_insert(dirname);
+ else
+ continue;
}
closedir(dir);
}
@@ -320,6 +493,7 @@ static void udev_scan_class(void)
int main(int argc, char *argv[], char *envp[])
{
+ int scan_default = 1;
int i;
logging_init("udevtrigger");
@@ -328,6 +502,8 @@ int main(int argc, char *argv[], char *e
udev_log_str = getenv("UDEV_LOG");
+ sysfs_init();
+
for (i = 1 ; i < argc; i++) {
char *arg = argv[i];
@@ -335,17 +511,40 @@ int main(int argc, char *argv[], char *e
verbose = 1;
else if (strcmp(arg, "--dry-run") == 0 || strcmp(arg, "-n") == 0)
dry_run = 1;
- else {
- fprintf(stderr, "Usage: udevtrigger [--verbose] [--dry-run]\n");
+ else if (strcmp(arg, "--serial") == 0 || strcmp(arg, "-s") == 0)
+ serial_plug = 1;
+ else if (strncmp(arg, "-I", 2) == 0)
+ filter_list_insert(1, arg + 2);
+ else if (strncmp(arg, "-X", 2) == 0)
+ filter_list_insert(0, arg + 2);
+ else if (strncmp(arg, "-B", 2) == 0) {
+ udev_scan_one_bus(arg + 2);
+ scan_default = 0;
+ } else if (strncmp(arg, "-C", 2) == 0) {
+ udev_scan_one_class(arg + 2);
+ scan_default = 0;
+ } else if (strcmp(arg, "-F") == 0) {
+ udev_scan_failed();
+ scan_default = 0;
+ } else if (strcmp(arg, "-b") == 0) {
+ udev_scan_one_class("block");
+ udev_scan_block();
+ scan_default = 0;
+ } else if (strcmp(arg, "-c") == 0) {
+ udev_scan_class();
+ scan_default = 0;
+ } else {
+ fprintf(stderr, "Usage: udevtrigger [--verbose] [--dry-run] [--serial] [FILTER...]\n");
goto exit;
}
}
- sysfs_init();
+ if (scan_default) {
+ udev_scan_bus();
+ udev_scan_class();
+ udev_scan_block();
+ }
- udev_scan_bus();
- udev_scan_class();
- udev_scan_block();
exec_lists();
sysfs_cleanup();
diff -ruNp udev-093~/udevtrigger.xml udev-093/udevtrigger.xml
--- udev-093~/udevtrigger.xml 2006-05-29 10:18:16.000000000 +0100
+++ udev-093/udevtrigger.xml 2006-06-07 19:30:17.000000000 +0100
@@ -39,6 +39,8 @@
<command>udevtrigger</command>
<arg><option>--verbose</option></arg>
<arg><option>--dry-run</option></arg>
+ <arg><option>--serial</option></arg>
+ <arg><option>FILTER...</option></arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -60,6 +62,63 @@
<para>don't actually trigger the event.</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>--serial</option></term>
+ <listitem>
+ <para>run udevsettle between events.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1><title>FILTER OPTIONS</title>
+ <para>All options are accumulative and may be specified multiple times</para>
+ <variablelist>
+ <varlistentry>
+ <term><option>-I<replaceable>attr</replaceable>=<replaceable>value</replaceable></option></term>
+ <listitem>
+ <para>only those devices for which the given attribute matches
+ the value (which may include wildcards) are triggered</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-X<replaceable>attr</replaceable>=<replaceable>value</replaceable></option></term>
+ <listitem>
+ <para>only those devices for which the given attribute DOES
+ NOT MATCH the value (which may include wildcards) are
+ triggered</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-B<replaceable>bus</replaceable></option></term>
+ <listitem>
+ <para>devices on the given bus are triggered</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-C<replaceable>class</replaceable></option></term>
+ <listitem>
+ <para>devices in the given class are triggered</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-F</option></term>
+ <listitem>
+ <para>devices that have previously failed are triggered</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-b</option></term>
+ <listitem>
+ <para>block devices are triggered</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-c</option></term>
+ <listitem>
+ <para>class devices are triggered</para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect1>
[-- Attachment #1.2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 191 bytes --]
[-- Attachment #2: Type: text/plain, Size: 373 bytes --]
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
[-- Attachment #3: Type: text/plain, Size: 226 bytes --]
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH] add options to udevtrigger to control scanning
2006-08-31 0:41 [PATCH] add options to udevtrigger to control scanning Greg KH
` (7 preceding siblings ...)
2006-09-03 3:46 ` Greg KH
@ 2006-09-03 4:03 ` Greg KH
8 siblings, 0 replies; 10+ messages in thread
From: Greg KH @ 2006-09-03 4:03 UTC (permalink / raw)
To: linux-hotplug
[-- Attachment #1: Type: text/plain, Size: 308 bytes --]
On Sat, Sep 02, 2006 at 08:46:27PM -0700, Greg KH wrote:
> Oh, attached is the latest gentoo 50-rules.d file, if you want to update
> the udev tree with it (Gentoo now uses the persistant rules file from
> the udev package, so our rules file is a lot smaller now.)
Bleah, forgot it, sorry. Here it is...
[-- Attachment #2: 50-udev.rules --]
[-- Type: text/plain, Size: 10095 bytes --]
# /etc/udev/rules/50-udev.rules: device naming rules for udev
#
# Gentoo specific rules
#
# 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.
#
# Try not to modify this file, if you wish to change things, create a new rule
# file that can be run before this one.
#
# console
KERNEL=="pty[pqrstuvwxyzabcdef][0123456789abcdef]", NAME="%k", GROUP="tty", OPTIONS="last_rule"
KERNEL=="tty[pqrstuvwxyzabcdef][0123456789abcdef]", NAME="%k", GROUP="tty", OPTIONS="last_rule"
KERNEL=="vcs*", NAME="%k", GROUP="tty", OPTIONS="last_rule"
KERNEL=="vcsa*", NAME="%k", GROUP="tty", OPTIONS="last_rule"
KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
KERNEL=="tty[0-9]", NAME="%k", GROUP="tty", OPTIONS="last_rule"
KERNEL=="tty[0-9][0-9]", NAME="%k", GROUP="tty", OPTIONS="last_rule"
KERNEL=="console", NAME="%k", GROUP="tty", MODE="0600"
KERNEL=="ptmx", NAME="%k", GROUP="tty", MODE="0666"
# tty devices
KERNEL=="ttyS[0-9]*", NAME="%k", SYMLINK="tts/%n", GROUP="tty"
KERNEL=="ttyUSB[0-9]*", NAME="%k", SYMLINK="tts/USB%n", GROUP="tty", MODE="0660"
KERNEL=="ippp0", NAME="%k", GROUP="tty"
KERNEL=="isdn*" NAME="%k", GROUP="tty"
KERNEL=="dcbri*", NAME="%k", GROUP="tty"
KERNEL=="ircomm*", NAME="%k", GROUP="tty"
# all block devices
SUBSYSTEM=="block", GROUP="disk"
# cdrom symlinks and other good cdrom naming
BUS=="ide", KERNEL=="hd[a-z]", ACTION=="add", IMPORT="cdrom_id --export $tempnode"
BUS=="scsi", KERNEL=="sr[0-9]*", ACTION=="add", IMPORT="cdrom_id --export $tempnode"
BUS=="scsi", KERNEL=="scd[a-z]", ACTION=="add", IMPORT="cdrom_id --export $tempnode"
BUS=="scsi", KERNEL=="sg[0-9]*", ACTION=="add", DRIVERS=="sr", GROUP="cdrom"
ENV{ID_CDROM}=="?*", PROGRAM="seq_node.sh %r %k cdrom", SYMLINK+="%c", GROUP="cdrom"
ENV{ID_CDROM_CD_RW}=="?*", PROGRAM="seq_node.sh %r %k cdrw", SYMLINK+="%c"
ENV{ID_CDROM_DVD}=="?*", PROGRAM="seq_node.sh %r %k dvd", SYMLINK+="%c"
ENV{ID_CDROM_DVD_R}=="?*", PROGRAM="seq_node.sh %r %k dvdrw", SYMLINK+="%c"
# disk devices
KERNEL=="sd*", NAME="%k", GROUP="disk"
KERNEL=="dasd*", NAME="%k", GROUP="disk"
KERNEL=="ataraid*", NAME="%k", GROUP="disk"
# compaq smart array
KERNEL=="cciss*", NAME="%k"
KERNEL=="ida*", NAME="%k"
# mylex
KERNEL=="rd*", NAME="%k"
# dri devices
KERNEL=="card*", NAME="dri/card%n", GROUP="video"
KERNEL=="nvidia*", NAME="%k", GROUP="video"
KERNEL=="3dfx*", NAME="%k", GROUP="video"
# alsa devices
SUBSYSTEM=="sound", GROUP="audio"
KERNEL=="controlC[0-9]*", NAME="snd/%k"
KERNEL=="hw[CD0-9]*", NAME="snd/%k"
KERNEL=="pcm[CD0-9cp]*", NAME="snd/%k"
KERNEL=="midiC[D0-9]*", NAME="snd/%k"
KERNEL=="timer", NAME="snd/%k"
KERNEL=="seq", NAME="snd/%k"
# capi devices
KERNEL=="capi", NAME="capi20", SYMLINK+="isdn/capi20", GROUP="dialout"
KERNEL=="capi*", NAME="capi/%n", GROUP="dialout"
# cpu devices
KERNEL=="cpu[0-9]*", NAME="cpu/%n/cpuid"
KERNEL=="msr[0-9]*", NAME="cpu/%n/msr"
KERNEL=="microcode", NAME="cpu/microcode"
# dm devices (ignore them)
KERNEL=="dm-[0-9]*", OPTIONS="ignore_device"
# create a symlink named after the device map name
# note devmap_name comes with extras/multipath
#KERNEL=="dm-[0-9]*", PROGRAM="/sbin/devmap_name %M %m", NAME="%k", SYMLINK+="%c"
KERNEL=="device-mapper", NAME="mapper/control"
# fb devices
KERNEL=="fb[0-9]*", NAME="fb/%n", SYMLINK+="%k", GROUP="video"
# floppy devices
KERNEL=="fd[0-9]*", NAME="floppy/%n", SYMLINK+="%k", GROUP="floppy"
# i2c devices
KERNEL=="i2c-[0-9]*", NAME="i2c/%n", SYMLINK+="%k"
# input devices
KERNEL=="mice", NAME="input/%k", MODE="0644"
KERNEL=="mouse*", NAME="input/%k", MODE="0644"
KERNEL=="event*", NAME="input/%k", MODE="0600"
KERNEL=="js*", NAME="input/%k", MODE="664"
KERNEL=="ts*", NAME="input/%k", MODE="0600"
# loop devices
KERNEL=="loop[0-9]*", NAME="loop/%n", SYMLINK+="%k", GROUP="disk"
# md block devices
KERNEL=="md[0-9]*", NAME="md/%n", SYMLINK+="%k", GROUP="disk"
# aoe char devices,
SUBSYSTEM=="aoe", KERNEL=="discover", NAME="etherd/%k", GROUP="disk", MODE="0220"
SUBSYSTEM=="aoe", KERNEL=="err", NAME="etherd/%k", GROUP="disk", MODE="0440"
SUBSYSTEM=="aoe", KERNEL=="interfaces", NAME="etherd/%k", GROUP="disk", MODE="0220"
# misc devices
KERNEL=="agpgart", NAME="misc/%k", SYMLINK+="%k"
KERNEL=="psaux", NAME="misc/%k", SYMLINK+="%k"
KERNEL=="rtc", NAME="misc/%k", SYMLINK+="%k", MODE="0664"
KERNEL=="uinput", NAME="misc/%k", SYMLINK+="%k"
KERNEL=="inotify", NAME="misc/%k", SYMLINK+="%k", MODE="0666"
# netlink devices
KERNEL=="route", NAME="netlink/%k"
KERNEL=="skip", NAME="netlink/%k"
KERNEL=="usersock", NAME="netlink/%k"
KERNEL=="fwmonitor", NAME="netlink/%k"
KERNEL=="tcpdiag", NAME="netlink/%k"
KERNEL=="nflog", NAME="netlink/%k"
KERNEL=="xfrm", NAME="netlink/%k"
KERNEL=="arpd", NAME="netlink/%k"
KERNEL=="route6", NAME="netlink/%k"
KERNEL=="ip6_fw", NAME="netlink/%k"
KERNEL=="dnrtmsg", NAME="netlink/%k"
KERNEL=="tap*", NAME="netlink/%k"
# network devices
KERNEL=="tun", NAME="net/%k", MODE="0600"
# ramdisk devices
KERNEL=="ram[0-9]*", NAME="rd/%n", SYMLINK+="%k"
# IEEE1394 (firewire) devices (must be before raw devices below)
KERNEL=="raw1394", NAME="%k", GROUP="video"
KERNEL=="dv1394*", NAME="dv1394/%n", GROUP="video"
KERNEL=="video1394*", NAME="video1394/%n", GROUP="video"
# raw devices
KERNEL=="raw[0-9]*", NAME="raw/%k", GROUP="disk"
KERNEL=="ram*", NAME="%k", GROUP="disk"
# sound devices
KERNEL=="adsp", NAME="sound/%k", SYMLINK+="%k", GROUP="audio"
KERNEL=="adsp[0-9]*", NAME="sound/%k", SYMLINK+="%k", GROUP="audio"
KERNEL=="audio", NAME="sound/%k", SYMLINK+="%k", GROUP="audio"
KERNEL=="audio[0-9]*", NAME="sound/%k", SYMLINK+="%k", GROUP="audio"
KERNEL=="dsp", NAME="sound/%k", SYMLINK+="%k", GROUP="audio"
KERNEL=="dsp[0-9]*", NAME="sound/%k", SYMLINK+="%k", GROUP="audio"
KERNEL=="mixer", NAME="sound/%k", SYMLINK+="%k", GROUP="audio"
KERNEL=="mixer[0-9]*", NAME="sound/%k", SYMLINK+="%k", GROUP="audio"
KERNEL=="sequencer", NAME="sound/%k", SYMLINK+="%k", GROUP="audio"
KERNEL=="sequencer[0-9]*", NAME="sound/%k", SYMLINK+="%k", GROUP="audio"
# memory devices
KERNEL=="random", NAME="%k", MODE="0666"
KERNEL=="urandom", NAME="%k", MODE="0444"
KERNEL=="mem", NAME="%k", MODE="0640"
KERNEL=="kmem", NAME="%k", MODE="0640"
KERNEL=="port", NAME="%k", MODE="0640"
KERNEL=="full", NAME="%k", MODE="0666"
KERNEL=="null", NAME="%k", MODE="0666"
KERNEL=="zero", NAME="%k", MODE="0666"
# usb devices
KERNEL=="hiddev*", NAME="usb/%k"
KERNEL=="auer*", NAME="usb/%k"
KERNEL=="legousbtower*", NAME="usb/%k", GROUP="usb"
KERNEL=="dabusb*", NAME="usb/%k"
BUS=="usb", KERNEL=="lp[0-9]*", NAME="usb/%k", GROUP="lp"
# v4l devices
KERNEL=="video[0-9]*", NAME="v4l/video%n", SYMLINK+="video%n", GROUP="video"
KERNEL=="radio[0-9]*", NAME="v4l/radio%n", SYMLINK+="radio%n", GROUP="video"
KERNEL=="vbi[0-9]*", NAME="v4l/vbi%n", SYMLINK+="vbi%n", GROUP="video"
KERNEL=="vtx[0-9]*", NAME="v4l/vtx%n", GROUP="video"
# dvb devices
SUBSYSTEM=="dvb", PROGRAM="/bin/sh -c 'K=%k; K=$${K#dvb}; printf dvb/adapter%%i/%%s $${K%%%%.*} $${K#*.}'", NAME="%c", GROUP="video"
# Asterisk Zaptel devices
KERNEL=="zapctl", NAME="zap/ctl"
KERNEL=="zaptimer", NAME="zap/timer"
KERNEL=="zapchannel", NAME="zap/channel"
KERNEL=="zappseudo", NAME="zap/pseudo"
KERNEL=="zap[0-9]*", NAME="zap/%n"
# pilot/palm devices
KERNEL=="pilot", NAME="%k", GROUP="uucp"
# jaz devices
KERNEL=="jaz*", NAME="%k", GROUP="disk"
# zip devices
KERNEL=="pocketzip*", NAME="%k", GROUP="disk"
KERNEL=="zip*", NAME="%k", GROUP="disk"
# ls120 devices
KERNEL=="ls120", NAME="%k", GROUP="disk"
# lp devices
KERNEL=="lp*", NAME="%k", GROUP="lp"
KERNEL=="irlpt", NAME="%k", GROUP="lp"
KERNEL=="usblp", NAME="%k", GROUP="lp"
KERNEL=="lp*", NAME="%k", GROUP="lp"
KERNEL=="parport*", NAME="%k", GROUP="lp"
# tape devices
KERNEL=="ht*", NAME="%k", GROUP="tape"
KERNEL=="nht*", NAME="%k", GROUP="tape"
KERNEL=="pt*", NAME="%k", GROUP="tape"
KERNEL=="npt*", NAME="%k", GROUP="tape"
KERNEL=="st*", NAME="%k", GROUP="tape"
KERNEL=="nst*", NAME="%k", GROUP="tape"
KERNEL=="osst*", NAME="%k", GROUP="tape"
KERNEL=="nosst*", NAME="%k", GROUP="tape"
# diskonkey devices
KERNEL=="diskonkey*", NAME="%k", GROUP="disk"
# rem_ide devices
KERNEL=="microdrive*", NAME="%k", GROUP="disk"
# kbd devices
KERNEL=="kbd", NAME="%k", MODE="0664"
# Sony Vaio Jogdial sonypi device
KERNEL=="sonypi", NAME="%k", MODE="0666"
# packet devices
KERNEL=="pktcdvd", NAME="pktcdvd/control", GROUP="cdrw", MODE="0660"
KERNEL=="pktcdvd[0-9]*", NAME="pktcdvd/pktcdvd%n", GROUP="cdrw", MODE="0660"
# infiniband devices
KERNEL=="umad*", NAME="infiniband/%k"
KERNEL=="issm*", NAME="infiniband/%k"
# usbfs-like device nodes
SUBSYSTEM=="usb_device", PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", NAME="%c", MODE="0644"
# Module autoloading
# Autoload modules that lack aliases but have them defined inutoload modules
SYSFS{modalias}=="?*", ACTION=="add", RUN+="/sbin/modprobe $env{MODALIAS}"
# /etc/modprobe.conf.
SUBSYSTEM=="pnp", ENV{MODALIAS}!="?*", RUN+="/bin/sh -c 'while read id; do /sbin/modprobe pnp:d$$id; done < /sys$devpath/id'"
# If you have problems with some pnp modules being loaded, please enter the
# following aliases into the modprobe configuration files. These are needed by
# udev to autoload some modules
# alias pnp:dPNP0510 irtty-sir
# alias pnp:dPNP0511 irtty-sir
# alias pnp:dPNP0700 floppy
# alias pnp:dPNP0800 pcspkr
# alias pnp:dPNP0b00 rtc
# alias pnp:dPNP0303 atkbd
# alias pnp:dPNP0f13 psmouse
# alias pnp:dPNPb02f analog
# Load firmware
SUBSYSTEM=="firmware", ACTION=="add", RUN+="firmware.sh"
# be backward compatible for a while with the /etc/dev.d and /etc/hotplug.d/ systems
# run /etc/hotplug.d/ stuff only if we came from a hotplug event, not for udevstart
ENV{UDEVD_EVENT}=="1", RUN+="udev_run_hotplugd $env{SUBSYSTEM}"
# always run /etc/dev.d/ stuff for now.
RUN+="udev_run_devd $env{SUBSYSTEM}"
# debugging monitor
RUN+="socket:/org/kernel/udev/monitor"
[-- Attachment #3: Type: text/plain, Size: 373 bytes --]
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
[-- Attachment #4: Type: text/plain, Size: 226 bytes --]
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel
^ permalink raw reply [flat|nested] 10+ messages in thread