X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fidmapd%2Fidmapd.c;h=a82cd0bf3bcbb36c27cee765822917d629cbaa73;hb=2f1ade1adf8074efbd661d41758d8844ab5f522e;hp=19bf7a601b5ba562258420facc9fec2083047d5e;hpb=bdfe0d28ee4c23dec311423a34b2a3ec65b5b318;p=nfs-utils.git diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c index 19bf7a6..a82cd0b 100644 --- a/utils/idmapd/idmapd.c +++ b/utils/idmapd/idmapd.c @@ -137,15 +137,16 @@ static void imconv(struct idmap_client *, struct idmap_msg *); static void idtonameres(struct idmap_msg *); static void nametoidres(struct idmap_msg *); -static int nfsdopen(); +static int nfsdopen(void); static int nfsdopenone(struct idmap_client *); static void nfsdreopen(void); size_t strlcat(char *, const char *, size_t); size_t strlcpy(char *, const char *, size_t); -ssize_t atomicio(ssize_t (*)(), int, void *, size_t); +ssize_t atomicio(ssize_t (*f) (int, void*, size_t), + int, void *, size_t); void mydaemon(int, int); -void release_parent(); +void release_parent(void); static int verbose = 0; #define DEFAULT_IDMAP_CACHE_EXPIRY 600 /* seconds */ @@ -444,7 +445,7 @@ dirscancb(int fd, short which, void *data) { int nent, i; struct dirent **ents; - struct idmap_client *ic; + struct idmap_client *ic, *nextic; char path[PATH_MAX]; struct idmap_clientq *icq = data; @@ -464,7 +465,7 @@ dirscancb(int fd, short which, void *data) goto next; if ((ic = calloc(1, sizeof(*ic))) == NULL) - return; + goto out; strlcpy(ic->ic_clid, ents[i]->d_name + 4, sizeof(ic->ic_clid)); path[0] = '\0'; @@ -474,7 +475,7 @@ dirscancb(int fd, short which, void *data) if ((ic->ic_dirfd = open(path, O_RDONLY, 0)) == -1) { idmapd_warn("dirscancb: open(%s)", path); free(ic); - return; + goto out; } strlcat(path, "/idmap", sizeof(path)); @@ -486,7 +487,7 @@ dirscancb(int fd, short which, void *data) if (nfsopen(ic) == -1) { close(ic->ic_dirfd); free(ic); - return; + goto out; } ic->ic_id = "Client"; @@ -498,7 +499,9 @@ dirscancb(int fd, short which, void *data) } } - TAILQ_FOREACH(ic, icq, ic_next) { + ic = TAILQ_FIRST(icq); + while(ic != NULL) { + nextic=TAILQ_NEXT(ic, ic_next); if (!ic->ic_scanned) { event_del(&ic->ic_event); close(ic->ic_fd); @@ -511,7 +514,13 @@ dirscancb(int fd, short which, void *data) free(ic); } else ic->ic_scanned = 0; + ic = nextic; } + +out: + for (i = 0; i < nent; i++) + free(ents[i]); + free(ents); return; } @@ -669,7 +678,7 @@ nfsdcb(int fd, short which, void *data) bsiz = sizeof(buf) - bsiz; - if (atomicio(write, ic->ic_fd, buf, bsiz) != bsiz) + if (atomicio((void*)write, ic->ic_fd, buf, bsiz) != bsiz) idmapd_warnx("nfsdcb: write(%s) failed: errno %d (%s)", ic->ic_path, errno, strerror(errno)); @@ -735,7 +744,7 @@ nfscb(int fd, short which, void *data) if (im.im_status == IDMAP_STATUS_LOOKUPFAIL) im.im_status = IDMAP_STATUS_SUCCESS; - if (atomicio(write, ic->ic_fd, &im, sizeof(im)) != sizeof(im)) + if (atomicio((void*)write, ic->ic_fd, &im, sizeof(im)) != sizeof(im)) idmapd_warn("nfscb: write(%s)", ic->ic_path); out: event_add(&ic->ic_event, NULL); @@ -773,7 +782,7 @@ nfsdreopen() } static int -nfsdopen() +nfsdopen(void) { return ((nfsdopenone(&nfsd_ic[IC_NAMEID]) == 0 && nfsdopenone(&nfsd_ic[IC_IDNAME]) == 0) ? 0 : -1); @@ -1038,7 +1047,7 @@ mydaemon(int nochdir, int noclose) return; } void -release_parent() +release_parent(void) { int status;