Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Stone <michael@laptop.org>2009-12-19 22:53:06 (GMT)
committer Michael Stone <michael@laptop.org>2009-12-19 23:03:17 (GMT)
commit18c9eecc2959a9350ae8adf87e10aef897b5d0d4 (patch)
tree1146f3f3a3db1d53977d9f6326277990dc86def8
parentfa5a0ebb2e71b4ca7959481094318f5a62d15f9d (diff)
Simplify list traversal logic.
-rw-r--r--rainbow/nss/nss-rainbow.c15
-rw-r--r--rainbow/nss/slist.h53
-rw-r--r--rainbow/nss/test_slist.c3
3 files changed, 31 insertions, 40 deletions
diff --git a/rainbow/nss/nss-rainbow.c b/rainbow/nss/nss-rainbow.c
index 1f69ac3..6a2125c 100644
--- a/rainbow/nss/nss-rainbow.c
+++ b/rainbow/nss/nss-rainbow.c
@@ -5,6 +5,7 @@
#include <pwd.h>
#include <grp.h>
#include <stdint.h>
+#include <stddef.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/types.h>
@@ -286,7 +287,7 @@ gid_to_members_scanner(const struct dirent* d) {
bool find_gid(struct gid_row* iter) {
if (iter->gid == gid) { g_cur_gid = iter; return 0; } else return 1;
}
- slist_search(struct gid_row, list, g_gids, found, not_found, &find_gid);
+ slist_search(struct gid_row, list, g_gids, found, not_found, find_gid);
not_found:
LET(gr = calloc(1, sizeof(struct gid_row)), !gr,
@@ -329,10 +330,10 @@ enum nss_status _nss_rainbow_endgrent(void) {
free(member_iter->name);
free(member_iter);
}
- slist_for(struct member_row, list, gid_iter->members, &free_member);
+ slist_for(struct member_row, list, gid_iter->members, free_member);
free(gid_iter);
}
- slist_for(struct gid_row, list, g_gids, &free_gid);
+ slist_for(struct gid_row, list, g_gids, free_gid);
return NSS_STATUS_SUCCESS;
}
@@ -366,8 +367,8 @@ fill_group(struct group* result, char* buf, size_t buflen, struct gid_row* gid_i
/* count the number of members */
size_t member_count = 0;
- void count_member(struct member_row* iter) { member_count++; }
- slist_for(struct member_row, list, gid_iter->members, &count_member);
+ void count_member(struct member_row* iter) { (void) iter; member_count++; }
+ slist_for(struct member_row, list, gid_iter->members, count_member);
/* reserve space for the member-pointers */
size_t member_size = (member_count+1)* sizeof(char*);
@@ -381,7 +382,7 @@ fill_group(struct group* result, char* buf, size_t buflen, struct gid_row* gid_i
/* fill in the members and swing the pointers */
member_count = 0;
slist_while(struct member_row, list, gid_iter->members, out_error,
- &fill_member, result, &buf, &buflen, &member_count);
+ fill_member, result, &buf, &buflen, &member_count);
return 0;
@@ -432,7 +433,7 @@ _nss_rainbow_getgrgid_r(gid_t gid, struct group *result, char *buf, size_t bufle
}
slist_search(struct gid_row, list, g_gids, resume, resume,
- &find_gid, &gid_iter);
+ find_gid, &gid_iter);
resume:
TST(&gid_iter->list == NULL, ret = NSS_STATUS_NOTFOUND,
diff --git a/rainbow/nss/slist.h b/rainbow/nss/slist.h
index aaccd41..cd031ee 100644
--- a/rainbow/nss/slist.h
+++ b/rainbow/nss/slist.h
@@ -7,44 +7,33 @@ bool slist_non_null(struct slist* self);
size_t slist_length(struct slist* self);
void slist_extend(struct slist* self, struct slist* rhs);
-/* Definition from kernel/include/list.h */
-#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
-
-/* Definition from kernel/include/list.h */
-#define container_of(ptr, type, member) ({ \
- const typeof( ((type *)0)->member ) *__mptr = (ptr); \
- (type *)( (char *)__mptr - offsetof(type,member) );})
+#define container_of(PTR, TYPE, MEMBER) \
+ (TYPE *)((char *)(PTR) - ((ptrdiff_t) &((TYPE*)0)->MEMBER))
/* FUN should return false to break iteration. */
/* NB: Comma-swallowing paste of gnu-style named variadic macro argument. */
-#define slist_search(TYPE, MEMBER, PTR, FOUND_LABEL, NOTFOUND_LABEL, FUN, COOKIE...) ({ \
- struct slist *__slist_iter = ((PTR)->MEMBER).next; \
+#define slist_metafor(TYPE, MEMBER, PTR, BODY) { \
+ struct slist *__slist_head = &((PTR)->MEMBER); \
+ struct slist *__slist_iter = __slist_head->next; \
struct slist *__slist_next; \
- while(__slist_iter != &((PTR)->MEMBER)) { \
+ while(__slist_iter != __slist_head) { \
__slist_next = __slist_iter->next; \
TYPE* __value_ptr = container_of(__slist_iter, TYPE, MEMBER); \
- if(!(*(FUN))(__value_ptr, ##COOKIE)) goto FOUND_LABEL; \
+ BODY; \
__slist_iter = __slist_next; \
- } \
- goto NOTFOUND_LABEL; })
+ } \
+}
-#define slist_while(TYPE, MEMBER, PTR, ERR_LABEL, FUN, COOKIE...) ({ \
- struct slist *__slist_iter = ((PTR)->MEMBER).next; \
- struct slist *__slist_next; \
- while(__slist_iter != &((PTR)->MEMBER)) { \
- __slist_next = __slist_iter->next; \
- TYPE* __value_ptr = container_of(__slist_iter, TYPE, MEMBER); \
- if((*(FUN))(__value_ptr, ##COOKIE)) goto ERR_LABEL; \
- __slist_iter = __slist_next; \
- } \
- })
+#define slist_search(TYPE, MEMBER, PTR, FOUND_LABEL, NOTFOUND_LABEL, FUN, \
+ COOKIE...) \
+ slist_metafor(TYPE, MEMBER, PTR, \
+ { if(!(FUN)(__value_ptr, ##COOKIE)) goto FOUND_LABEL; } \
+ ) \
+ goto NOTFOUND_LABEL;
-#define slist_for(TYPE, MEMBER, PTR, FUN, COOKIE...) ({ \
- struct slist *__slist_iter = ((PTR)->MEMBER).next; \
- struct slist *__slist_next; \
- while(__slist_iter != &((PTR)->MEMBER)) { \
- __slist_next = __slist_iter->next; \
- TYPE* __value_ptr = container_of(__slist_iter, TYPE, MEMBER); \
- (*(FUN))(__value_ptr, ##COOKIE); \
- __slist_iter = __slist_next; \
- } })
+#define slist_while(TYPE, MEMBER, PTR, ERR_LABEL, FUN, COOKIE...) \
+ slist_metafor(TYPE, MEMBER, PTR, \
+ { if((FUN)(__value_ptr, ##COOKIE)) goto ERR_LABEL; }) \
+
+#define slist_for(TYPE, MEMBER, PTR, FUN, COOKIE...) \
+ slist_metafor(TYPE, MEMBER, PTR, { (FUN)(__value_ptr, ##COOKIE); })
diff --git a/rainbow/nss/test_slist.c b/rainbow/nss/test_slist.c
index 66be29d..138adf4 100644
--- a/rainbow/nss/test_slist.c
+++ b/rainbow/nss/test_slist.c
@@ -1,5 +1,6 @@
#include <stdio.h>
#include <stdint.h>
+#include <stddef.h>
#include <stdbool.h>
#include "slist.h"
@@ -22,7 +23,7 @@ int find_two(struct node* self) {
if (self->id == 2) return 0; else return 1;
}
-int main(int argc, char** argv) {
+int main() {
struct node h, a, b, c;
node_init(&h); a.id = 0;
node_init(&a); a.id = 1;