X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=utils%2Fidmapd%2Fidmapd.c;h=e965563ac045df75d25735c7b5ea67edb063e067;hb=2aa84c3f3e9fd8e5732045c48bbaa633250f25ee;hp=ee117b6d632b91b9162691822c4dbff192c4f8db;hpb=021751e2e70c0d629bf196065816949e38b158d9;p=nfs-utils.git diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c index ee117b6..e965563 100644 --- a/utils/idmapd/idmapd.c +++ b/utils/idmapd/idmapd.c @@ -109,6 +109,7 @@ TAILQ_HEAD(idmap_clientq, idmap_client); static void dirscancb(int, short, void *); static void clntscancb(int, short, void *); +static void svrreopen(int, short, void *); static int nfsopen(struct idmap_client *); static void nfscb(int, short, void *); static void nfsdcb(int, short, void *); @@ -122,6 +123,7 @@ static void nametoidres(struct idmap_msg *); static int nfsdopen(char *); static int nfsdopenone(struct idmap_client *, short, char *); +static void nfsdreopen(void); size_t strlcat(char *, const char *, size_t); size_t strlcpy(char *, const char *, size_t); @@ -144,7 +146,7 @@ main(int argc, char **argv) { int fd = 0, opt, fg = 0, nfsdret = -1; struct idmap_clientq icq; - struct event rootdirev, clntdirev; + struct event rootdirev, clntdirev, svrdirev; struct event initialize; struct passwd *pw; struct group *gr; @@ -195,18 +197,14 @@ main(int argc, char **argv) case 'f': fg = 1; break; - case 'd': - strlcpy(domain, optarg, sizeof(domain)); - break; case 'p': strlcpy(pipefsdir, optarg, sizeof(pipefsdir)); break; + case 'd': case 'U': - nobodyuser = optarg; - break; case 'G': - nobodygroup = optarg; - break; + errx(1, "the -d, -U, and -G options have been removed;" + " please use the configuration file instead."); case 'C': serverstart = 0; break; @@ -283,6 +281,8 @@ main(int argc, char **argv) signal_add(&rootdirev, NULL); signal_set(&clntdirev, SIGUSR2, clntscancb, &icq); signal_add(&clntdirev, NULL); + signal_set(&svrdirev, SIGHUP, svrreopen, NULL); + signal_add(&svrdirev, NULL); /* Fetch current state */ /* (Delay till start of event_dispatch to avoid possibly losing @@ -294,7 +294,8 @@ main(int argc, char **argv) if (nfsdret != 0 && fd == 0) errx(1, "Neither NFS client nor NFSd found"); - event_dispatch(); + if (event_dispatch() < 0) + errx(1, "event_dispatch: returns errno %d (%s)", errno, strerror(errno)); /* NOTREACHED */ return 1; } @@ -375,6 +376,12 @@ dirscancb(int fd, short which, void *data) return; } +static void +svrreopen(int fd, short which, void *data) +{ + nfsdreopen(); +} + static void clntscancb(int fd, short which, void *data) { @@ -403,8 +410,8 @@ nfsdcb(int fd, short which, void *data) goto out; if ((len = read(ic->ic_fd, buf, sizeof(buf))) == -1) { - if (verbose > 0) - warn("read(%s)", ic->ic_path); + warnx("nfsdcb: read(%s) failed: errno %d (%s)", + ic->ic_path, errno, strerror(errno)); goto out; } @@ -415,11 +422,16 @@ nfsdcb(int fd, short which, void *data) memset(&im, 0, sizeof(im)); /* Authentication name -- ignored for now*/ - if (getfield(&bp, authbuf, sizeof(authbuf)) == -1) + if (getfield(&bp, authbuf, sizeof(authbuf)) == -1) { + warnx("nfsdcb: bad authentication name in upcall\n"); return; - - if (getfield(&bp, typebuf, sizeof(typebuf)) == -1) + } + if (getfield(&bp, typebuf, sizeof(typebuf)) == -1) { + warnx("nfsdcb: bad type in upcall\n"); return; + } + if (verbose > 0) + warnx("nfsdcb: authbuf=%s authtype=%s", authbuf, typebuf); im.im_type = strcmp(typebuf, "user") == 0 ? IDMAP_TYPE_USER : IDMAP_TYPE_GROUP; @@ -427,16 +439,22 @@ nfsdcb(int fd, short which, void *data) switch (ic->ic_which) { case IC_NAMEID: im.im_conv = IDMAP_CONV_NAMETOID; - if (getfield(&bp, im.im_name, sizeof(im.im_name)) == -1) + if (getfield(&bp, im.im_name, sizeof(im.im_name)) == -1) { + warnx("nfsdcb: bad name in upcall\n"); return; + } break; case IC_IDNAME: im.im_conv = IDMAP_CONV_IDTONAME; - if (getfield(&bp, buf1, sizeof(buf1)) == -1) + if (getfield(&bp, buf1, sizeof(buf1)) == -1) { + warnx("nfsdcb: bad id in upcall\n"); return; + } if ((im.im_id = strtoul(buf1, (char **)NULL, 10)) == ULONG_MAX && - errno == ERANGE) + errno == ERANGE) { + warnx("nfsdcb: id '%s' too big!\n", buf1); return; + } break; default: @@ -496,8 +514,9 @@ nfsdcb(int fd, short which, void *data) bsiz = sizeof(buf) - bsiz; - if (atomicio(write, ic->ic_fd, buf, bsiz) != bsiz && verbose > 0) - warn("write(%s)", ic->ic_path); + if (atomicio(write, ic->ic_fd, buf, bsiz) != bsiz) + warnx("nfsdcb: write(%s) failed: errno %d (%s)", + ic->ic_path, errno, strerror(errno)); out: event_add(&ic->ic_event, NULL); @@ -559,6 +578,38 @@ out: event_add(&ic->ic_event, NULL); } +static void +nfsdreopen_one(struct idmap_client *ic) +{ + int fd; + + if (verbose > 0) + warnx("ReOpening %s", ic->ic_path); + if ((fd = open(ic->ic_path, O_RDWR, 0)) != -1) { + if (ic->ic_fd != -1) + close(ic->ic_fd); + ic->ic_event.ev_fd = ic->ic_fd = fd; + if ((ic->ic_event.ev_flags & EVLIST_INIT) == 0) { + event_set(&ic->ic_event, ic->ic_fd, EV_READ, nfsdcb, ic); + event_add(&ic->ic_event, NULL); + } + } else { + warnx("nfsdreopen: Opening '%s' failed: errno %d (%s)", + ic->ic_path, errno, strerror(errno)); + } +} + +/* + * Note: nfsdreopen assumes nfsdopen has already been called + */ +static void +nfsdreopen() +{ + nfsdreopen_one(&nfsd_ic[IC_NAMEID]); + nfsdreopen_one(&nfsd_ic[IC_IDNAME]); + return; +} + static int nfsdopen(char *path) { @@ -575,7 +626,9 @@ nfsdopenone(struct idmap_client *ic, short which, char *path) snprintf(ic->ic_path, sizeof(ic->ic_path), "%s/nfs4.%s/channel", path, whichstr); if ((ic->ic_fd = open(ic->ic_path, O_RDWR, 0)) == -1) { - warn("%s", ic->ic_path); + if (verbose > 0) + warnx("Opening %s failed: errno %d (%s)", + ic->ic_path, errno, strerror(errno)); return (-1); }