* 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 *);
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) {
}
}
- 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);
}