diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2011-03-15 17:26:08 +0100 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2011-03-15 17:26:08 +0100 |
commit | 5f59fa0900a5c127ce1a25d8ba3176f166662f96 (patch) | |
tree | 5e1b317f3d31f58777b94fd5112b4b427a731b61 /udev | |
parent | 52d54f237d8b5380b0573242702606bf2ec5b7ab (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.c | 4 | ||||
-rw-r--r-- | udev/udev-node.c | 2 | ||||
-rw-r--r-- | udev/udev-rules.c | 2 | ||||
-rw-r--r-- | udev/udev-watch.c | 10 | ||||
-rw-r--r-- | udev/udev.xml | 2 | ||||
-rw-r--r-- | udev/udevadm-info.c | 65 | ||||
-rw-r--r-- | udev/udevadm.xml | 9 | ||||
-rw-r--r-- | udev/udevd.c | 98 |
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); |