diff -u udev-096.orig/udev.c udev-096/udev.c --- udev-096.orig/udev.c 2006-08-05 00:16:20.000000000 +0100 +++ udev-096/udev.c 2006-08-05 00:17:11.000000000 +0100 @@ -128,7 +128,7 @@ } sysfs_init(); - udev_rules_init(&rules, 0); + udev_rules_init(&rules); dev = sysfs_device_get(devpath); if (dev == NULL) { diff -u udev-096.orig/udevd.c udev-096/udevd.c --- udev-096.orig/udevd.c 2006-08-05 00:16:20.000000000 +0100 +++ udev-096/udevd.c 2006-08-05 00:17:11.000000000 +0100 @@ -908,7 +908,7 @@ /* parse the rules and keep it in memory */ sysfs_init(); - udev_rules_init(&rules, 1); + udev_rules_init(&rules); export_initial_seqnum(); @@ -1088,7 +1088,7 @@ if (reload_config) { reload_config = 0; udev_rules_cleanup(&rules); - udev_rules_init(&rules, 1); + udev_rules_init(&rules); } /* forked child has returned */ diff -u udev-096.orig/udev_device.c udev-096/udev_device.c --- udev-096.orig/udev_device.c 2006-08-05 00:16:20.000000000 +0100 +++ udev-096/udev_device.c 2006-08-05 00:17:11.000000000 +0100 @@ -162,6 +162,27 @@ goto exit; } + /* If we don't have owner and group id's, look them up now and + store them back in the rule for other devices. */ + unsigned long id; + char *endptr; + uid_t uid = 0; + gid_t gid = 0; + + id = strtoul(udev->owner, &endptr, 10); + if (endptr[0] != '\0') { + if (strcmp(udev->owner, "root") != 0) + uid = lookup_user(udev->owner); + sprintf(udev->owner, "%u", (unsigned int) uid); + } + + id = strtoul(udev->group, &endptr, 10); + if (endptr[0] != '\0') { + if (strcmp(udev->group, "root") != 0) + gid = lookup_group(udev->group); + sprintf(udev->group, "%u", (unsigned int) gid); + } + /* read current database entry, we may want to cleanup symlinks */ udev_old = udev_device_init(); if (udev_old != NULL) { diff -u udev-096.orig/udev_rules.h udev-096/udev_rules.h --- udev-096.orig/udev_rules.h 2006-08-05 00:16:20.000000000 +0100 +++ udev-096/udev_rules.h 2006-08-05 00:17:11.000000000 +0100 @@ -98,10 +98,9 @@ char *buf; size_t bufsize; size_t current; - int resolve_names; }; -extern int udev_rules_init(struct udev_rules *rules, int resolve_names); +extern int udev_rules_init(struct udev_rules *rules); extern void udev_rules_cleanup(struct udev_rules *rules); extern void udev_rules_iter_init(struct udev_rules *rules); diff -u udev-096.orig/udev_rules_parse.c udev-096/udev_rules_parse.c --- udev-096.orig/udev_rules_parse.c 2006-08-05 00:16:20.000000000 +0100 +++ udev-096/udev_rules_parse.c 2006-08-05 00:17:11.000000000 +0100 @@ -473,38 +473,12 @@ if (strcasecmp(key, "OWNER") == 0) { valid = 1; - if (rules->resolve_names && (!strchr(value, '$') && !strchr(value, '%'))) { - char *endptr; - strtoul(value, &endptr, 10); - if (endptr[0] != '\0') { - char owner[32]; - uid_t uid = lookup_user(value); - dbg("replacing username='%s' by id=%i", value, uid); - sprintf(owner, "%u", (unsigned int) uid); - add_rule_key(rule, &rule->owner, operation, owner); - continue; - } - } - add_rule_key(rule, &rule->owner, operation, value); continue; } if (strcasecmp(key, "GROUP") == 0) { valid = 1; - if (rules->resolve_names && (!strchr(value, '$') && !strchr(value, '%'))) { - char *endptr; - strtoul(value, &endptr, 10); - if (endptr[0] != '\0') { - char group[32]; - gid_t gid = lookup_group(value); - dbg("replacing groupname='%s' by id=%i", value, gid); - sprintf(group, "%u", (unsigned int) gid); - add_rule_key(rule, &rule->group, operation, group); - continue; - } - } - add_rule_key(rule, &rule->group, operation, value); continue; } @@ -637,13 +611,12 @@ return retval; } -int udev_rules_init(struct udev_rules *rules, int resolve_names) +int udev_rules_init(struct udev_rules *rules) { struct stat stats; int retval; memset(rules, 0x00, sizeof(struct udev_rules)); - rules->resolve_names = resolve_names; /* parse rules file or all matching files in directory */ if (stat(udev_rules_filename, &stats) != 0) diff -u udev-096.orig/udevstart.c udev-096/udevstart.c --- udev-096.orig/udevstart.c 2006-08-05 00:16:20.000000000 +0100 +++ udev-096/udevstart.c 2006-08-05 00:17:11.000000000 +0100 @@ -361,7 +361,7 @@ alarm(UDEV_ALARM_TIMEOUT); sysfs_init(); - udev_rules_init(&rules, 1); + udev_rules_init(&rules); udev_scan_class(&device_list); udev_scan_block(&device_list); diff -u udev-096.orig/udevtest.c udev-096/udevtest.c --- udev-096.orig/udevtest.c 2006-08-05 00:16:20.000000000 +0100 +++ udev-096/udevtest.c 2006-08-05 00:17:11.000000000 +0100 @@ -83,7 +83,7 @@ devpath = argv[1]; sysfs_init(); - udev_rules_init(&rules, 0); + udev_rules_init(&rules); dev = sysfs_device_get(devpath); if (dev == NULL) {