From: Kay Sievers Date: Tue, 25 Aug 2009 19:06:35 +0000 (+0200) Subject: assign errno for getgrnam_r()/getpwnam_r() X-Git-Tag: 174~815 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=4851d131d62936c531dc4044ce19a4c4a66ba0a1 assign errno for getgrnam_r()/getpwnam_r() On Mon, Aug 24, 2009 at 19:50, Lennart Poettering wrote: > One little comment here: on POSIX getrnam_r() doesn't touch > errno. Instead it returns the error value as return value. --- diff --git a/libudev/libudev-util-private.c b/libudev/libudev-util-private.c index 3641b3630..84dee559c 100644 --- a/libudev/libudev-util-private.c +++ b/libudev/libudev-util-private.c @@ -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) @@ -149,7 +148,7 @@ uid_t util_lookup_user(struct udev *udev, const char *user) gid_t util_lookup_group(struct udev *udev, const char *group) { char *endptr; - int buflen; + int buflen = sysconf(_SC_GETGR_R_SIZE_MAX); char *buf; struct group grbuf; struct group *gr; @@ -160,28 +159,23 @@ gid_t util_lookup_group(struct udev *udev, const char *group) gid = strtoul(group, &endptr, 10); if (endptr[0] == '\0') return gid; - - buflen = sysconf(_SC_GETGR_R_SIZE_MAX); - if (buflen < 0) - buflen = 1000; buf = NULL; gid = 0; for (;;) { buf = realloc(buf, buflen); if (!buf) break; - errno = 0; - getgrnam_r(group, &grbuf, buf, buflen, &gr); - if (gr != NULL) + errno = getgrnam_r(group, &grbuf, buf, buflen, &gr); + if (gr != NULL) { gid = gr->gr_gid; - else if (errno == ERANGE) { + } else if (errno == ERANGE) { buflen *= 2; continue; - } - else if (errno == 0 || errno == ENOENT || errno == ESRCH) + } else if (errno == 0 || errno == ENOENT || errno == ESRCH) { err(udev, "specified group '%s' unknown\n", group); - else + } else { err(udev, "error resolving group '%s': %m\n", group); + } break; } free(buf);