chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] udevd: don't delay events with TIMEOUT in the environment
[elogind.git]
/
udevd.c
diff --git
a/udevd.c
b/udevd.c
index 1376cf05c777a4a331f13c0d758deff240d895de..6e27c8a0d141779edfe2f8e3420c0d4b927a1bdf 100644
(file)
--- a/
udevd.c
+++ b/
udevd.c
@@
-21,7
+21,6
@@
*/
#include <stddef.h>
*/
#include <stddef.h>
-#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
@@
-31,6
+30,8
@@
#include <ctype.h>
#include <dirent.h>
#include <fcntl.h>
#include <ctype.h>
#include <dirent.h>
#include <fcntl.h>
+#include <sys/select.h>
+#include <sys/wait.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
@@
-39,6
+40,7
@@
#include <sys/stat.h>
#include "list.h"
#include <sys/stat.h>
#include "list.h"
+#include "udev_libc_wrapper.h"
#include "udev.h"
#include "udev_version.h"
#include "udev_utils.h"
#include "udev.h"
#include "udev_version.h"
#include "udev_utils.h"
@@
-111,6
+113,14
@@
static void msg_queue_insert(struct hotplug_msg *msg)
return;
}
return;
}
+ /* don't delay messages with timeout set */
+ if (msg->timeout) {
+ dbg("move seq %llu with timeout %u to exec queue", msg->seqnum, msg->timeout);
+ list_add(&msg->node, &exec_list);
+ run_exec_q = 1;
+ return;
+ }
+
/* sort message by sequence number into list */
list_for_each_entry_reverse(loop_msg, &msg_list, node) {
if (loop_msg->seqnum < msg->seqnum)
/* sort message by sequence number into list */
list_for_each_entry_reverse(loop_msg, &msg_list, node) {
if (loop_msg->seqnum < msg->seqnum)
@@
-262,7
+272,7
@@
static int compare_devpath(const char *running, const char *waiting)
{
int i;
{
int i;
- for (i = 0; i <
DEV
PATH_SIZE; i++) {
+ for (i = 0; i < PATH_SIZE; i++) {
/* identical device event found */
if (running[i] == '\0' && waiting[i] == '\0')
return 1;
/* identical device event found */
if (running[i] == '\0' && waiting[i] == '\0')
return 1;
@@
-291,6
+301,10
@@
static struct hotplug_msg *running_with_devpath(struct hotplug_msg *msg)
if (msg->devpath == NULL)
return NULL;
if (msg->devpath == NULL)
return NULL;
+ /* skip any events with a timeout set */
+ if (msg->timeout)
+ return NULL;
+
list_for_each_entry(loop_msg, &running_list, node) {
if (loop_msg->devpath == NULL)
continue;
list_for_each_entry(loop_msg, &running_list, node) {
if (loop_msg->devpath == NULL)
continue;
@@
-488,6
+502,9
@@
static struct hotplug_msg *get_udevsend_msg(void)
if (strncmp(key, "PHYSDEVPATH=", 12) == 0)
msg->physdevpath = &key[12];
if (strncmp(key, "PHYSDEVPATH=", 12) == 0)
msg->physdevpath = &key[12];
+
+ if (strncmp(key, "TIMEOUT=", 8) == 0)
+ msg->timeout = strtoull(&key[8], NULL, 10);
}
msg->envp[i++] = "UDEVD_EVENT=1";
msg->envp[i] = NULL;
}
msg->envp[i++] = "UDEVD_EVENT=1";
msg->envp[i] = NULL;