[libvirt] [PATCH] util: rework error reporting in virGet(User|Group)IDByName
Michal Privoznik
mprivozn at redhat.com
Wed Dec 12 13:05:48 UTC 2012
On 11.12.2012 21:30, Peter Krempa wrote:
> 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 | 50 ++++++++++++++++++--------------------------------
> 1 file changed, 18 insertions(+), 32 deletions(-)
>
> diff --git a/src/util/util.c b/src/util/util.c
> index 3f244f5..27af3c6 100644
> --- a/src/util/util.c
> +++ b/src/util/util.c
> @@ -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;
> }
>
ACK
I think this is the version we were looking for.
Michal
More information about the libvir-list
mailing list