diff options
author | Michael Stone <michael@laptop.org> | 2008-07-08 06:57:25 (GMT) |
---|---|---|
committer | Michael Stone <michael@laptop.org> | 2008-07-08 06:57:25 (GMT) |
commit | 7b2d755854103a220ea0b3f82082505a3f9ad835 (patch) | |
tree | ef1cac1705f073c414e5031c0c8f0a7708e38e34 | |
parent | 54bd6accb06fdb5227e3ec789d7fcc44dc85c458 (diff) |
Minor fixes.
-rw-r--r-- | cgen.h | 3 | ||||
-rw-r--r-- | nss-rainbow.c | 34 |
2 files changed, 24 insertions, 13 deletions
@@ -1,7 +1,8 @@ #define STATIC_ASSERT(expr) extern char __static_assertion_failed [(expr) ? 1 : -1] #define SAVE_ERR(EXPR) {int __errno_save = errno; EXPR; errno = __errno_save;} #define __XSTRING(X) __STRING(X) -#define PERROR(msg) {int __errno_cache = errno; dprintf(2, "%s|%d| %s: %s\nError %d: %s\n", __FILE__, __LINE__, __func__, msg, __errno_cache, strerror(__errno_cache));} +/* #define PERROR(msg) {int __errno_cache = errno; dprintf(2, "%s|%d| %s: %s\nError %d: %s\n", __FILE__, __LINE__, __func__, msg, __errno_cache, strerror(__errno_cache));} */ +#define PERROR(msg) #define CHK(EXPR, MSG, ERR_LABEL) {if(EXPR) { PERROR(MSG); goto ERR_LABEL;}} #define LET(LETEXPR, CONDEXPR, MSG, ERR_LABEL) LETEXPR; if (CONDEXPR) { PERROR(MSG); goto ERR_LABEL;} #define TST(EXPR, ERRNO, MSG, ERR_LABEL) {if (EXPR) {errno = ERRNO; PERROR(MSG); goto ERR_LABEL;}} diff --git a/nss-rainbow.c b/nss-rainbow.c index 5f5ef5e..ae7bb8c 100644 --- a/nss-rainbow.c +++ b/nss-rainbow.c @@ -210,7 +210,6 @@ struct gid_list { gid_t gid; }; -size_t g_gids_cnt; struct gid_list g_gids; struct gid_list* g_gid; @@ -258,7 +257,6 @@ uid_to_gid_filter(const struct dirent* d) { list_add_tail(&(gid_iter->list), &g_gids.list); g_gid = gid_iter; } - g_gids_cnt++; /* gid_iter now points to the appropriate gid_list node. * There's no way that we could already have our current (uid, gid) row. @@ -277,7 +275,6 @@ enum nss_status _nss_rainbow_setgrent(void) { struct dirent** uids; INIT_LIST_HEAD(&g_gids.list); INIT_LIST_HEAD(&g_gids.uids.list); - g_gids_cnt = 0; g_gid = &g_gids; CHK(scandir(SPOOL "/uid_to_gid", &uids, uid_to_gid_filter, versionsort) == -1, "Unable to extract uid->gids links from $RAINBOW_SPOOL.", out_error_spool); @@ -355,13 +352,12 @@ out_error_errno: enum nss_status _nss_rainbow_getgrent_r(struct group *result, char *buf, size_t buflen, int *errnop) { - if (!g_gids_cnt) + if (&g_gid->list == &g_gids.list) return NSS_STATUS_UNAVAIL; CHK(fill_group(result, buf, buflen, errnop, g_gid) == 1, "Unable to fill in group struct.", out_error_errno); g_gid = list_entry(g_gid->list.next, struct gid_list, list); - --g_gids_cnt; return NSS_STATUS_SUCCESS; @@ -373,30 +369,44 @@ out_error_errno: enum nss_status _nss_rainbow_getgrgid_r(gid_t gid, struct group *result, char *buf, size_t buflen, int *errnop) { + enum nss_status ret; if (gid < 10000 || gid > 60000) return NSS_STATUS_NOTFOUND; + /* XXX CHECK RETURN CODE */ + _nss_rainbow_setgrent(); + /* look up group data */ - struct gid_list* gid_iter; + struct gid_list* gid_iter = NULL; list_for_each_entry(gid_iter, &g_gids.list, list) { if (gid_iter->gid == gid) break; } if (&gid_iter->list == &g_gids.list) - return NSS_STATUS_NOTFOUND; + { + ret = NSS_STATUS_NOTFOUND; + goto out_dealloc; + } - CHK(fill_group(result, buf, buflen, errnop, gid_iter) == 1, - "Unable to fill in group struct.", out_error_errno); + if(fill_group(result, buf, buflen, errnop, gid_iter) == 1) + { + PERROR("Unable to fill in group struct."); + goto out_error; + } if(getenv(DEBUG) != NULL) dprintf(2, "%s success in gid: %s (%d) %s\n", __func__, result->gr_name, result->gr_gid, result->gr_passwd); - return NSS_STATUS_SUCCESS; + ret = NSS_STATUS_SUCCESS; + goto out_dealloc; -out_error_errno: +out_error: *errnop = errno; - return NSS_STATUS_TRYAGAIN; +out_dealloc: + /* XXX CHECK RETURN CODE */ + _nss_rainbow_endgrent(); + return ret; } enum nss_status |