chiark / gitweb /
doc: udevadm test *does* create nodes and links these days
[elogind.git] / libudev / libudev-util-private.c
index f7daa9460beabeca74c08a80c548f1b5b129365a..84dee559c40cafdb4c345786c8d6d61dee88a4fc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * libudev - interface to udev device information
  *
- * Copyright (C) 2004-2009 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2003-2009 Kay Sievers <kay.sievers@vrfy.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -96,7 +96,7 @@ int util_delete_path(struct udev *udev, const char *path)
 }
 
 /* Reset permissions on the device node, before unlinking it to make sure,
- * that permisions of possible hard links will be removed too.
+ * that permissions of possible hard links will be removed too.
  */
 int util_unlink_secure(struct udev *udev, const char *filename)
 {
@@ -135,8 +135,7 @@ uid_t util_lookup_user(struct udev *udev, const char *user)
        if (endptr[0] == '\0')
                return uid;
 
-       errno = 0;
-       getpwnam_r(user, &pwbuf, buf, buflen, &pw);
+       errno = getpwnam_r(user, &pwbuf, buf, buflen, &pw);
        if (pw != NULL)
                return pw->pw_uid;
        if (errno == 0 || errno == ENOENT || errno == ESRCH)
@@ -150,7 +149,7 @@ gid_t util_lookup_group(struct udev *udev, const char *group)
 {
        char *endptr;
        int buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
-       char buf[buflen];
+       char *buf;
        struct group grbuf;
        struct group *gr;
        gid_t gid = 0;
@@ -160,16 +159,27 @@ gid_t util_lookup_group(struct udev *udev, const char *group)
        gid = strtoul(group, &endptr, 10);
        if (endptr[0] == '\0')
                return gid;
-
-       errno = 0;
-       getgrnam_r(group, &grbuf, buf, buflen, &gr);
-       if (gr != NULL)
-               return gr->gr_gid;
-       if (errno == 0 || errno == ENOENT || errno == ESRCH)
-               err(udev, "specified group '%s' unknown\n", group);
-       else
-               err(udev, "error resolving group '%s': %m\n", group);
-       return 0;
+       buf = NULL;
+       gid = 0;
+       for (;;) {
+               buf = realloc(buf, buflen);
+               if (!buf)
+                       break;
+               errno = getgrnam_r(group, &grbuf, buf, buflen, &gr);
+               if (gr != NULL) {
+                       gid = gr->gr_gid;
+               } else if (errno == ERANGE) {
+                       buflen *= 2;
+                       continue;
+               } else if (errno == 0 || errno == ENOENT || errno == ESRCH) {
+                       err(udev, "specified group '%s' unknown\n", group);
+               } else {
+                       err(udev, "error resolving group '%s': %m\n", group);
+               }
+               break;
+       }
+       free(buf);
+       return gid;
 }
 
 /* handle "[<SUBSYSTEM>/<KERNEL>]<attribute>" format */
@@ -326,7 +336,7 @@ int util_run_program(struct udev *udev, const char *command, char **envp,
                }
                execve(argv[0], argv, envp);
                if (errno == ENOENT || errno == ENOTDIR) {
-                       /* may be on a filesytem which is not mounted right now */
+                       /* may be on a filesystem which is not mounted right now */
                        info(udev, "program '%s' not found\n", argv[0]);
                } else {
                        /* other problems */