summaryrefslogtreecommitdiff
path: root/udev
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2011-03-15 17:26:08 +0100
committerKay Sievers <kay.sievers@vrfy.org>2011-03-15 17:26:08 +0100
commit5f59fa0900a5c127ce1a25d8ba3176f166662f96 (patch)
tree5e1b317f3d31f58777b94fd5112b4b427a731b61 /udev
parent52d54f237d8b5380b0573242702606bf2ec5b7ab (diff)
move /dev/.udev/ to /dev/.run/udev/ and convert old udev database at udevd startup
Diffstat (limited to 'udev')
-rw-r--r--udev/udev-event.c4
-rw-r--r--udev/udev-node.c2
-rw-r--r--udev/udev-rules.c2
-rw-r--r--udev/udev-watch.c10
-rw-r--r--udev/udev.xml2
-rw-r--r--udev/udevadm-info.c65
-rw-r--r--udev/udevadm.xml9
-rw-r--r--udev/udevd.c98
8 files changed, 107 insertions, 85 deletions
diff --git a/udev/udev-event.c b/udev/udev-event.c
index 100a79c1e8..137ba36776 100644
--- a/udev/udev-event.c
+++ b/udev/udev-event.c
@@ -539,7 +539,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules)
return -1;
if (strcmp(udev_device_get_action(dev), "remove") == 0) {
- udev_device_read_db(dev);
+ udev_device_read_db(dev, NULL);
udev_device_delete_db(dev);
udev_device_tag_index(dev, NULL, false);
@@ -553,7 +553,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules)
} else {
event->dev_db = udev_device_new_from_syspath(event->udev, udev_device_get_syspath(dev));
if (event->dev_db != NULL) {
- udev_device_read_db(event->dev_db);
+ udev_device_read_db(event->dev_db, NULL);
udev_device_set_info_loaded(event->dev_db);
/* disable watch during event processing */
diff --git a/udev/udev-node.c b/udev/udev-node.c
index 0ceb1d5110..aaa2e32e65 100644
--- a/udev/udev-node.c
+++ b/udev/udev-node.c
@@ -292,7 +292,7 @@ static void link_update(struct udev_device *dev, const char *slink, bool add)
dbg(udev, "update symlink '%s' of '%s'\n", slink, udev_device_get_syspath(dev));
util_path_encode(&slink[strlen(udev_get_dev_path(udev))+1], name_enc, sizeof(name_enc));
- util_strscpyl(dirname, sizeof(dirname), udev_get_dev_path(udev), "/.udev/links/", name_enc, NULL);
+ util_strscpyl(dirname, sizeof(dirname), udev_get_dev_path(udev), "/.run/udev/links/", name_enc, NULL);
util_strscpyl(filename, sizeof(filename), dirname, "/", udev_device_get_id_filename(dev), NULL);
if (!add) {
diff --git a/udev/udev-rules.c b/udev/udev-rules.c
index 6b473c4c2e..4a5b8debca 100644
--- a/udev/udev-rules.c
+++ b/udev/udev-rules.c
@@ -1803,7 +1803,7 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
add_matching_files(udev, &file_list, SYSCONFDIR "/udev/rules.d", ".rules");
/* read dynamic/temporary rules */
- util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.udev/rules.d", NULL);
+ util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.run/udev/rules.d", NULL);
udev_list_init(&sort_list);
add_matching_files(udev, &sort_list, filename, ".rules");
diff --git a/udev/udev-watch.c b/udev/udev-watch.c
index f51a10dcab..47dca4c6e6 100644
--- a/udev/udev-watch.c
+++ b/udev/udev-watch.c
@@ -54,8 +54,8 @@ void udev_watch_restore(struct udev *udev)
if (inotify_fd < 0)
return;
- util_strscpyl(oldname, sizeof(oldname), udev_get_dev_path(udev), "/.udev/watch.old", NULL);
- util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.udev/watch", NULL);
+ util_strscpyl(oldname, sizeof(oldname), udev_get_dev_path(udev), "/.run/udev/watch.old", NULL);
+ util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.run/udev/watch", NULL);
if (rename(filename, oldname) == 0) {
DIR *dir;
struct dirent *ent;
@@ -118,7 +118,7 @@ void udev_watch_begin(struct udev *udev, struct udev_device *dev)
return;
}
- snprintf(filename, sizeof(filename), "%s/.udev/watch/%d", udev_get_dev_path(udev), wd);
+ snprintf(filename, sizeof(filename), "%s/.run/udev/watch/%d", udev_get_dev_path(udev), wd);
util_create_path(udev, filename);
unlink(filename);
symlink(udev_device_get_id_filename(dev), filename);
@@ -141,7 +141,7 @@ void udev_watch_end(struct udev *udev, struct udev_device *dev)
info(udev, "removing watch on '%s'\n", udev_device_get_devnode(dev));
inotify_rm_watch(inotify_fd, wd);
- snprintf(filename, sizeof(filename), "%s/.udev/watch/%d", udev_get_dev_path(udev), wd);
+ snprintf(filename, sizeof(filename), "%s/.run/udev/watch/%d", udev_get_dev_path(udev), wd);
unlink(filename);
udev_device_set_watch_handle(dev, -1);
@@ -158,7 +158,7 @@ struct udev_device *udev_watch_lookup(struct udev *udev, int wd)
if (inotify_fd < 0 || wd < 0)
return NULL;
- snprintf(filename, sizeof(filename), "%s/.udev/watch/%d", udev_get_dev_path(udev), wd);
+ snprintf(filename, sizeof(filename), "%s/.run/udev/watch/%d", udev_get_dev_path(udev), wd);
s = majmin;
l = util_strpcpy(&s, sizeof(majmin), udev_get_sys_path(udev));
len = readlink(filename, s, l);
diff --git a/udev/udev.xml b/udev/udev.xml
index 3ef4103325..452abc5c0d 100644
--- a/udev/udev.xml
+++ b/udev/udev.xml
@@ -73,7 +73,7 @@
<para>The udev rules are read from the files located in the
default rules directory <filename>/lib/udev/rules.d/</filename>,
the custom rules directory <filename>/etc/udev/rules.d/</filename>
- and the temporary rules directory <filename>/dev/.udev/rules.d/</filename>.
+ and the temporary rules directory <filename>/var/run/udev/rules.d/</filename>.
All rule files are sorted and processed in lexical order, regardless
in which of these directories they live. Files in
<filename>/etc/udev/rules.d/</filename> have precedence over files with
diff --git a/udev/udevadm-info.c b/udev/udevadm-info.c
index 187e74d50e..33d113c5b1 100644
--- a/udev/udevadm-info.c
+++ b/udev/udevadm-info.c
@@ -200,66 +200,6 @@ static int export_devices(struct udev *udev)
return 0;
}
-static int convert_db(struct udev *udev)
-{
- struct udev_enumerate *udev_enumerate;
- struct udev_list_entry *list_entry;
-
- udev_enumerate = udev_enumerate_new(udev);
- if (udev_enumerate == NULL)
- return -1;
- udev_enumerate_scan_devices(udev_enumerate);
- udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(udev_enumerate)) {
- struct udev_device *device;
-
- device = udev_device_new_from_syspath(udev, udev_list_entry_get_name(list_entry));
- if (device != NULL) {
- const char *id;
- struct stat stats;
- char to[UTIL_PATH_SIZE];
- char devpath[UTIL_PATH_SIZE];
- char from[UTIL_PATH_SIZE];
-
- id = udev_device_get_id_filename(device);
- if (id == NULL) {
- udev_device_unref(device);
- continue;
- }
- util_strscpyl(to, sizeof(to), udev_get_dev_path(udev), "/.udev/db/", id, NULL);
-
- /* find old database with $subsys:$sysname */
- util_strscpyl(from, sizeof(from), udev_get_dev_path(udev),
- "/.udev/db/", udev_device_get_subsystem(device), ":",
- udev_device_get_sysname(device), NULL);
- if (lstat(from, &stats) == 0) {
- if (lstat(to, &stats) == 0)
- unlink(from);
- else
- rename(from, to);
- }
-
- /* find old database with the encoded devpath */
- util_path_encode(udev_device_get_devpath(device), devpath, sizeof(devpath));
- util_strscpyl(from, sizeof(from), udev_get_dev_path(udev),
- "/.udev/db/", devpath, NULL);
- if (lstat(from, &stats) == 0) {
- if (lstat(to, &stats) == 0)
- unlink(from);
- else
- rename(from, to);
- }
-
- /* read the old database, and write out a new one */
- udev_device_read_db(device);
- udev_device_update_db(device);
-
- udev_device_unref(device);
- }
- }
- udev_enumerate_unref(udev_enumerate);
- return 0;
-}
-
int udevadm_info(struct udev *udev, int argc, char *argv[])
{
struct udev_device *device = NULL;
@@ -277,7 +217,6 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
{ "query", required_argument, NULL, 'q' },
{ "attribute-walk", no_argument, NULL, 'a' },
{ "export-db", no_argument, NULL, 'e' },
- { "convert-db", no_argument, NULL, 'C' },
{ "root", no_argument, NULL, 'r' },
{ "device-id-of-file", required_argument, NULL, 'd' },
{ "export", no_argument, NULL, 'x' },
@@ -402,9 +341,6 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
case 'e':
export_devices(udev);
goto exit;
- case 'C':
- convert_db(udev);
- goto exit;
case 'x':
export = true;
break;
@@ -431,7 +367,6 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
" --export export key/value pairs\n"
" --export-prefix export the key name with a prefix\n"
" --export-db export the content of the udev database\n"
- " --convert-db convert older version of database without a reboot\n"
" --help\n\n");
goto exit;
default:
diff --git a/udev/udevadm.xml b/udev/udevadm.xml
index 00f299fb73..cefd7763af 100644
--- a/udev/udevadm.xml
+++ b/udev/udevadm.xml
@@ -144,15 +144,6 @@
</listitem>
</varlistentry>
<varlistentry>
- <term><option>--convert-db</option></term>
- <listitem>
- <para>Convert the database of an earlier udev version to the current format. This
- is only useful on udev version upgrades, where the content of the old database might
- be needed for the running system, and it is not sufficient for it, to be re-created
- with the next bootup.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
<term><option>--version</option></term>
<listitem>
<para>Print version.</para>
diff --git a/udev/udevd.c b/udev/udevd.c
index aa2e3657f0..fe0e3c3929 100644
--- a/udev/udevd.c
+++ b/udev/udevd.c
@@ -971,6 +971,99 @@ static int mem_size_mb(void)
return memsize;
}
+static int convert_db(struct udev *udev)
+{
+ char filename[UTIL_PATH_SIZE];
+ FILE *f;
+ struct udev_enumerate *udev_enumerate;
+ struct udev_list_entry *list_entry;
+
+ /* current database */
+ util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.run/udev/db3", NULL);
+ if (access(filename, F_OK) >= 0)
+ return 0;
+
+ /* make sure we do not get here again */
+ util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.run/udev/db3/", NULL);
+ util_create_path(udev, filename);
+
+ /* old database */
+ util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.udev/db", NULL);
+ if (access(filename, F_OK) < 0)
+ return 0;
+
+ f = fopen("/dev/kmsg", "w");
+ if (f != NULL) {
+ fprintf(f, "<6>udev[%u]: converting old udev database\n", getpid());
+ fclose(f);
+ }
+
+ udev_enumerate = udev_enumerate_new(udev);
+ if (udev_enumerate == NULL)
+ return -1;
+ udev_enumerate_scan_devices(udev_enumerate);
+ udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(udev_enumerate)) {
+ struct udev_device *device;
+
+ device = udev_device_new_from_syspath(udev, udev_list_entry_get_name(list_entry));
+ if (device == NULL)
+ continue;
+
+ /* try to find the old database for devices without a current one */
+ if (udev_device_read_db(device, NULL) < 0) {
+ bool have_db;
+ const char *id;
+ struct stat stats;
+ char devpath[UTIL_PATH_SIZE];
+ char from[UTIL_PATH_SIZE];
+
+ have_db = false;
+
+ /* find database in old location */
+ id = udev_device_get_id_filename(device);
+ util_strscpyl(from, sizeof(from), udev_get_dev_path(udev), "/.udev/db/", id, NULL);
+ if (lstat(from, &stats) == 0) {
+ if (!have_db) {
+ udev_device_read_db(device, from);
+ have_db = true;
+ }
+ unlink(from);
+ }
+
+ /* find old database with $subsys:$sysname name */
+ util_strscpyl(from, sizeof(from), udev_get_dev_path(udev),
+ "/.udev/db/", udev_device_get_subsystem(device), ":",
+ udev_device_get_sysname(device), NULL);
+ if (lstat(from, &stats) == 0) {
+ if (!have_db) {
+ udev_device_read_db(device, from);
+ have_db = true;
+ }
+ unlink(from);
+ }
+
+ /* find old database with the encoded devpath name */
+ util_path_encode(udev_device_get_devpath(device), devpath, sizeof(devpath));
+ util_strscpyl(from, sizeof(from), udev_get_dev_path(udev),
+ "/.udev/db/", devpath, NULL);
+ if (lstat(from, &stats) == 0) {
+ if (!have_db) {
+ udev_device_read_db(device, from);
+ have_db = true;
+ }
+ unlink(from);
+ }
+
+ /* write out new database */
+ if (have_db)
+ udev_device_update_db(device);
+ }
+ udev_device_unref(device);
+ }
+ udev_enumerate_unref(udev_enumerate);
+ return 0;
+}
+
int main(int argc, char *argv[])
{
struct udev *udev;
@@ -1159,7 +1252,7 @@ int main(int argc, char *argv[])
IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
/* watch dynamic rules directory */
- util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.udev/rules.d", NULL);
+ util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.run/udev/rules.d", NULL);
if (stat(filename, &statbuf) != 0) {
util_create_path(udev, filename);
udev_selinux_setfscreatecon(udev, filename, S_IFDIR|0755);
@@ -1203,6 +1296,9 @@ int main(int argc, char *argv[])
goto exit;
}
+ /* if needed, convert old database from earlier udev version */
+ convert_db(udev);
+
if (!debug) {
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);