]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: rework error reporting in virGet(User|Group)IDByName
authorPeter Krempa <pkrempa@redhat.com>
Tue, 11 Dec 2012 20:26:52 +0000 (21:26 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 12 Dec 2012 13:06:59 +0000 (14:06 +0100)
This patch gets rid of the undeterministic error reporting code done on
return values of get(pw|gr)nam_r. With this patch, if the group record
is not returned by the corresponding function this error is not
considered fatal even if errno != 0. The error is logged in such case.

src/util/util.c

index 3f244f595c5cd7b49afa37b935c6a4cfb90ea24c..27af3c6713f7d54d1e9ff05688b61f6430bf6866 100644 (file)
@@ -2530,23 +2530,16 @@ virGetUserIDByName(const char *name, uid_t *uid)
         }
     }
 
-    if (rc != 0) {
-       /* We explicitly test for the known error values returned by
-        * getpwnam_r as the manpage says:
-        * ERRORS
-        *   0 or ENOENT or ESRCH or EBADF or EPERM or ...
-        *         The given name or uid was not found.
-        */
-       if ((rc == EINTR) || (rc == EIO) || (rc == EMFILE) ||
-           (rc == ENFILE) || (rc == ENOMEM)) {
-           virReportSystemError(rc, _("Failed to get user record for name '%s'"),
-                                name);
-           goto cleanup;
-       }
-    }
-
     if (!pw) {
-        VIR_DEBUG("User record for user '%s' does not exist", name);
+        if (rc != 0) {
+            char buf[1024];
+            /* log the possible error from getpwnam_r. Unfortunately error
+             * reporting from this function is bad and we can't really
+             * rely on it, so we just report that the user wasn't found */
+            VIR_WARN("User record for user '%s' does was not found: %s",
+                     name, virStrerror(rc, buf, sizeof(buf)));
+        }
+
         ret = 1;
         goto cleanup;
     }
@@ -2621,23 +2614,16 @@ virGetGroupIDByName(const char *name, gid_t *gid)
         }
     }
 
-    if (rc != 0) {
-       /* We explicitly test for the known error values returned by
-        * getgrnam_r as the manpage says:
-        * ERRORS
-        *   0 or ENOENT or ESRCH or EBADF or EPERM or ...
-        *         The given name or gid was not found.
-        */
-       if ((rc == EINTR) || (rc == EIO) || (rc == EMFILE) ||
-           (rc == ENFILE) || (rc == ENOMEM)) {
-           virReportSystemError(rc, _("Failed to get group record for name '%s'"),
-                                name);
-           goto cleanup;
-       }
-    }
-
     if (!gr) {
-        VIR_DEBUG("Group record for group '%s' does not exist", name);
+        if (rc != 0) {
+            char buf[1024];
+            /* log the possible error from getgrnam_r. Unfortunately error
+             * reporting from this function is bad and we can't really
+             * rely on it, so we just report that the user wasn't found */
+            VIR_WARN("Group record for user '%s' does was not found: %s",
+                     name, virStrerror(rc, buf, sizeof(buf)));
+        }
+
         ret = 1;
         goto cleanup;
     }