Wietse Venema: > Kiss G?bor: > > Feb 16 11:39:56 MYHOST postfix/local[22389]: warning: error looking up > > passwd info for +bar: No such file or directory > > That is a bug in your system library implementation: it returns an > error (ENOENT) for an entry that does not exist. > > API: > int getpwnam_r(const char *name, struct passwd *pwd, > char *buf, size_t buflen, struct passwd **result); > > OpenGroup standard: > The getpwnam_r() function shall return zero on success or if > the requested entry was not found and no error has occurred. > If an error has occurred, an error number shall be returned to > indicate the error. > > What is the back-end for your UNIX system account lookups: is this > LDAP, files, or something else? This weekend there was a thread > about getpwnam_r() not returning errors when an LDAP server was > down. Now we have getpwnam_r() returing errors for non-error lookups. > If this is the same LDAP driver then it badly needs fixing.
Below is a small C program. Save as getpwnam_r_test.c, build with "make getpwnam_r_test", and run as "./getpwnam_r_test username". This is the correct result: $ ./getpwnam_r_test wietse wietse: no error: uid=304252 (Wietse Venema) $ ./getpwnam_r_test +bar +bar: no error: not found $ ./getpwnam_r_test doesnotexist doesnotexist: no error: not found $ ./getpwnam_r_test '' : no error: not found As you see, there is no error for non-existent users, even if the name is spelled in a funny manner. Wietse If you're reading this with a web browser then it may look funny. #include <errno.h> #include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> int main(int argc, char **argv) { char buf[BUFSIZ]; struct passwd pwbuf; struct passwd *pwd; int err; while (--argc && *++argv) { err = getpwnam_r(*argv, &pwbuf, buf, sizeof(buf), &pwd); if (err != 0) { printf("%s: error: %s\n", *argv, strerror(errno)); } else if (pwd == 0) { printf("%s: no error: not found\n", *argv); } else { printf("%s: no error: uid=%ld (%s)\n", *argv, (long)pwd->pw_uid, pwd->pw_gecos); } } exit(0); }