]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/nfsd/nfsd.c
Add option to specify directory to search for credentials cache files
[nfs-utils.git] / utils / nfsd / nfsd.c
index 3a22370a27540c81979656e7fcf97dde85c4ca55..05506ee4ae6c2900fbd2fb4b62749f0789424959 100644 (file)
@@ -7,11 +7,19 @@
  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
  */
 
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
 #include <getopt.h>
+#include <syslog.h>
+#include <netdb.h>
 #include "nfslib.h"
 
 static void    usage(const char *);
@@ -19,11 +27,14 @@ static void usage(const char *);
 int
 main(int argc, char **argv)
 {
-       int     count = 1, c, error, port;
+       int     count = 1, c, error, port, fd;
+       struct servent *ent;
 
-       port = 2049;
-
-       /* FIXME: Check for nfs in /etc/services */
+       ent = getservbyname ("nfs", "udp");
+       if (ent != NULL)
+               port = ntohs (ent->s_port);
+       else
+               port = 2049;
 
        while ((c = getopt(argc, argv, "hp:P:")) != EOF) {
                switch(c) {
@@ -43,6 +54,12 @@ main(int argc, char **argv)
                }
        }
 
+       if (chdir(NFS_STATEDIR)) {
+               fprintf(stderr, "%s: chdir(%s) failed: %s\n",
+                       argv [0], NFS_STATEDIR, strerror(errno));
+               exit(1);
+       }
+
        if (optind < argc) {
                if ((count = atoi(argv[optind])) < 0) {
                        /* insane # of servers */
@@ -53,8 +70,26 @@ main(int argc, char **argv)
                }
        }
 
-       if ((error = nfssvc(port, count)) < 0)
-               perror("nfssvc");
+       /* KLUDGE ALERT:
+          Some kernels let nfsd kernel threads inherit open files
+          from the program that spawns them (i.e. us).  So close
+          everything before spawning kernel threads.  --Chip */
+       fd = open("/dev/null", O_RDWR);
+       if (fd == -1)
+               perror("/dev/null");
+       else {
+               (void) dup2(fd, 0);
+               (void) dup2(fd, 1);
+               (void) dup2(fd, 2);
+       }
+       closeall(3);
+
+       if ((error = nfssvc(port, count)) < 0) {
+               int e = errno;
+               openlog("nfsd", LOG_PID, LOG_DAEMON);
+               syslog(LOG_ERR, "nfssvc: %s", strerror(e));
+               closelog();
+       }
 
        return (error != 0);
 }