X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fidmapd%2Fidmapd.c;h=b76607a4d8fa437eea010e8638bc3c31f2b93778;hp=355c6e100c28c251c768cc8e8bb4ff2f23119f33;hb=706bfd7c94d48659a1411fdef2a3a61d4719f1aa;hpb=58ddd1faed90c83abad80ab7f460976cc0c0a213 diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c index 355c6e1..b76607a 100644 --- a/utils/idmapd/idmapd.c +++ b/utils/idmapd/idmapd.c @@ -66,7 +66,7 @@ #endif /* HAVE_CONFIG_H */ #include "xlog.h" -#include "cfg.h" +#include "conffile.h" #include "queue.h" #include "nfslib.h" @@ -117,8 +117,24 @@ struct idmap_client { TAILQ_ENTRY(idmap_client) ic_next; }; static struct idmap_client nfsd_ic[2] = { -{IC_IDNAME, "Server", "", IC_IDNAME_CHAN, -1, -1, 0}, -{IC_NAMEID, "Server", "", IC_NAMEID_CHAN, -1, -1, 0}, +{ + .ic_which = IC_IDNAME, + .ic_clid = "", + .ic_id = "Server", + .ic_path = IC_IDNAME_CHAN, + .ic_fd = -1, + .ic_dirfd = -1, + .ic_scanned = 0 +}, +{ + .ic_which = IC_NAMEID, + .ic_clid = "", + .ic_id = "Server", + .ic_path = IC_NAMEID_CHAN, + .ic_fd = -1, + .ic_dirfd = -1, + .ic_scanned = 0 +}, }; TAILQ_HEAD(idmap_clientq, idmap_client); @@ -139,6 +155,7 @@ static void nametoidres(struct idmap_msg *); static int nfsdopen(void); static int nfsdopenone(struct idmap_client *); +static void nfsdreopen_one(struct idmap_client *); static void nfsdreopen(void); size_t strlcat(char *, const char *, size_t); @@ -156,7 +173,7 @@ static char *nobodyuser, *nobodygroup; static uid_t nobodyuid; static gid_t nobodygid; -/* Used by cfg.c */ +/* Used by conffile.c in libnfs.a */ char *conf_path; static int @@ -169,7 +186,10 @@ flush_nfsd_cache(char *path, time_t now) fd = open(path, O_RDWR); if (fd == -1) return -1; - write(fd, stime, strlen(stime)); + if (write(fd, stime, strlen(stime)) != (ssize_t)strlen(stime)) { + errx(1, "Flushing nfsd cache failed: errno %d (%s)", + errno, strerror(errno)); + } close(fd); return 0; } @@ -342,9 +362,11 @@ main(int argc, char **argv) xlog_err("main: fcntl(%s): %s", pipefsdir, strerror(errno)); if (fcntl(fd, F_NOTIFY, - DN_CREATE | DN_DELETE | DN_MODIFY | DN_MULTISHOT) == -1) + DN_CREATE | DN_DELETE | DN_MODIFY | DN_MULTISHOT) == -1) { xlog_err("main: fcntl(%s): %s", pipefsdir, strerror(errno)); - + if (errno == EINVAL) + xlog_err("main: Possibly no Dnotify support in kernel."); + } TAILQ_INIT(&icq); /* These events are persistent */ @@ -375,7 +397,7 @@ main(int argc, char **argv) } static void -dirscancb(int fd, short which, void *data) +dirscancb(int UNUSED(fd), short UNUSED(which), void *data) { int nent, i; struct dirent **ents; @@ -459,13 +481,13 @@ out: } static void -svrreopen(int fd, short which, void *data) +svrreopen(int UNUSED(fd), short UNUSED(which), void *UNUSED(data)) { nfsdreopen(); } static void -clntscancb(int fd, short which, void *data) +clntscancb(int UNUSED(fd), short UNUSED(which), void *data) { struct idmap_clientq *icq = data; struct idmap_client *ic; @@ -479,7 +501,7 @@ clntscancb(int fd, short which, void *data) } static void -nfsdcb(int fd, short which, void *data) +nfsdcb(int UNUSED(fd), short which, void *data) { struct idmap_client *ic = data; struct idmap_msg im; @@ -497,7 +519,8 @@ nfsdcb(int fd, short which, void *data) xlog_warn("nfsdcb: read(%s) failed: errno %d (%s)", ic->ic_path, len?errno:0, len?strerror(errno):"End of File"); - goto out; + nfsdreopen_one(ic); + return; } /* Get rid of newline and terminate buffer*/ @@ -509,11 +532,11 @@ nfsdcb(int fd, short which, void *data) /* Authentication name -- ignored for now*/ if (getfield(&bp, authbuf, sizeof(authbuf)) == -1) { xlog_warn("nfsdcb: bad authentication name in upcall\n"); - return; + goto out; } if (getfield(&bp, typebuf, sizeof(typebuf)) == -1) { xlog_warn("nfsdcb: bad type in upcall\n"); - return; + goto out; } if (verbose > 0) xlog_warn("nfsdcb: authbuf=%s authtype=%s", @@ -527,26 +550,26 @@ nfsdcb(int fd, short which, void *data) im.im_conv = IDMAP_CONV_NAMETOID; if (getfield(&bp, im.im_name, sizeof(im.im_name)) == -1) { xlog_warn("nfsdcb: bad name in upcall\n"); - return; + goto out; } break; case IC_IDNAME: im.im_conv = IDMAP_CONV_IDTONAME; if (getfield(&bp, buf1, sizeof(buf1)) == -1) { xlog_warn("nfsdcb: bad id in upcall\n"); - return; + goto out; } tmp = strtoul(buf1, (char **)NULL, 10); im.im_id = (u_int32_t)tmp; if ((tmp == ULONG_MAX && errno == ERANGE) || (unsigned long)im.im_id != tmp) { xlog_warn("nfsdcb: id '%s' too big!\n", buf1); - return; + goto out; } break; default: xlog_warn("nfsdcb: Unknown which type %d", ic->ic_which); - return; + goto out; } imconv(ic, &im); @@ -607,7 +630,7 @@ nfsdcb(int fd, short which, void *data) break; default: xlog_warn("nfsdcb: Unknown which type %d", ic->ic_which); - return; + goto out; } bsiz = sizeof(buf) - bsiz; @@ -653,7 +676,7 @@ imconv(struct idmap_client *ic, struct idmap_msg *im) } static void -nfscb(int fd, short which, void *data) +nfscb(int UNUSED(fd), short which, void *data) { struct idmap_client *ic = data; struct idmap_msg im; @@ -838,7 +861,7 @@ nametoidres(struct idmap_msg *im) static int validateascii(char *string, u_int32_t len) { - int i; + u_int32_t i; for (i = 0; i < len; i++) { if (string[i] == '\0') @@ -848,7 +871,7 @@ validateascii(char *string, u_int32_t len) return (-1); } - if (string[i] != '\0') + if ((i >= len) || string[i] != '\0') return (-1); return (i + 1); @@ -894,7 +917,7 @@ static int getfield(char **bpp, char *fld, size_t fldsz) { char *bp; - u_int val, n; + int val, n; while ((bp = strsep(bpp, " ")) != NULL && bp[0] == '\0') ; @@ -973,9 +996,12 @@ mydaemon(int nochdir, int noclose) dup2(tempfd, 0); dup2(tempfd, 1); dup2(tempfd, 2); - closeall(3); - } else - closeall(0); + close(tempfd); + } else { + err(1, "mydaemon: can't open /dev/null: errno %d", + errno); + exit(1); + } } return; @@ -986,7 +1012,10 @@ release_parent(void) int status; if (pipefds[1] > 0) { - write(pipefds[1], &status, 1); + if (write(pipefds[1], &status, 1) != 1) { + err(1, "Writing to parent pipe failed: errno %d (%s)\n", + errno, strerror(errno)); + } close(pipefds[1]); pipefds[1] = -1; }