For most NSS calls it is documented that they return NULL + errno=0 when
an entry is not found. However, in reality it appears to be common to
return NULL + errno=ENOENT, instead. Handle that correctly, and don't
consider ENOENT a systematic error.
p = getpwuid(uid);
if (p)
return 0;
p = getpwuid(uid);
if (p)
return 0;
+ if (!IN_SET(errno, 0, ENOENT))
return -errno;
errno = 0;
return -errno;
errno = 0;
if (g) {
if (!streq(g->gr_name, name))
return 0;
if (g) {
if (!streq(g->gr_name, name))
return 0;
+ } else if (!IN_SET(errno, 0, ENOENT))
i->description = strdup(p->pw_gecos);
return 0;
}
i->description = strdup(p->pw_gecos);
return 0;
}
+ if (!IN_SET(errno, 0, ENOENT)) {
log_error("Failed to check if user %s already exists: %m", i->name);
return -errno;
}
log_error("Failed to check if user %s already exists: %m", i->name);
return -errno;
}
log_error("User %s already exists in shadow database, but not in user database.", i->name);
return -EBADMSG;
}
log_error("User %s already exists in shadow database, but not in user database.", i->name);
return -EBADMSG;
}
+ if (!IN_SET(errno, 0, ENOENT)) {
log_error("Failed to check if user %s already exists in shadow database: %m", i->name);
return -errno;
}
log_error("Failed to check if user %s already exists in shadow database: %m", i->name);
return -errno;
}
g = getgrgid(gid);
if (g)
return 0;
g = getgrgid(gid);
if (g)
return 0;
+ if (!IN_SET(errno, 0, ENOENT))
return -errno;
errno = 0;
p = getpwuid((uid_t) gid);
if (p)
return 0;
return -errno;
errno = 0;
p = getpwuid((uid_t) gid);
if (p)
return 0;
+ if (!IN_SET(errno, 0, ENOENT))
i->gid_set = true;
return 0;
}
i->gid_set = true;
return 0;
}
+ if (!IN_SET(errno, 0, ENOENT)) {
log_error("Failed to check if group %s already exists: %m", i->name);
return -errno;
}
log_error("Failed to check if group %s already exists: %m", i->name);
return -errno;
}