manpage: "If no matching record was found, these functions return 0 and store NULL in *result. In case of error, an error number is returned, and NULL is stored in *result." So we can distinguish function error from "no found" cases based on the return value. --- src/util/virutil.c | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/util/virutil.c b/src/util/virutil.c index 4605c78..9a4682e 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -2532,6 +2532,7 @@ virGetUserIDByName(const char *name, uid_t *uid) goto cleanup; } + errno = 0; while ((rc = getpwnam_r(name, &pwbuf, strbuf, strbuflen, &pw)) == ERANGE) { if (VIR_RESIZE_N(strbuf, strbuflen, strbuflen, strbuflen) < 0) { virReportOOMError(); @@ -2540,16 +2541,11 @@ virGetUserIDByName(const char *name, uid_t *uid) } if (!pw) { - 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' was not found: %s", - name, virStrerror(rc, buf, sizeof(buf))); - } - - ret = 1; + if (rc == 0) + ret = 1; + else + virReportSystemError(errno = rc, + _("cannot getpwnam_r(%s)"), name); goto cleanup; } @@ -2577,8 +2573,13 @@ virGetUserID(const char *user, uid_t *uid) user++; } else { int rc = virGetUserIDByName(user, uid); - if (rc <= 0) + if (rc > 0) { + virReportError(VIR_ERR_INVALID_ARG, + _("User '%s' was not found"), user); + return -1; + } else { return rc; + } } if (virStrToLong_ui(user, NULL, 10, &uint_uid) < 0 || @@ -2616,6 +2617,7 @@ virGetGroupIDByName(const char *name, gid_t *gid) goto cleanup; } + errno = 0; while ((rc = getgrnam_r(name, &grbuf, strbuf, strbuflen, &gr)) == ERANGE) { if (VIR_RESIZE_N(strbuf, strbuflen, strbuflen, strbuflen) < 0) { virReportOOMError(); @@ -2624,16 +2626,11 @@ virGetGroupIDByName(const char *name, gid_t *gid) } if (!gr) { - 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' was not found: %s", - name, virStrerror(rc, buf, sizeof(buf))); - } - - ret = 1; + if (rc == 0) + ret = 1; + else + virReportSystemError(errno = rc, + _("cannot getgrnam_r(%s)"), name); goto cleanup; } @@ -2661,8 +2658,13 @@ virGetGroupID(const char *group, gid_t *gid) group++; } else { int rc = virGetGroupIDByName(group, gid); - if (rc <= 0) + if (rc > 0) { + virReportError(VIR_ERR_INVALID_ARG, + _("Group '%s' was not found"), group); + return -1; + } else { return rc; + } } if (virStrToLong_ui(group, NULL, 10, &uint_gid) < 0 || -- 1.7.11.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list