chiark / gitweb /
add OPTIONS+="event_timeout=<seconds>"
authorKay Sievers <kay.sievers@vrfy.org>
Mon, 21 Apr 2008 17:00:54 +0000 (19:00 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Mon, 21 Apr 2008 17:00:54 +0000 (19:00 +0200)
test-udev.c
udev.7
udev.h
udev.xml
udev_device.c
udev_rules.c
udev_rules.h
udev_rules_parse.c
udevd.c
udevtest.c

index e341b74f2f5fbd6a698f079c55484504f0124a07..4ac2d5a8891cedb53386de53358e42bd611c804f 100644 (file)
@@ -105,7 +105,7 @@ int main(int argc, char *argv[], char *envp[])
        sigaction(SIGTERM, &act, NULL);
 
        /* trigger timeout to prevent hanging processes */
-       alarm(UDEV_ALARM_TIMEOUT);
+       alarm(UDEV_EVENT_TIMEOUT);
 
        action = getenv("ACTION");
        devpath = getenv("DEVPATH");
@@ -154,6 +154,10 @@ int main(int argc, char *argv[], char *envp[])
 
        retval = udev_device_event(&rules, udev);
 
+       /* rules may change/disable the timeout */
+       if (udev->event_timeout >= 0)
+               alarm(udev->event_timeout);
+
        if (retval == 0 && !udev->ignore_device && udev_run)
                udev_rules_run(udev);
 
diff --git a/udev.7 b/udev.7
index 1cad58d18b216165db276bf900e0d84a2af923b8..096bf385548fcb7922e4fe7a536ccabd9b2bb70f 100644 (file)
--- a/udev.7
+++ b/udev.7
@@ -291,6 +291,11 @@ Specify the priority of the created symlinks\. Devices with higher priorities ov
 Create the device nodes for all available partitions of a block device\. This may be useful for removable media devices where media changes are not detected\.
 .RE
 .PP
+\fBevent_timeout=\fR
+.RS 4
+Number of seconds an event will wait for operations to finish, before it will terminate itself\.
+.RE
+.PP
 \fBstring_escape=\fR\fB\fInone|replace\fR\fR
 .RS 4
 Usually control and other possibly unsafe characters are replaced in strings used for device naming\. The mode of replacement can be specified with this option\.
diff --git a/udev.h b/udev.h
index e6e953b25dfa21fd5c8027ea5134831c26762997..e1b7ac0d8ac85b6a94c58f4a8dbad8eeba6ed692 100644 (file)
--- a/udev.h
+++ b/udev.h
@@ -39,7 +39,7 @@
 #define ALLOWED_CHARS_INPUT                    ALLOWED_CHARS_FILE " $%?,"
 
 #define DEFAULT_PARTITIONS_COUNT               15
-#define UDEV_ALARM_TIMEOUT                     180
+#define UDEV_EVENT_TIMEOUT                     180
 
 #define UDEV_MAX(a,b) ((a) > (b) ? (a) : (b))
 
@@ -93,6 +93,7 @@ struct udevice {
        int ignore_remove;
        char program_result[PATH_SIZE];
        int link_priority;
+       int event_timeout;
        int test_run;
 };
 
index 15651e006e7fa8cb259a3d0c64fe5c68c8368457..ac3676e4663e94a1daa9ef5f65eb7f5728e63487 100644 (file)
--- a/udev.xml
+++ b/udev.xml
                       detected.</para>
                     </listitem>
                   </varlistentry>
+                  <varlistentry>
+                    <term><option>event_timeout=</option></term>
+                    <listitem>
+                      <para>Number of seconds an event will wait for operations to finish, before it
+                      will terminate itself.</para>
+                    </listitem>
+                  </varlistentry>
                   <varlistentry>
                     <term><option>string_escape=<replaceable>none|replace</replaceable></option></term>
                     <listitem>
index 6546db482c3564bad4b89c4af1e390872343dffa..cf21191ca0069f91d089fad0be6f9e2ff08d9c6c 100644 (file)
@@ -53,6 +53,8 @@ struct udevice *udev_device_init(struct udevice *udev)
        strcpy(udev->owner, "root");
        strcpy(udev->group, "root");
 
+       udev->event_timeout = -1;
+
        return udev;
 }
 
index d476e699e408b1c3d0d3590fca6af353a1209f31..55a079be8746f01eadb222cf02dfe8e1f8f9bc2a 100644 (file)
@@ -1397,6 +1397,10 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev)
                                udev->link_priority = rule->link_priority;
                                info("link_priority=%i\n", udev->link_priority);
                        }
+                       if (rule->event_timeout >= 0) {
+                               udev->event_timeout = rule->event_timeout;
+                               info("event_timeout=%i\n", udev->event_timeout);
+                       }
                        /* apply all_partitions option only at a main block device */
                        if (rule->partitions &&
                            strcmp(udev->dev->subsystem, "block") == 0 && udev->dev->kernel_number[0] == '\0') {
index a84b0de83760fdf57fb92dc2e5312d084e18eff0..da5ac3ea18c9a528d7517f8c663bf74f00053c88 100644 (file)
@@ -97,6 +97,7 @@ struct udev_rule {
        enum escape_type string_escape;
 
        unsigned int link_priority;
+       int event_timeout;
        unsigned int partitions;
        unsigned int last_rule:1,
                     run_ignore_error:1,
index b586df13241270ebafbb6e7f301410efc71afe3b..5119b7e84f4b94e441bfdc7424aed46e955ae184 100644 (file)
@@ -245,6 +245,7 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
 
        memset(buf, 0x00, sizeof(buf));
        rule = (struct udev_rule *) buf;
+       rule->event_timeout = -1;
        linepos = line;
        valid = 0;
 
@@ -604,6 +605,11 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
                                rule->link_priority = atoi(&pos[strlen("link_priority=")]);
                                dbg("link priority=%i\n", rule->link_priority);
                        }
+                       pos = strstr(value, "event_timeout=");
+                       if (pos != NULL) {
+                               rule->event_timeout = atoi(&pos[strlen("event_timeout=")]);
+                               dbg("event timout=%i\n", rule->event_timeout);
+                       }
                        pos = strstr(value, "string_escape=");
                        if (pos != NULL) {
                                pos = &pos[strlen("string_escape=")];
diff --git a/udevd.c b/udevd.c
index 66a410ec778b24100ca83b81893a550cb9041106..c895c1dc6a4a4384fb1d4280d0eb8772e1a0db50 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -115,7 +115,7 @@ static int udev_event_process(struct udevd_uevent_msg *msg)
        sigaction(SIGHUP, &act, NULL);
 
        /* trigger timeout to prevent hanging processes */
-       alarm(UDEV_ALARM_TIMEOUT);
+       alarm(UDEV_EVENT_TIMEOUT);
 
        /* reconstruct event environment from message */
        for (i = 0; msg->envp[i]; i++)
@@ -131,6 +131,10 @@ static int udev_event_process(struct udevd_uevent_msg *msg)
 
        retval = udev_device_event(&rules, udev);
 
+       /* rules may change/disable the timeout */
+       if (udev->event_timeout >= 0)
+               alarm(udev->event_timeout);
+
        /* run programs collected by RUN-key*/
        if (retval == 0 && !udev->ignore_device && udev_run)
                retval = udev_rules_run(udev);
index 8beba217eac5d3b83738faf5034238a90b89e046..d5e90b02c650c05beab2499eedb90fc6853f9263 100644 (file)
@@ -183,6 +183,10 @@ int udevtest(int argc, char *argv[], char *envp[])
 
        info("looking at device '%s' from subsystem '%s'\n", udev->dev->devpath, udev->dev->subsystem);
        retval = udev_device_event(&rules, udev);
+
+       if (udev->event_timeout >= 0)
+               info("custom event timeout: %i\n", udev->event_timeout);
+
        if (retval == 0 && !udev->ignore_device && udev_run) {
                struct name_entry *name_loop;