diff options
author | neilbrown <neilbrown> | 2005-08-26 01:20:12 +0000 |
---|---|---|
committer | neilbrown <neilbrown> | 2005-08-26 01:20:12 +0000 |
commit | c5ea2fbc9ab9d142aa867da594a66f4097df03d1 (patch) | |
tree | cd490f0e2dd0d087233f42b27ada3d9c9a44cda0 /utils/idmapd/idmapd.c | |
parent | 74a9c55e518cbd4ece01a2c57104222d9b675fb0 (diff) | |
download | nfs-utils-c5ea2fbc9ab9d142aa867da594a66f4097df03d1.tar.gz nfs-utils-c5ea2fbc9ab9d142aa867da594a66f4097df03d1.tar.xz nfs-utils-c5ea2fbc9ab9d142aa867da594a66f4097df03d1.zip |
2005-08-26 Kevin Coffman <kwc@citi.umich.edu>
* configure.in etc
Consolidate some of the Kerberos checking instead of repeating
the same things for MIT and Heimdal.
Also adds more checks to distinguish 32-bit from 64-bit
(mainly for gssapi.h)
Fix svcgssd Makefile so make TOP=../../ works correctly there.
Enable running a modern autoheader.
* utils/gssd/gss_oids.c: Use correct OID value for SPKM-3
* utils/gssd/gss_util.c: Fix build with older MIT releases that do not define GSS_C_NT_HOSTBASED_SERVICE
* utils/gssd/write_bytes.h, support/include/gssapi/gssapi.h:
Length of gss_buffer_desc is a size_t which is 64-bits on a
64-bit machine. Kernel code expects 32-bit integer for length.
Coerce length value into a 32-bit value when reading from or
writing to the kernel.
Change gssapi.h to use datatype size values obtained from
configure rather than hard-coded values.
* utils/idmapd/idmapd.c: The EV_INIT check here was wrong, and was
causing idmapd to become unresponsive to server requests after
receiving a sighup.
* utils/idmapd/idmapd.c: Idmapd should flush the server id<->name
caches when its started.
Diffstat (limited to 'utils/idmapd/idmapd.c')
-rw-r--r-- | utils/idmapd/idmapd.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c index 02604df..b1da786 100644 --- a/utils/idmapd/idmapd.c +++ b/utils/idmapd/idmapd.c @@ -141,6 +141,34 @@ static struct idmap_client nfsd_ic[2]; /* Used by cfg.c */ char *conf_path; +static int +flush_nfsd_cache(char *path, time_t now) +{ + int fd; + char stime[20]; + + sprintf(stime, "%ld\n", now); + fd = open(path, O_RDWR); + if (fd == -1) + return -1; + write(fd, stime, strlen(stime)); + close(fd); + return 0; +} + +static int +flush_nfsd_idmap_cache(void) +{ + time_t now = time(NULL); + int ret; + + ret = flush_nfsd_cache("/proc/net/rpc/nfs4.idtoname/flush", now); + if (ret) + return ret; + ret = flush_nfsd_cache("/proc/net/rpc/nfs4.nametoid/flush", now); + return ret; +} + int main(int argc, char **argv) { @@ -153,6 +181,7 @@ main(int argc, char **argv) struct stat sb; char *xpipefsdir = NULL; int serverstart = 1, clientstart = 1; + int ret; conf_path = _PATH_IDMAPDCONF; nobodyuser = NFS4NOBODY_USER; @@ -230,8 +259,14 @@ main(int argc, char **argv) event_init(); - if (serverstart) + if (serverstart) { nfsdret = nfsdopen(NFSD_DIR); + if (nfsdret == 0) { + ret = flush_nfsd_idmap_cache(); + if (ret) + errx(1, "Failed to flush nfsd idmap cache\n"); + } + } if (clientstart) { struct timeval now = { @@ -565,10 +600,8 @@ nfsdreopen_one(struct idmap_client *ic) 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); - } + 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)); |