diff --git a/.gitignore b/.gitignore index 3d9640d..d26f4be 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,8 @@ tests/nsm_client/nlm_sm_inter_svc.c tests/nsm_client/nlm_sm_inter_xdr.c utils/nfsidmap/nfsidmap systemd/nfs-server-generator +systemd/rpc-pipefs-generator +systemd/rpc-gssd.service # cscope database files cscope.* # generic editor backup et al diff --git a/configure.ac b/configure.ac index 3bce774..fce0e15 100644 --- a/configure.ac +++ b/configure.ac @@ -498,8 +498,14 @@ AC_SUBST([AM_CFLAGS], ["$my_am_cflags"]) # Make sure that $ACLOCAL_FLAGS are used during a rebuild AC_SUBST([ACLOCAL_AMFLAGS], ["-I $ac_macro_dir \$(ACLOCAL_FLAGS)"]) +# make _sysconfdir available for substituion in config files +# 2 "evals" needed late to expand variable names. +AC_SUBST([_sysconfdir]) +AC_CONFIG_COMMANDS_PRE([eval eval _sysconfdir=$sysconfdir]) + AC_CONFIG_FILES([ Makefile + systemd/rpc-gssd.service linux-nfs/Makefile support/Makefile support/export/Makefile diff --git a/nfs.conf b/nfs.conf index c907de6..89cf386 100644 --- a/nfs.conf +++ b/nfs.conf @@ -1,7 +1,10 @@ # -# This is a general conifguration for the +# This is a general configuration for the # NFS daemons and tools # +#[general] +# pipefs-directory=/var/lib/nfs/rpc_pipefs +# #[exportfs] # debug=0 # @@ -12,7 +15,6 @@ # limit-to-legacy-enctypes=0 # context-timeout=0 # rpc-timeout=5 -# pipefs-directory=/var/lib/nfs/rpc_pipefs # keytab-file=/etc/krb5.keytab # cred-cache-directory= # preferred-realm= diff --git a/support/include/xcommon.h b/support/include/xcommon.h index d1a4b18..23c9a13 100644 --- a/support/include/xcommon.h +++ b/support/include/xcommon.h @@ -17,6 +17,12 @@ #include #include +#ifdef MAJOR_IN_MKDEV +#include +#elif defined(MAJOR_IN_SYSMACROS) +#include +#endif + #define streq(s, t) (strcmp ((s), (t)) == 0) /* Functions in sundries.c that are used in mount.c and umount.c */ diff --git a/support/nfs/nfsexport.c b/support/nfs/nfsexport.c index f129fd2..c1c736e 100644 --- a/support/nfs/nfsexport.c +++ b/support/nfs/nfsexport.c @@ -18,6 +18,7 @@ #include #include "nfslib.h" +#include "xcommon.h" /* if /proc/net/rpc/... exists, then * write to it, as that interface is more stable. diff --git a/systemd/Makefile.am b/systemd/Makefile.am index b789916..54a3b64 100644 --- a/systemd/Makefile.am +++ b/systemd/Makefile.am @@ -8,6 +8,7 @@ unit_files = \ nfs-blkmap.service \ nfs-config.service \ nfs-idmapd.service \ + rpc_pipefs.target \ nfs-mountd.service \ nfs-server.service \ nfs-utils.service \ @@ -24,14 +25,23 @@ EXTRA_DIST = $(unit_files) $(man5_MANS) $(man7_MANS) unit_dir = /usr/lib/systemd/system generator_dir = /usr/lib/systemd/system-generators -EXTRA_PROGRAMS = nfs-server-generator +EXTRA_PROGRAMS = nfs-server-generator rpc-pipefs-generator genexecdir = $(generator_dir) + +COMMON_SRCS = systemd.c systemd.h + +nfs_server_generator_SOURCES = $(COMMON_SRCS) nfs-server-generator.c + +rpc_pipefs_generator_SOURCES = $(COMMON_SRCS) rpc-pipefs-generator.c + nfs_server_generator_LDADD = ../support/export/libexport.a \ ../support/nfs/libnfs.a \ ../support/misc/libmisc.a +rpc_pipefs_generator_LDADD = ../support/nfs/libnfs.a + if INSTALL_SYSTEMD -genexec_PROGRAMS = nfs-server-generator +genexec_PROGRAMS = nfs-server-generator rpc-pipefs-generator install-data-hook: $(unit_files) mkdir -p $(DESTDIR)/$(unitdir) cp $(unit_files) $(DESTDIR)/$(unitdir) diff --git a/systemd/nfs-blkmap.service b/systemd/nfs-blkmap.service index ddbf4e9..c844e2d 100644 --- a/systemd/nfs-blkmap.service +++ b/systemd/nfs-blkmap.service @@ -2,8 +2,8 @@ Description=pNFS block layout mapping daemon DefaultDependencies=no Conflicts=umount.target -After=var-lib-nfs-rpc_pipefs.mount -Requires=var-lib-nfs-rpc_pipefs.mount +After=rpc_pipefs.target +Requires=rpc_pipefs.target PartOf=nfs-utils.service diff --git a/systemd/nfs-idmapd.service b/systemd/nfs-idmapd.service index df3dd9d..38685b6 100644 --- a/systemd/nfs-idmapd.service +++ b/systemd/nfs-idmapd.service @@ -1,8 +1,8 @@ [Unit] Description=NFSv4 ID-name mapping service DefaultDependencies=no -Requires=var-lib-nfs-rpc_pipefs.mount -After=var-lib-nfs-rpc_pipefs.mount local-fs.target +Requires=rpc_pipefs.target +After=rpc_pipefs.target local-fs.target BindsTo=nfs-server.service diff --git a/systemd/nfs-server-generator.c b/systemd/nfs-server-generator.c index 4aa6509..737f109 100644 --- a/systemd/nfs-server-generator.c +++ b/systemd/nfs-server-generator.c @@ -29,6 +29,7 @@ #include "misc.h" #include "nfslib.h" #include "exportfs.h" +#include "systemd.h" /* A simple "set of strings" to remove duplicates * found in /etc/exports @@ -55,35 +56,6 @@ static int is_unique(struct list **lp, char *path) return 1; } -/* We need to convert a path name to a systemd unit - * name. This requires some translation ('/' -> '-') - * and some escaping. - */ -static void systemd_escape(FILE *f, char *path) -{ - while (*path == '/') - path++; - if (!*path) { - /* "/" becomes "-", otherwise leading "/" is ignored */ - fputs("-", f); - return; - } - while (*path) { - char c = *path++; - - if (c == '/') { - /* multiple non-trailing slashes become '-' */ - while (*path == '/') - path++; - if (*path) - fputs("-", f); - } else if (isalnum(c) || c == ':' || c == '.') - fputc(c, f); - else - fprintf(f, "\\x%02x", c & 0xff); - } -} - static int has_noauto_flag(char *path) { FILE *fstab; @@ -108,7 +80,7 @@ static int has_noauto_flag(char *path) int main(int argc, char *argv[]) { - char *path; + char *path, *spath; char dirbase[] = "/nfs-server.service.d"; char filebase[] = "/order-with-mounts.conf"; nfs_export *exp; @@ -167,9 +139,15 @@ int main(int argc, char *argv[]) if (strcmp(mnt->mnt_type, "nfs") != 0 && strcmp(mnt->mnt_type, "nfs4") != 0) continue; - fprintf(f, "Before= "); - systemd_escape(f, mnt->mnt_dir); - fprintf(f, ".mount\n"); + + spath = systemd_escape(mnt->mnt_dir, ".mount"); + if (!spath) { + fprintf(stderr, + "nfs-server-generator: convert path failed: %s\n", + mnt->mnt_dir); + continue; + } + fprintf(f, "Before=%s\n", spath); } fclose(fstab); diff --git a/systemd/nfs.conf.man b/systemd/nfs.conf.man index 938b970..9700586 100644 --- a/systemd/nfs.conf.man +++ b/systemd/nfs.conf.man @@ -96,6 +96,18 @@ value, which can be one or more from the list .BR all . When a list is given, the members should be comma-separated. .TP +.B general +Recognized values: +.BR pipefs-directory . + +See +.BR blkmapd (8), +.BR rpc.idmapd (8), +and +.BR rpc.gssd (8) +for details. + +.TP .B nfsdcltrack Recognized values: .BR storagedir . @@ -198,7 +210,6 @@ Recognized values: .BR limit-to-legacy-enctypes , .BR context-timeout , .BR rpc-timeout , -.BR pipefs-directory , .BR keytab-file , .BR cred-cache-directory , .BR preferred-realm . diff --git a/systemd/rpc-gssd.service b/systemd/rpc-gssd.service deleted file mode 100644 index 5d6d09f..0000000 --- a/systemd/rpc-gssd.service +++ /dev/null @@ -1,19 +0,0 @@ -[Unit] -Description=RPC security service for NFS client and server -DefaultDependencies=no -Conflicts=umount.target -Requires=var-lib-nfs-rpc_pipefs.mount -After=var-lib-nfs-rpc_pipefs.mount gssproxy.service - -ConditionPathExists=/etc/krb5.keytab - -PartOf=nfs-utils.service - -Wants=nfs-config.service -After=nfs-config.service - -[Service] -EnvironmentFile=-/run/sysconfig/nfs-utils - -Type=forking -ExecStart=/usr/sbin/rpc.gssd $GSSDARGS diff --git a/systemd/rpc-gssd.service.in b/systemd/rpc-gssd.service.in new file mode 100644 index 0000000..c75ccbd --- /dev/null +++ b/systemd/rpc-gssd.service.in @@ -0,0 +1,19 @@ +[Unit] +Description=RPC security service for NFS client and server +DefaultDependencies=no +Conflicts=umount.target +Requires=rpc_pipefs.target +After=rpc_pipefs.target gssproxy.service + +ConditionPathExists=@_sysconfdir@/krb5.keytab + +PartOf=nfs-utils.service + +Wants=nfs-config.service +After=nfs-config.service + +[Service] +EnvironmentFile=-/run/sysconfig/nfs-utils + +Type=forking +ExecStart=/usr/sbin/rpc.gssd $GSSDARGS diff --git a/systemd/rpc-pipefs-generator.c b/systemd/rpc-pipefs-generator.c new file mode 100644 index 0000000..66addb9 --- /dev/null +++ b/systemd/rpc-pipefs-generator.c @@ -0,0 +1,138 @@ +/* + * rpc-pipefs-generator: + * systemd generator to create ordering dependencies between + * nfs services and the rpc_pipefs mountpoint + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "nfslib.h" +#include "conffile.h" +#include "systemd.h" + +#define RPC_PIPEFS_DEFAULT "/var/lib/nfs/rpc_pipefs" +char *conf_path = NFS_CONFFILE; + +static int generate_mount_unit(const char *pipefs_path, const char *pipefs_unit, + const char *dirname) +{ + char *path; + FILE *f; + + path = malloc(strlen(dirname) + 1 + strlen(pipefs_unit)); + if (!path) + return 1; + sprintf(path, "%s/%s", dirname, pipefs_unit); + f = fopen(path, "w"); + if (!f) + return 1; + + fprintf(f, "# Automatically generated by rpc-pipefs-generator\n\n[Unit]\n"); + fprintf(f, "Description=RPC Pipe File System\n"); + fprintf(f, "DefaultDependencies=no\n"); + fprintf(f, "After=systemd-tmpfiles-setup.service\n"); + fprintf(f, "Conflicts=umount.target\n"); + fprintf(f, "\n[Mount]\n"); + fprintf(f, "What=sunrpc\n"); + fprintf(f, "Where=%s\n", pipefs_path); + fprintf(f, "Type=rpc_pipefs\n"); + + fclose(f); + return 0; +} + +static +int generate_target(char *pipefs_path, const char *dirname) +{ + char *path; + char filebase[] = "/rpc_pipefs.target"; + char *pipefs_unit; + FILE *f; + int ret = 0; + + pipefs_unit = systemd_escape(pipefs_path, ".mount"); + if (!pipefs_unit) + return 1; + + ret = generate_mount_unit(pipefs_path, pipefs_unit, dirname); + if (ret) + return ret; + + path = malloc(strlen(dirname) + 1 + sizeof(filebase)); + if (!path) + return 2; + sprintf(path, "%s", dirname); + mkdir(path, 0755); + strcat(path, filebase); + f = fopen(path, "w"); + if (!f) + return 1; + + fprintf(f, "# Automatically generated by rpc-pipefs-generator\n\n[Unit]\n"); + fprintf(f, "Requires=%s\n", pipefs_unit); + fprintf(f, "After=%s\n", pipefs_unit); + fclose(f); + + return 0; +} + +static int is_non_pipefs_mountpoint(char *path) +{ + FILE *mtab; + struct mntent *mnt; + + mtab = setmntent("/etc/mtab", "r"); + if (!mtab) + return 0; + + while ((mnt = getmntent(mtab)) != NULL) { + if (strlen(mnt->mnt_dir) != strlen(path)) + continue; + if (strncmp(mnt->mnt_dir, path, strlen(mnt->mnt_dir))) + continue; + if (strncmp(mnt->mnt_type, "rpc_pipefs", strlen(mnt->mnt_type))) + break; + } + fclose(mtab); + return mnt != NULL; +} + +int main(int argc, char *argv[]) +{ + int ret; + char *s; + + /* Avoid using any external services */ + xlog_syslog(0); + + if (argc != 4 || argv[1][0] != '/') { + fprintf(stderr, "rpc-pipefs-generator: create systemd dependencies for nfs services\n"); + fprintf(stderr, "Usage: normal-dir early-dir late-dir\n"); + exit(1); + } + + conf_init(); + s = conf_get_str("general", "pipefs-directory"); + if (!s) + exit(0); + if (strlen(s) == strlen(RPC_PIPEFS_DEFAULT) && + strcmp(s, RPC_PIPEFS_DEFAULT) == 0) + exit(0); + + if (is_non_pipefs_mountpoint(s)) + exit(1); + + ret = generate_target(s, argv[1]); + exit(ret); +} diff --git a/systemd/rpc-svcgssd.service b/systemd/rpc-svcgssd.service index 41177b6..a3a555c 100644 --- a/systemd/rpc-svcgssd.service +++ b/systemd/rpc-svcgssd.service @@ -1,8 +1,7 @@ [Unit] Description=RPC security service for NFS server DefaultDependencies=no -Requires=var-lib-nfs-rpc_pipefs.mount -After=var-lib-nfs-rpc_pipefs.mount local-fs.target +After=local-fs.target PartOf=nfs-server.service PartOf=nfs-utils.service diff --git a/systemd/rpc_pipefs.target b/systemd/rpc_pipefs.target new file mode 100644 index 0000000..01d4d27 --- /dev/null +++ b/systemd/rpc_pipefs.target @@ -0,0 +1,3 @@ +[Unit] +Requires=var-lib-nfs-rpc_pipefs.mount +After=var-lib-nfs-rpc_pipefs.mount diff --git a/systemd/systemd.c b/systemd/systemd.c new file mode 100644 index 0000000..17820d4 --- /dev/null +++ b/systemd/systemd.c @@ -0,0 +1,133 @@ +/* + * Helper functions for systemd generators in nfs-utils. + * + * Currently just systemd_escape(). + */ + +#include +#include +#include +#include + +static const char hex[16] = +{ + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', +}; + +/* + * determine length of the string that systemd_escape() needs to allocate + */ +static int systemd_len(char *path) +{ + char *p; + int len = 0; + + p = path; + while (*p == '/') + /* multiple leading "/" are ignored */ + p++; + + if (!*p) + /* root directory "/" becomes is encoded as a single "-" */ + return 1; + + if (*p == '.') + /* + * replace "." with "\x2d" escape sequence if + * it's the first character in escaped path + * */ + len += 4; + + while (*p) { + unsigned char c = *p++; + + if (c == '/') { + /* multiple non-trailing slashes become '-' */ + while (*p == '/') + p++; + if (*p) + len++; + } else if (isalnum(c) || c == ':' || c == '.' || c == '_') + /* these characters are not replaced */ + len++; + else + /* replace with "\x2d" escape sequence */ + len += 4; + } + + return len; +} + +/* + * convert c to "\x2d" escape sequence and append to string + * at position p, advancing p + */ +static char *hexify(unsigned char c, char *p) +{ + *p++ = '\\'; + *p++ = 'x'; + *p++ = hex[c >> 4]; + *p++ = hex[c & 0xf]; + return p; +} + +/* + * convert a path to a unit name according to the logic in systemd.unit(5): + * + * Basically, given a path, "/" is replaced by "-", and all other + * characters which are not ASCII alphanumerics are replaced by C-style + * "\x2d" escapes (except that "_" is never replaced and "." is only + * replaced when it would be the first character in the escaped path). + * The root directory "/" is encoded as single dash, while otherwise the + * initial and ending "/" are removed from all paths during + * transformation. + * + * NB: Although the systemd.unit(5) doesn't mention it, the ':' character + * is not escaped. + */ +char *systemd_escape(char *path, char *suffix) +{ + char *result; + char *p; + int len; + + len = systemd_len(path); + result = malloc(len + strlen(suffix) + 1); + p = result; + while (*path == '/') + /* multiple leading "/" are ignored */ + path++; + if (!*path) { + /* root directory "/" becomes is encoded as a single "-" */ + *p++ = '-'; + goto out; + } + if (*path == '.') + /* + * replace "." with "\x2d" escape sequence if + * it's the first character in escaped path + * */ + p = hexify(*path++, p); + + while (*path) { + unsigned char c = *path++; + + if (c == '/') { + /* multiple non-trailing slashes become '-' */ + while (*path == '/') + path++; + if (*path) + *p++ = '-'; + } else if (isalnum(c) || c == ':' || c == '.' || c == '_') + /* these characters are not replaced */ + *p++ = c; + else + /* replace with "\x2d" escape sequence */ + p = hexify(c, p); + } + +out: + sprintf(p, "%s", suffix); + return result; +} diff --git a/systemd/systemd.h b/systemd/systemd.h new file mode 100644 index 0000000..25235ec --- /dev/null +++ b/systemd/systemd.h @@ -0,0 +1,6 @@ +#ifndef SYSTEMD_H +#define SYSTEMD_H + +char *systemd_escape(char *path, char *suffix); + +#endif /* SYSTEMD_H */ diff --git a/utils/blkmapd/blkmapd.man b/utils/blkmapd/blkmapd.man index 914b80f..4b3d3f0 100644 --- a/utils/blkmapd/blkmapd.man +++ b/utils/blkmapd/blkmapd.man @@ -43,9 +43,24 @@ Performs device discovery only then exits. Runs .B blkmapd in the foreground and sends output to stderr (as opposed to syslogd) +.SH CONFIGURATION FILE +The +.B blkmapd +daemon recognizes the following value from the +.B [general] +section of the +.I /etc/nfs.conf +configuration file: +.TP +.B pipefs-directory +Tells +.B blkmapd +where to look for the rpc_pipefs filesystem. The default value is +.IR /var/lib/nfs/rpc_pipefs . .SH SEE ALSO .BR nfs (5), -.BR dmsetup (8) +.BR dmsetup (8), +.BR nfs.conf (5) .sp RFC 5661 for the NFS version 4.1 specification. .br diff --git a/utils/blkmapd/device-discovery.c b/utils/blkmapd/device-discovery.c index b010628..a419947 100644 --- a/utils/blkmapd/device-discovery.c +++ b/utils/blkmapd/device-discovery.c @@ -50,19 +50,36 @@ #include #include +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + #include "device-discovery.h" +#include "xcommon.h" +#include "nfslib.h" +#include "conffile.h" #define EVENT_SIZE (sizeof(struct inotify_event)) #define EVENT_BUFSIZE (1024 * EVENT_SIZE) -#define BL_PIPE_FILE "/var/lib/nfs/rpc_pipefs/nfs/blocklayout" -#define NFSPIPE_DIR "/var/lib/nfs/rpc_pipefs/nfs" #define RPCPIPE_DIR "/var/lib/nfs/rpc_pipefs" #define PID_FILE "/var/run/blkmapd.pid" +#define CONF_SAVE(w, f) do { \ + char *p = f; \ + if (p != NULL) \ + (w) = p; \ +} while (0) + +static char bl_pipe_file[PATH_MAX]; +static char nfspipe_dir[PATH_MAX]; +static char rpcpipe_dir[PATH_MAX]; + struct bl_disk *visible_disk_list; int bl_watch_fd, bl_pipe_fd, nfs_pipedir_wfd, rpc_pipedir_wfd; int pidfd = -1; +char *conf_path = NULL; + struct bl_disk_path *bl_get_path(const char *filepath, struct bl_disk_path *paths) @@ -357,8 +374,8 @@ static void bl_rpcpipe_cb(void) continue; if (event->mask & IN_CREATE) { BL_LOG_WARNING("nfs pipe dir created\n"); - bl_watch_dir(NFSPIPE_DIR, &nfs_pipedir_wfd); - bl_pipe_fd = open(BL_PIPE_FILE, O_RDWR); + bl_watch_dir(nfspipe_dir, &nfs_pipedir_wfd); + bl_pipe_fd = open(bl_pipe_file, O_RDWR); } else if (event->mask & IN_DELETE) { BL_LOG_WARNING("nfs pipe dir deleted\n"); inotify_rm_watch(bl_watch_fd, nfs_pipedir_wfd); @@ -371,7 +388,7 @@ static void bl_rpcpipe_cb(void) continue; if (event->mask & IN_CREATE) { BL_LOG_WARNING("blocklayout pipe file created\n"); - bl_pipe_fd = open(BL_PIPE_FILE, O_RDWR); + bl_pipe_fd = open(bl_pipe_file, O_RDWR); if (bl_pipe_fd < 0) BL_LOG_ERR("open %s failed: %s\n", event->name, strerror(errno)); @@ -437,6 +454,19 @@ int main(int argc, char **argv) int opt, dflag = 0, fg = 0, ret = 1; struct stat statbuf; char pidbuf[64]; + char *xrpcpipe_dir = NULL; + + strncpy(rpcpipe_dir, RPCPIPE_DIR, sizeof(rpcpipe_dir)); + conf_path = NFS_CONFFILE; + conf_init(); + CONF_SAVE(xrpcpipe_dir, conf_get_str("general", "pipefs-directory")); + if (xrpcpipe_dir != NULL) + strlcpy(rpcpipe_dir, xrpcpipe_dir, sizeof(rpcpipe_dir)); + + strncpy(nfspipe_dir, rpcpipe_dir, sizeof(nfspipe_dir)); + strlcat(nfspipe_dir, "/nfs", sizeof(nfspipe_dir)); + strncpy(bl_pipe_file, rpcpipe_dir, sizeof(bl_pipe_file)); + strlcat(bl_pipe_file, "/nfs/blocklayout", sizeof(bl_pipe_file)); while ((opt = getopt(argc, argv, "hdf")) != -1) { switch (opt) { @@ -501,12 +531,12 @@ int main(int argc, char **argv) } /* open pipe file */ - bl_watch_dir(RPCPIPE_DIR, &rpc_pipedir_wfd); - bl_watch_dir(NFSPIPE_DIR, &nfs_pipedir_wfd); + bl_watch_dir(rpcpipe_dir, &rpc_pipedir_wfd); + bl_watch_dir(nfspipe_dir, &nfs_pipedir_wfd); - bl_pipe_fd = open(BL_PIPE_FILE, O_RDWR); + bl_pipe_fd = open(bl_pipe_file, O_RDWR); if (bl_pipe_fd < 0) - BL_LOG_ERR("open pipe file %s failed: %s\n", BL_PIPE_FILE, strerror(errno)); + BL_LOG_ERR("open pipe file %s failed: %s\n", bl_pipe_file, strerror(errno)); while (1) { /* discover device when needed */ diff --git a/utils/gssd/gssd.c b/utils/gssd/gssd.c index c5c03fb..10d50d3 100644 --- a/utils/gssd/gssd.c +++ b/utils/gssd/gssd.c @@ -857,6 +857,10 @@ read_gss_conf(void) s = conf_get_str("gssd", "pipefs-directory"); if (!s) s = conf_get_str("general", "pipefs-directory"); + else + printerr(0, "WARNING: Specifying pipefs-directory in the [gssd] " + "section of %s is deprecated. Use the [general] " + "section instead.", NFS_CONFFILE); if (s) pipefs_path = s; s = conf_get_str("gssd", "keytab-file"); diff --git a/utils/gssd/gssd.man b/utils/gssd/gssd.man index 87eef02..e620f0d 100644 --- a/utils/gssd/gssd.man +++ b/utils/gssd/gssd.man @@ -335,10 +335,6 @@ Equivalent to Equivalent to .BR -t . .TP -.B pipefs-directory -Equivalent to -.BR -p . -.TP .B keytab-file Equivalent to .BR -k . @@ -350,6 +346,14 @@ Equivalent to .B preferred-realm Equivalent to .BR -R . +.P +In addtion, the following value is recognized from the +.B [general] +section: +.TP +.B pipefs-directory +Equivalent to +.BR -p . .SH SEE ALSO .BR rpc.svcgssd (8), diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c index f55d2e1..03efbea 100644 --- a/utils/idmapd/idmapd.c +++ b/utils/idmapd/idmapd.c @@ -166,7 +166,7 @@ static uid_t nobodyuid; static gid_t nobodygid; /* Used by conffile.c in libnfs.a */ -char *conf_path; +char *conf_path = NULL; static int flush_nfsd_cache(char *path, time_t now) @@ -220,7 +220,6 @@ main(int argc, char **argv) int ret; char *progname; - conf_path = _PATH_IDMAPDCONF; nobodyuser = NFS4NOBODY_USER; nobodygroup = NFS4NOBODY_GROUP; strlcpy(pipefsdir, PIPEFS_DIR, sizeof(pipefsdir)); @@ -234,8 +233,11 @@ main(int argc, char **argv) #define GETOPTSTR "hvfd:p:U:G:c:CS" opterr=0; /* Turn off error messages */ while ((opt = getopt(argc, argv, GETOPTSTR)) != -1) { - if (opt == 'c') + if (opt == 'c') { + warnx("-c is deprecated and may be removed in the " + "future. See idmapd(8)."); conf_path = optarg; + } if (opt == '?') { if (strchr(GETOPTSTR, optopt)) warnx("'-%c' option requires an argument.", optopt); @@ -247,17 +249,33 @@ main(int argc, char **argv) } optind = 1; - if (stat(conf_path, &sb) == -1 && (errno == ENOENT || errno == EACCES)) { - warn("Skipping configuration file \"%s\"", conf_path); - conf_path = NULL; + if (conf_path) { /* deprecated -c option was specified */ + 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")); + } } else { + conf_path = NFS_CONFFILE; 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_path = _PATH_IDMAPDCONF; + conf_init(); + verbose = conf_get_num("General", "Verbosity", 0); + cache_entry_expiration = conf_get_num("General", + "cache-expiration", DEFAULT_IDMAP_CACHE_EXPIRY); CONF_SAVE(nobodyuser, conf_get_str("Mapping", "Nobody-User")); CONF_SAVE(nobodygroup, conf_get_str("Mapping", "Nobody-Group")); } diff --git a/utils/idmapd/idmapd.man b/utils/idmapd/idmapd.man index b9200c7..fb5fc1e 100644 --- a/utils/idmapd/idmapd.man +++ b/utils/idmapd/idmapd.man @@ -50,11 +50,28 @@ The default value is \&"/var/lib/nfs/rpc_pipefs\&". .It Fl c Ar path Use configuration file .Ar path . +This option is deprecated. .It Fl C Client-only: perform no idmapping for any NFS server, even if one is detected. .It Fl S Server-only: perform no idmapping for any NFS client, even if one is detected. .El +.Sh CONFIGURATION FILES +.Nm +recognizes the following value from the +.Sy [general] +section of the +.Pa /etc/nfs.conf +configuration file: +.Bl -tag -width Ds_imagedir +.It Sy pipefs-directory +Equivalent to +.Sy -p . +.El +.Pp +All other settings related to id mapping are found in the +.Pa /etc/idmapd.conf +configuration file. .Sh EXAMPLES .Cm rpc.idmapd -f -vvv .Pp @@ -71,9 +88,11 @@ messages to console, and with a verbosity level of 3. .\" This next request is for sections 1, 6, 7 & 8 only. .\" .Sh ENVIRONMENT .Sh FILES -.Pa /etc/idmapd.conf +.Pa /etc/idmapd.conf , +.Pa /etc/nfs.conf .Sh SEE ALSO .Xr idmapd.conf 5 , +.Xr nfs.conf 5 , .Xr nfsidmap 8 .\".Sh SEE ALSO .\".Xr nylon.conf 4 diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 3bc13ca..f23fb5a 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -31,6 +31,7 @@ #include "mountd.h" #include "fsloc.h" #include "pseudoflavors.h" +#include "xcommon.h" #ifdef USE_BLKID #include "blkid/blkid.h"