chiark / gitweb /
Allow user and group lookup to be disabled.
authorScott James Remnant <scott@ubuntu.com>
Tue, 20 Jan 2009 21:33:02 +0000 (21:33 +0000)
committerScott James Remnant <scott@netsplit.com>
Tue, 20 Jan 2009 21:33:02 +0000 (21:33 +0000)
In certain cut-down situations such as an installer or inside the
initramfs, we simply don't have any kind of name service.  While we
could use rules without OWNER or GROUP, it's better to have the same
rules as a full system and have udevd ignore those parts of the rules.

Adds a --resolve-names=never switch to udevd that has this effect.

NEWS
udev/udev-rules.c
udev/udevd.c
udev/udevd.xml

diff --git a/NEWS b/NEWS
index bcfd773c6fdaba5b25f252c03ad4825ba9c9d973..52bfa6a9910cd127b407b0ebac629e8f6dd9d974 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,9 @@ Bugfixes.
 The udevadm test command has no longer a --force option, nodes and symlinks
 are always updated with a test run now.
 
+The udevd daemon can be started with --resolve-names=never to avoid all user
+and group lookups (e.g. in cut-down systems).
+
 udev 136
 ========
 Bugfixes.
index 2d120dd92762406108855939aa14d3ca5799860b..ccf1eaaf8f43b5027038780be1975dce2349148c 100644 (file)
@@ -1454,10 +1454,10 @@ static int add_rule(struct udev_rules *rules, char *line,
                        uid = strtoul(value, &endptr, 10);
                        if (endptr[0] == '\0') {
                                rule_add_key(&rule_tmp, TK_A_OWNER_ID, op, NULL, &uid);
-                       } else if (rules->resolve_names && strchr("$%", value[0]) == NULL) {
+                       } else if ((rules->resolve_names > 0) && strchr("$%", value[0]) == NULL) {
                                uid = add_uid(rules, value);
                                rule_add_key(&rule_tmp, TK_A_OWNER_ID, op, NULL, &uid);
-                       } else {
+                       } else if (rules->resolve_names == 0) {
                                rule_add_key(&rule_tmp, TK_A_OWNER, op, value, NULL);
                        }
                        rule_tmp.rule.rule.flags = 1;
@@ -1472,10 +1472,10 @@ static int add_rule(struct udev_rules *rules, char *line,
                        gid = strtoul(value, &endptr, 10);
                        if (endptr[0] == '\0') {
                                rule_add_key(&rule_tmp, TK_A_GROUP_ID, op, NULL, &gid);
-                       } else if (rules->resolve_names && strchr("$%", value[0]) == NULL) {
+                       } else if ((rules->resolve_names > 0) && strchr("$%", value[0]) == NULL) {
                                gid = add_gid(rules, value);
                                rule_add_key(&rule_tmp, TK_A_GROUP_ID, op, NULL, &gid);
-                       } else {
+                       } else if (rules->resolve_names == 0) {
                                rule_add_key(&rule_tmp, TK_A_GROUP, op, value, NULL);
                        }
                        rule_tmp.rule.rule.flags = 1;
index 993964d23d39f2fb1485dc8c8725af7e4202df86..9a8d7918000b5df7bdb3e83e00c14caedf63085f 100644 (file)
@@ -639,12 +639,14 @@ int main(int argc, char *argv[])
        fd_set readfds;
        const char *value;
        int daemonize = 0;
+       int resolve_names = 1;
        static const struct option options[] = {
                { "daemon", no_argument, NULL, 'd' },
                { "debug-trace", no_argument, NULL, 't' },
                { "debug", no_argument, NULL, 'D' },
                { "help", no_argument, NULL, 'h' },
                { "version", no_argument, NULL, 'V' },
+               { "resolve-names", required_argument, NULL, 'N' },
                {}
        };
        int rc = 1;
@@ -678,8 +680,19 @@ int main(int argc, char *argv[])
                        if (udev_get_log_priority(udev) < LOG_INFO)
                                udev_set_log_priority(udev, LOG_INFO);
                        break;
+               case 'N':
+                       if (strcmp (optarg, "early") == 0) {
+                               resolve_names = 1;
+                       } else if (strcmp (optarg, "never") == 0) {
+                               resolve_names = -1;
+                       } else {
+                               fprintf(stderr, "resolve-names must be early or never\n");
+                               err(udev, "resolve-names must be early or never\n");
+                               goto exit;
+                       }
+                       break;
                case 'h':
-                       printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--debug] [--version]\n");
+                       printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--debug] [--resolve-names=early|never] [--version]\n");
                        goto exit;
                case 'V':
                        printf("%s\n", VERSION);
@@ -759,7 +772,7 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
-       rules = udev_rules_new(udev, 1);
+       rules = udev_rules_new(udev, resolve_names);
        if (rules == NULL) {
                err(udev, "error reading rules\n");
                goto exit;
@@ -957,7 +970,7 @@ int main(int argc, char *argv[])
                        struct udev_rules *rules_new;
 
                        reload_config = 0;
-                       rules_new = udev_rules_new(udev, 1);
+                       rules_new = udev_rules_new(udev, resolve_names);
                        if (rules_new != NULL) {
                                udev_rules_unref(rules);
                                rules = rules_new;
index b5726b8b032c2521aa1db01423361c1a6726b23c..010411c7816a062914c41d82cab04039a4eae8e3 100644 (file)
@@ -29,6 +29,7 @@
           <arg><option>--debug-trace</option></arg>
           <arg><option>--debug</option></arg>
           <arg><option>--version</option></arg>
+          <arg><option>--resolve-names=early|never</option></arg>
           <arg><option>--help</option></arg>
         </cmdsynopsis>
       </refsynopsisdiv>
               <para>Print debug messages to stderr.</para>
             </listitem>
           </varlistentry>
+          <varlistentry>
+            <term><option>--resolve-names</option></term>
+            <listitem>
+              <para>Specify when udevd should resolve names of users and groups.
+              When set to <option>early</option> (the default) names will be
+              resolved when the rules are parsed.
+              When set to <option>never</option> names will never be resolved
+              and all devices will be owned by root.</para>
+            </listitem>
+          </varlistentry>
           <varlistentry>
             <term><option>--version</option></term>
             <listitem>