X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fnfsd%2Fnfsd.c;h=05506ee4ae6c2900fbd2fb4b62749f0789424959;hp=3a22370a27540c81979656e7fcf97dde85c4ca55;hb=a6037e23a8c9d649bf5946ac9d23114f9097b997;hpb=8b7ad01b14df1e7529b9ba8a1ea17df0d6004ef9 diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c index 3a22370..05506ee 100644 --- a/utils/nfsd/nfsd.c +++ b/utils/nfsd/nfsd.c @@ -7,11 +7,19 @@ * Copyright (C) 1995, 1996 Olaf Kirch */ -#include "config.h" +#ifdef HAVE_CONFIG_H +#include +#endif #include #include +#include +#include +#include +#include #include +#include +#include #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); }