]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/nfssvc.c
rpc.mountd: make exportent->e_hostname a dynamically-allocated string
[nfs-utils.git] / support / nfs / nfssvc.c
index a6ea410226f193d5f22def299ff9d9a57914682a..9bbc9a5195d4ad4012bcd626977d321aa1c94c03 100644 (file)
 static void
 nfssvc_setfds(int port, unsigned int ctlbits, char *haddr)
 {
-       int fd, on=1;
+       int fd, n, on=1;
        char buf[BUFSIZ];
        int udpfd = -1, tcpfd = -1;
        struct sockaddr_in sin;
 
+       fd = open(NFSD_PORTS_FILE, O_RDONLY);
+       if (fd < 0)
+               return;
+       n = read(fd, buf, BUFSIZ);
+       close(fd);
+       if (n != 0)
+               return;
+       /* there are no ports currently open, so it is safe to
+        * try to open some and pass them through.
+        * Note: If the user explicitly asked for 'udp', then
+        * we should probably check if that is open, and should
+        * open it if not.  However we don't yet.  All sockets
+        * have to be opened when the first daemon is started.
+        */
        fd = open(NFSD_PORTS_FILE, O_WRONLY);
        if (fd < 0)
                return;
@@ -81,7 +95,7 @@ nfssvc_setfds(int port, unsigned int ctlbits, char *haddr)
                snprintf(buf, BUFSIZ,"%d\n", udpfd); 
                if (write(fd, buf, strlen(buf)) != strlen(buf)) {
                        syslog(LOG_ERR, 
-                              "nfssvc: writting fds to kernel failed: errno %d (%s)", 
+                              "nfssvc: writing fds to kernel failed: errno %d (%s)", 
                               errno, strerror(errno));
                }
                close(fd);
@@ -93,7 +107,7 @@ nfssvc_setfds(int port, unsigned int ctlbits, char *haddr)
                snprintf(buf, BUFSIZ,"%d\n", tcpfd); 
                if (write(fd, buf, strlen(buf)) != strlen(buf)) {
                        syslog(LOG_ERR, 
-                              "nfssvc: writting fds to kernel failed: errno %d (%s)", 
+                              "nfssvc: writing fds to kernel failed: errno %d (%s)", 
                               errno, strerror(errno));
                }
        }
@@ -135,9 +149,12 @@ nfssvc(int port, int nrservs, unsigned int versbits, unsigned protobits,
        struct nfsctl_arg       arg;
        int fd;
 
-       nfssvc_setfds(port, protobits, haddr);
-
+       /* Note: must set versions before fds so that
+        * the ports get registered with portmap against correct
+        * versions
+        */
        nfssvc_versbits(versbits);
+       nfssvc_setfds(port, protobits, haddr);
 
        fd = open(NFSD_THREAD_FILE, O_WRONLY);
        if (fd < 0)