Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/mountd Again copying code is bad; the second copy o...



details:   https://anonhg.NetBSD.org/src/rev/1f6ec863b2ed
branches:  trunk
changeset: 341501:1f6ec863b2ed
user:      christos <christos%NetBSD.org@localhost>
date:      Sun Nov 08 21:03:16 2015 +0000

description:
Again copying code is bad; the second copy of mountd was completely stale.

diffstat:

 usr.sbin/mountd/mountd.c |  166 +++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 145 insertions(+), 21 deletions(-)

diffs (truncated from 316 to 300 lines):

diff -r cde327941e23 -r 1f6ec863b2ed usr.sbin/mountd/mountd.c
--- a/usr.sbin/mountd/mountd.c  Sun Nov 08 21:03:00 2015 +0000
+++ b/usr.sbin/mountd/mountd.c  Sun Nov 08 21:03:16 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: mountd.c,v 1.127 2015/08/05 23:23:47 jnemeth Exp $      */
+/*     $NetBSD: mountd.c,v 1.128 2015/11/08 21:03:16 christos Exp $     */
 
 /*
  * Copyright (c) 1989, 1993
@@ -42,7 +42,7 @@
 #if 0
 static char     sccsid[] = "@(#)mountd.c  8.15 (Berkeley) 5/1/95";
 #else
-__RCSID("$NetBSD: mountd.c,v 1.127 2015/08/05 23:23:47 jnemeth Exp $");
+__RCSID("$NetBSD: mountd.c,v 1.128 2015/11/08 21:03:16 christos Exp $");
 #endif
 #endif                         /* not lint */
 
@@ -64,6 +64,13 @@
 #include <nfs/nfs.h>
 #include <nfs/nfsmount.h>
 
+#ifdef MOUNTD_RUMP
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+#include <pthread.h>
+#include <semaphore.h>
+#endif
+
 #include <arpa/inet.h>
 
 #include <ctype.h>
@@ -91,6 +98,13 @@
 
 #include <stdarg.h>
 
+#ifdef MOUNTD_RUMP
+#include "svc_fdset.h"
+#define DEBUGGING 1
+#else
+#define DEBUGGING 0
+#endif
+
 /*
  * Structures for keeping the mount list and export list
  */
@@ -203,7 +217,6 @@
 static int put_exlist(struct dirlist *, XDR *, struct dirlist *, int *);
 static int scan_tree(struct dirlist *, struct sockaddr *);
 __dead static void send_umntall(int);
-static int umntall_each(caddr_t, struct sockaddr_in *);
 static int xdr_dir(XDR *, char *);
 static int xdr_explist(XDR *, caddr_t);
 static int xdr_fhs(XDR *, caddr_t);
@@ -242,7 +255,7 @@
 #define OP_NORESMNT    0x100
 #define OP_MASKLEN     0x200
 
-static int      debug = 0;
+static int      debug = DEBUGGING;
 #if 0
 static void SYSLOG(int, const char *,...);
 #endif
@@ -253,6 +266,82 @@
  */
 static int noprivports;
 
+#ifdef MOUNTD_RUMP
+#define C2FD(_c_) ((int)(uintptr_t)(_c_))
+static int
+rumpread(void *cookie, char *buf, int count)
+{
+
+       return rump_sys_read(C2FD(cookie), buf, count);
+}
+
+static int
+rumpwrite(void *cookie, const char *buf, int count)
+{
+
+       return rump_sys_write(C2FD(cookie), buf, count);
+}
+
+static off_t
+rumpseek(void *cookie, off_t off, int whence)
+{
+
+       return rump_sys_lseek(C2FD(cookie), off, whence);
+}
+
+static int
+rumpclose(void *cookie)
+{
+
+       return rump_sys_close(C2FD(cookie));
+}
+
+int __sflags(const char *, int *); /* XXX */
+static FILE *
+rumpfopen(const char *path, const char *opts)
+{
+       int fd, oflags;
+
+       __sflags(opts, &oflags);
+       fd = rump_sys_open(path, oflags, 0777);
+       if (fd == -1)
+               return NULL;
+
+       return funopen((void *)(uintptr_t)fd,
+           rumpread, rumpwrite, rumpseek, rumpclose);
+}
+
+/*
+ * Make sure mountd signal handler is executed from a thread context
+ * instead of the signal handler.  This avoids the signal handler
+ * ruining our kernel context.
+ */
+static sem_t exportsem;
+static void
+signal_get_exportlist(int sig)
+{
+
+       sem_post(&exportsem);
+}
+
+static void *
+exportlist_thread(void *arg)
+{
+
+       for (;;) {
+               sem_wait(&exportsem);
+               get_exportlist(0);
+       }
+
+       return NULL;
+}
+#define statvfs1(a, b, c) rump_sys_statvfs1((a), (b), (c))
+#define getfh(a, b, c) rump_sys_getfh((a), (b), (c))
+#define nfssvc(a, b) rump_sys_nfssvc((a), (b))
+#define fopen(a, b) rumpfopen((a), (b))
+#define lstat(a, b) rump_sys_lstat((a), (b))
+#define stat(a, b) rump_sys_stat((a), (b))
+
 /*
  * Mountd server for NFS mount protocol as described in:
  * NFS: Network File System Protocol Specification, RFC1094, Appendix A
@@ -261,14 +350,19 @@
  * "-d" to enable debugging
  * and "-n" to allow nonroot mount.
  */
+void *mountd_main(void *);
+void *
+mountd_main(void *arg)
+#else
 int
 main(int argc, char **argv)
+#endif
 {
        SVCXPRT *udptransp, *tcptransp, *udp6transp, *tcp6transp;
        struct netconfig *udpconf, *tcpconf, *udp6conf, *tcp6conf;
        int udpsock, tcpsock, udp6sock, tcp6sock;
-       int xcreated = 0, s;
-       int c, one = 1;
+       int xcreated = 0;
+       int one = 1;
        int maxrec = RPC_MAXDATASIZE;
        in_port_t forcedport = 0;
 #ifdef IPSEC
@@ -277,7 +371,8 @@
 #else
 #define ADDOPTS
 #endif
-
+#ifndef MOUNTD_RUMP
+       int s, c;
        while ((c = getopt(argc, argv, "dNnrp:" ADDOPTS)) != -1)
                switch (c) {
 #ifdef IPSEC
@@ -310,21 +405,34 @@
                };
        argc -= optind;
        argv += optind;
-       grphead = NULL;
-       exphead = NULL;
-       mlhead = NULL;
        if (argc == 1)
                exname = *argv;
        else
                exname = _PATH_EXPORTS;
-       openlog("mountd", LOG_PID | (debug ? LOG_PERROR : 0), LOG_DAEMON);
-       (void)signal(SIGSYS, no_nfs);
 
        s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
        if (s < 0)
                have_v6 = 0;
        else
                close(s);
+       (void)signal(SIGHUP, get_exportlist);
+#else
+       extern sem_t gensem;
+       pthread_t ptdummy;
+ 
+       svc_fdset_init(SVC_FDSET_MT);
+
+       sem_init(&exportsem, 0, 0);
+       pthread_create(&ptdummy, NULL, exportlist_thread, NULL);
+       exname = _PATH_EXPORTS;
+       have_v6 = 0;
+       (void)signal(SIGHUP, signal_get_exportlist);
+#endif
+       grphead = NULL;
+       exphead = NULL;
+       mlhead = NULL;
+       openlog("mountd", LOG_PID | (debug ? LOG_PERROR : 0), LOG_DAEMON);
+       (void)signal(SIGSYS, no_nfs);
 
        if (debug)
                (void)fprintf(stderr, "Getting export list.\n");
@@ -334,7 +442,6 @@
        get_mountlist();
        if (debug)
                (void)fprintf(stderr, "Here we go.\n");
-       (void)signal(SIGHUP, get_exportlist);
        (void)signal(SIGTERM, send_umntall);
 
        rpcb_unset(RPCPROG_MNT, RPCMNT_VER1, NULL);
@@ -463,6 +570,9 @@
                (void)signal(SIGQUIT, SIG_IGN);
        }
        pidfile(NULL);
+#ifdef MOUNTD_RUMP
+       sem_post(&gensem);
+#endif
        svc_run();
        syslog(LOG_ERR, "Mountd died");
        exit(1);
@@ -535,10 +645,15 @@
                 * Get the real pathname and make sure it is a file or
                 * directory that exists.
                 */
-               if (realpath(rpcpath, rdirpath) == 0 ||
+               if (
+#ifndef MOUNTD_RUMP
+               realpath(rpcpath, rdirpath) == NULL ||
+#else
+               strcpy(rdirpath, rpcpath) == NULL ||
+#endif
                    stat(rdirpath, &stb) < 0 ||
                    (!S_ISDIR(stb.st_mode) && !S_ISREG(stb.st_mode)) ||
-                   statvfs(rdirpath, &fsb) < 0) {
+                   statvfs1(rdirpath, &fsb, ST_WAIT) < 0) {
                        (void)chdir("/"); /* Just in case realpath doesn't */
                        if (debug)
                                (void)fprintf(stderr, "-> stat failed on %s\n",
@@ -860,7 +975,7 @@
        if (!check_dirpath(line, lineno, cp))
                return 0;
 
-       if (statvfs(cp, fsp) == -1) {
+       if (statvfs1(cp, fsp, ST_WAIT) == -1) {
                syslog(LOG_ERR, "\"%s\", line %ld: statvfs for `%s' failed: %m",
                    line, (unsigned long)lineno, cp);
                return 0;
@@ -1211,6 +1326,9 @@
 static struct exportlist *
 ex_search(fsid_t *fsid)
 {
+#ifdef MOUNTD_RUMP
+       return exphead;
+#else
        struct exportlist *ep;
 
        ep = exphead;
@@ -1221,6 +1339,7 @@
                ep = ep->ex_next;
        }
        return (ep);
+#endif
 }
 
 /*
@@ -2276,6 +2395,14 @@
        (void)fclose(mlfile);
 }
 
+#ifndef MOUNTD_RUMP
+static int
+umntall_each(caddr_t resultsp, struct sockaddr_in *raddr)
+{
+       return (1);
+}
+#endif
+
 /*
  * This function is called via. SIGTERM when the system is going down.
  * It sends a broadcast RPCMNT_UMNTALL.
@@ -2284,17 +2411,14 @@
 static void
 send_umntall(int n)
 {



Home | Main Index | Thread Index | Old Index