about summary refs log tree commit diff
path: root/pkgs/os-specific/linux/udev/custom-rules.patch
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/os-specific/linux/udev/custom-rules.patch')
-rw-r--r--pkgs/os-specific/linux/udev/custom-rules.patch91
1 files changed, 91 insertions, 0 deletions
diff --git a/pkgs/os-specific/linux/udev/custom-rules.patch b/pkgs/os-specific/linux/udev/custom-rules.patch
new file mode 100644
index 0000000000000..647691acfb161
--- /dev/null
+++ b/pkgs/os-specific/linux/udev/custom-rules.patch
@@ -0,0 +1,91 @@
+commit c49ec33ba0f1a7f11b188913bb4895360ced67f8
+Author: Yury G. Kudryashov <urkud.urkud@gmail.com>
+Date:   Tue Aug 16 16:28:56 2011 +0400
+
+    Upstream considers presence of rules_dir=... in udev.conf as a very special case.
+    In particular, they disable /dev/.udev/*. Re-enable it.
+
+diff --git a/udev/udev-rules.c b/udev/udev-rules.c
+index 6bf2726..c1ae1f3 100644
+--- a/udev/udev-rules.c
++++ b/udev/udev-rules.c
+@@ -1812,6 +1812,7 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
+ 	struct udev_list file_list;
+ 	struct udev_list_entry *file_loop;
+ 	struct token end_token;
++	char runpathrules[UTIL_PATH_SIZE];
+ 
+ 	rules = calloc(1, sizeof(struct udev_rules));
+ 	if (rules == NULL)
+@@ -1854,22 +1855,21 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
+ 	rules->trie_nodes_cur = 1;
+ 
+ 	if (udev_get_rules_path(udev) == NULL) {
+-		char filename[UTIL_PATH_SIZE];
+ 
+ 		/* /lib/udev -- default/package rules */
+ 		add_matching_files(udev, &file_list, LIBEXECDIR "/rules.d", ".rules");
+ 
+ 		/* /etc/udev -- system-specific/user/admin rules */
+ 		add_matching_files(udev, &file_list, SYSCONFDIR "/udev/rules.d", ".rules");
+-
+-		/* /run/udev -- throw-away/temporary rules */
+-		util_strscpyl(filename, sizeof(filename), udev_get_run_path(udev), "/rules.d", NULL);
+-		add_matching_files(udev, &file_list, filename, ".rules");
+ 	} else {
+ 		/* custom rules files location for testing */
+ 		add_matching_files(udev, &file_list, udev_get_rules_path(udev), ".rules");
+ 	}
+ 
++	/* /run/udev -- throw-away/temporary rules */
++	util_strscpyl(runpathrules, sizeof(runpathrules), udev_get_run_path(udev), "/rules.d", NULL);
++	add_matching_files(udev, &file_list, runpathrules, ".rules");
++
+ 	/* add all filenames to the string buffer */
+ 	udev_list_entry_foreach(file_loop, udev_list_get_entry(&file_list)) {
+ 		const char *filename = udev_list_entry_get_value(file_loop);
+diff --git a/udev/udevd.c b/udev/udevd.c
+index f1a31e7..45d10b6 100644
+--- a/udev/udevd.c
++++ b/udev/udevd.c
+@@ -1198,6 +1198,8 @@ int main(int argc, char *argv[])
+ 	struct epoll_event ep_ctrl, ep_inotify, ep_signal, ep_netlink, ep_worker;
+ 	struct udev_ctrl_connection *ctrl_conn = NULL;
+ 	int rc = 1;
++	char filename[UTIL_PATH_SIZE];
++	struct stat statbuf;
+ 
+ 	udev = udev_new();
+ 	if (udev == NULL)
+@@ -1480,23 +1482,21 @@ int main(int argc, char *argv[])
+ 		inotify_add_watch(fd_inotify, udev_get_rules_path(udev),
+ 				  IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
+ 	} else {
+-		char filename[UTIL_PATH_SIZE];
+-		struct stat statbuf;
+ 
+ 		inotify_add_watch(fd_inotify, LIBEXECDIR "/rules.d",
+ 				  IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
+ 		inotify_add_watch(fd_inotify, SYSCONFDIR "/udev/rules.d",
+ 				  IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
++	}
+ 
+-		/* watch dynamic rules directory */
+-		util_strscpyl(filename, sizeof(filename), udev_get_run_path(udev), "/rules.d", NULL);
+-		if (stat(filename, &statbuf) != 0) {
+-			util_create_path(udev, filename);
+-			mkdir(filename, 0755);
+-		}
+-		inotify_add_watch(fd_inotify, filename,
+-				  IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
++	/* watch dynamic rules directory */
++	util_strscpyl(filename, sizeof(filename), udev_get_run_path(udev), "/rules.d", NULL);
++	if (stat(filename, &statbuf) != 0) {
++		util_create_path(udev, filename);
++		mkdir(filename, 0755);
+ 	}
++	inotify_add_watch(fd_inotify, filename,
++			  IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
+ 	udev_watch_restore(udev);
+ 
+ 	/* block and listen to all signals on signalfd */