X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fidmapd%2Fidmapd.c;h=1231db4045dab5023dfc3504c3111ce44aef6eab;hp=69396af78fede8448dbfa2438bc0236043b28eba;hb=2e075a16da4963f54cd556403ca9e15a68de27fd;hpb=356c26cc3b8b653618638654d2037719a11d95b6 diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c index 69396af..1231db4 100644 --- a/utils/idmapd/idmapd.c +++ b/utils/idmapd/idmapd.c @@ -78,6 +78,10 @@ #define NFSD_DIR "/proc/net/rpc" #endif +#ifndef CLIENT_CACHE_TIMEOUT_FILE +#define CLIENT_CACHE_TIMEOUT_FILE "/proc/sys/fs/nfs/idmap_cache_timeout" +#endif + #ifndef NFS4NOBODY_USER #define NFS4NOBODY_USER "nobody" #endif @@ -144,6 +148,8 @@ void mydaemon(int, int); void release_parent(); static int verbose = 0; +#define DEFAULT_IDMAP_CACHE_EXPIRY 600 /* seconds */ +static int cache_entry_expiration = 0; static char pipefsdir[PATH_MAX]; static char *nobodyuser, *nobodygroup; static uid_t nobodyuid; @@ -287,15 +293,17 @@ main(int argc, char **argv) if (stat(conf_path, &sb) == -1 && (errno == ENOENT || errno == EACCES)) { warn("Skipping configuration file \"%s\"", conf_path); + conf_path = NULL; } else { conf_init(); verbose = conf_get_num("General", "Verbosity", 0); + cache_entry_expiration = conf_get_num("General", + "Cache-Expiration", DEFAULT_IDMAP_CACHE_EXPIRY); CONF_SAVE(xpipefsdir, conf_get_str("General", "Pipefs-Directory")); if (xpipefsdir != NULL) strlcpy(pipefsdir, xpipefsdir, sizeof(pipefsdir)); CONF_SAVE(nobodyuser, conf_get_str("Mapping", "Nobody-User")); CONF_SAVE(nobodygroup, conf_get_str("Mapping", "Nobody-Group")); - nfs4_init_name_mapping(conf_path); } while ((opt = getopt(argc, argv, GETOPTSTR)) != -1) @@ -337,11 +345,20 @@ main(int argc, char **argv) errx(1, "Could not find group \"%s\"", nobodygroup); nobodygid = gr->gr_gid; + nfs4_set_debug(verbose, idmapd_warnx); + if (conf_path == NULL) + conf_path = _PATH_IDMAPDCONF; + if (nfs4_init_name_mapping(conf_path)) + errx(1, "Unable to create name to user id mappings."); + if (!fg) mydaemon(0, 0); event_init(); + if (verbose > 0) + idmapd_warnx("Expiration time is %d seconds.", + cache_entry_expiration); if (serverstart) { nfsdret = nfsdopen(); if (nfsdret == 0) { @@ -358,6 +375,29 @@ main(int argc, char **argv) .tv_usec = 0, }; + if (cache_entry_expiration != DEFAULT_IDMAP_CACHE_EXPIRY) { + int timeout_fd, len; + char timeout_buf[12]; + if ((timeout_fd = open(CLIENT_CACHE_TIMEOUT_FILE, + O_RDWR)) == -1) { + idmapd_warnx("Unable to open '%s' to set " + "client cache expiration time " + "to %d seconds\n", + CLIENT_CACHE_TIMEOUT_FILE, + cache_entry_expiration); + } else { + len = snprintf(timeout_buf, sizeof(timeout_buf), + "%d", cache_entry_expiration); + if ((write(timeout_fd, timeout_buf, len)) != len) + idmapd_warnx("Error writing '%s' to " + "'%s' to set client " + "cache expiration time\n", + timeout_buf, + CLIENT_CACHE_TIMEOUT_FILE); + close(timeout_fd); + } + } + if ((fd = open(pipefsdir, O_RDONLY)) == -1) idmapd_err(1, "main: open(%s)", pipefsdir); @@ -507,9 +547,10 @@ nfsdcb(int fd, short which, void *data) if (which != EV_READ) goto out; - if ((len = read(ic->ic_fd, buf, sizeof(buf))) == -1) { + if ((len = read(ic->ic_fd, buf, sizeof(buf))) <= 0) { idmapd_warnx("nfsdcb: read(%s) failed: errno %d (%s)", - ic->ic_path, errno, strerror(errno)); + ic->ic_path, len?errno:0, + len?strerror(errno):"End of File"); goto out; } @@ -578,9 +619,9 @@ nfsdcb(int fd, short which, void *data) addfield(&bp, &bsiz, p); /* Name */ addfield(&bp, &bsiz, im.im_name); -#define NFSD_EXPIRY 300 /* seconds */ /* expiry */ - snprintf(buf1, sizeof(buf1), "%lu", time(NULL) + NFSD_EXPIRY); + snprintf(buf1, sizeof(buf1), "%lu", + time(NULL) + cache_entry_expiration); addfield(&bp, &bsiz, buf1); /* ID */ snprintf(buf1, sizeof(buf1), "%u", im.im_id); @@ -599,7 +640,8 @@ nfsdcb(int fd, short which, void *data) snprintf(buf1, sizeof(buf1), "%u", im.im_id); addfield(&bp, &bsiz, buf1); /* expiry */ - snprintf(buf1, sizeof(buf1), "%lu", time(NULL) + NFSD_EXPIRY); + snprintf(buf1, sizeof(buf1), "%lu", + time(NULL) + cache_entry_expiration); addfield(&bp, &bsiz, buf1); /* Name */ addfield(&bp, &bsiz, im.im_name); @@ -961,9 +1003,11 @@ mydaemon(int nochdir, int noclose) if (noclose == 0) { tempfd = open("/dev/null", O_RDWR); - dup2(tempfd, 0); - dup2(tempfd, 1); - dup2(tempfd, 2); + if (tempfd >= 0) { + dup2(tempfd, 0); + dup2(tempfd, 1); + dup2(tempfd, 2); + } closeall(3); }