X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fnfsd%2Fnfsd.c;h=fa6ee71fdd6443245511a4b105df891017106905;hp=3a22370a27540c81979656e7fcf97dde85c4ca55;hb=fde2ae7794047a698feeaf17963d690a1e660a80;hpb=8b7ad01b14df1e7529b9ba8a1ea17df0d6004ef9 diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c index 3a22370..fa6ee71 100644 --- a/utils/nfsd/nfsd.c +++ b/utils/nfsd/nfsd.c @@ -7,25 +7,44 @@ * 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 *); +static struct option longopts[] = +{ + { "help", 0, 0, 'h' }, + { "no-nfs-version", 1, 0, 'N' }, + { NULL, 0, 0, 0 } +}; +unsigned int versbits = NFSCTL_ALLBITS; + int main(int argc, char **argv) { - int count = 1, c, error, port; - - port = 2049; + int count = 1, c, error, port, fd, found_one; + struct servent *ent; - /* 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) { + while ((c = getopt_long(argc, argv, "hN:p:P:", longopts, NULL)) != EOF) { switch(c) { case 'P': /* XXX for nfs-server compatibility */ case 'p': @@ -36,12 +55,42 @@ main(int argc, char **argv) usage(argv [0]); } break; + case 'N': + switch((c = atoi(optarg))) { + case 2: + case 3: + case 4: + NFSCTL_VERUNSET(versbits, c); + break; + default: + fprintf(stderr, "%c: Unsupported version\n", c); + exit(1); + } break; - case 'h': default: + fprintf(stderr, "Invalid argument: '%c'\n", c); + case 'h': usage(argv[0]); } } + /* + * Do some sanity checking, if the ctlbits are set + */ + found_one = 0; + for (c = NFSD_MINVERS; c <= NFSD_MAXVERS; c++) { + if (NFSCTL_VERISSET(versbits, c)) + found_one = 1; + } + if (!found_one) { + fprintf(stderr, "no version specified\n"); + exit(1); + } + + 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) { @@ -52,9 +101,26 @@ main(int argc, char **argv) count = 1; } } + /* 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) - perror("nfssvc"); + openlog("nfsd", LOG_PID, LOG_DAEMON); + if ((error = nfssvc(port, count, versbits)) < 0) { + int e = errno; + syslog(LOG_ERR, "nfssvc: %s", strerror(e)); + closelog(); + } return (error != 0); } @@ -62,7 +128,8 @@ main(int argc, char **argv) static void usage(const char *prog) { - fprintf(stderr, "usage:\n" - "%s nrservs\n", prog); + fprintf(stderr, "Usage:\n" + "%s [-p|-P|--port port] [-N|--no-nfs-version version ] nrservs\n", + prog); exit(2); }