Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Stone <michael@laptop.org>2008-07-08 06:57:25 (GMT)
committer Michael Stone <michael@laptop.org>2008-07-08 06:57:25 (GMT)
commit7b2d755854103a220ea0b3f82082505a3f9ad835 (patch)
treeef1cac1705f073c414e5031c0c8f0a7708e38e34
parent54bd6accb06fdb5227e3ec789d7fcc44dc85c458 (diff)
Minor fixes.
-rw-r--r--cgen.h3
-rw-r--r--nss-rainbow.c34
2 files changed, 24 insertions, 13 deletions
diff --git a/cgen.h b/cgen.h
index d0f2ca7..2172ad0 100644
--- a/cgen.h
+++ b/cgen.h
@@ -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