X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fnfsd%2Fnfsd.c;h=1589a9f39dbac530259b298184c3e4738f696168;hp=183681b98953c1ed7af112a0043394e39b6f78d7;hb=6f25394cb5651e7e44cc3fc0b2b4b2ccba8c3625;hpb=5d37055061e92df07c4bf483ce06551d82ae9338 diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c index 183681b..1589a9f 100644 --- a/utils/nfsd/nfsd.c +++ b/utils/nfsd/nfsd.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -26,6 +25,7 @@ #include "nfslib.h" #include "nfssvc.h" +#include "xlog.h" static void usage(const char *); @@ -38,6 +38,8 @@ static struct option longopts[] = { "no-udp", 0, 0, 'U' }, { "port", 1, 0, 'P' }, { "port", 1, 0, 'p' }, + { "debug", 0, 0, 'd' }, + { "syslog", 0, 0, 's' }, { NULL, 0, 0, 0 } }; unsigned int protobits = NFSCTL_ALLBITS; @@ -51,7 +53,7 @@ main(int argc, char **argv) int count = 1, c, error, port, fd, found_one; struct servent *ent; struct hostent *hp; - char *p; + char *p, *progname; ent = getservbyname ("nfs", "udp"); if (ent != NULL) @@ -59,8 +61,20 @@ main(int argc, char **argv) else port = 2049; - while ((c = getopt_long(argc, argv, "H:hN:p:P:TU", longopts, NULL)) != EOF) { + progname = strdup(basename(argv[0])); + if (!progname) { + fprintf(stderr, "%s: unable to allocate memory.\n", argv[0]); + exit(1); + } + + xlog_syslog(0); + xlog_stderr(1); + + while ((c = getopt_long(argc, argv, "dH:hN:p:P:sTU", longopts, NULL)) != EOF) { switch(c) { + case 'd': + xlog_config(D_ALL, 1); + break; case 'H': if (inet_addr(optarg) != INADDR_NONE) { haddr = strdup(optarg); @@ -68,8 +82,8 @@ main(int argc, char **argv) haddr = inet_ntoa((*(struct in_addr*)(hp->h_addr_list[0]))); } else { fprintf(stderr, "%s: Unknown hostname: %s\n", - argv[0], optarg); - usage(argv [0]); + progname, optarg); + usage(progname); } break; case 'P': /* XXX for nfs-server compatibility */ @@ -77,8 +91,8 @@ main(int argc, char **argv) port = atoi(optarg); if (port <= 0 || port > 65535) { fprintf(stderr, "%s: bad port number: %s\n", - argv[0], optarg); - usage(argv [0]); + progname, optarg); + usage(progname); } break; case 'N': @@ -97,6 +111,10 @@ main(int argc, char **argv) exit(1); } break; + case 's': + xlog_syslog(1); + xlog_stderr(0); + break; case 'T': NFSCTL_TCPUNSET(protobits); break; @@ -106,14 +124,17 @@ main(int argc, char **argv) default: fprintf(stderr, "Invalid argument: '%c'\n", c); case 'h': - usage(argv[0]); + usage(progname); } } + + xlog_open(progname); + /* * Do some sanity checking, if the ctlbits are set */ if (!NFSCTL_UDPISSET(protobits) && !NFSCTL_TCPISSET(protobits)) { - fprintf(stderr, "invalid protocol specified\n"); + xlog(L_ERROR, "invalid protocol specified"); exit(1); } found_one = 0; @@ -122,12 +143,12 @@ main(int argc, char **argv) found_one = 1; } if (!found_one) { - fprintf(stderr, "no version specified\n"); + xlog(L_ERROR, "no version specified"); exit(1); } if (NFSCTL_VERISSET(versbits, 4) && !NFSCTL_TCPISSET(protobits)) { - fprintf(stderr, "version 4 requires the TCP protocol\n"); + xlog(L_ERROR, "version 4 requires the TCP protocol"); exit(1); } if (haddr == NULL) { @@ -136,17 +157,15 @@ main(int argc, char **argv) } if (chdir(NFS_STATEDIR)) { - fprintf(stderr, "%s: chdir(%s) failed: %s\n", - argv [0], NFS_STATEDIR, strerror(errno)); + xlog(L_ERROR, "chdir(%s) failed: %m", NFS_STATEDIR); exit(1); } if (optind < argc) { if ((count = atoi(argv[optind])) < 0) { /* insane # of servers */ - fprintf(stderr, - "%s: invalid server count (%d), using 1\n", - argv[0], count); + xlog(L_ERROR, "invalid server count (%d), using 1", + count); count = 1; } } @@ -156,21 +175,21 @@ main(int argc, char **argv) everything before spawning kernel threads. --Chip */ fd = open("/dev/null", O_RDWR); if (fd == -1) - perror("/dev/null"); + xlog(L_ERROR, "Unable to open /dev/null: %m"); else { + /* switch xlog output to syslog since stderr is being closed */ + xlog_syslog(1); + xlog_stderr(0); (void) dup2(fd, 0); (void) dup2(fd, 1); (void) dup2(fd, 2); } closeall(3); - openlog("nfsd", LOG_PID, LOG_DAEMON); - if ((error = nfssvc(port, count, versbits, minorvers4, protobits, haddr)) < 0) { - int e = errno; - syslog(LOG_ERR, "nfssvc: %s", strerror(e)); - closelog(); - } + if ((error = nfssvc(port, count, versbits, minorvers4, protobits, haddr)) < 0) + xlog(L_ERROR, "nfssvc: errno %d (%m)", errno); + free(progname); return (error != 0); } @@ -178,7 +197,7 @@ static void usage(const char *prog) { fprintf(stderr, "Usage:\n" - "%s [-H hostname] [-p|-P|--port port] [-N|--no-nfs-version version ] [-T|--no-tcp] [-U|--no-udp] nrservs\n", + "%s [-d|--debug] [-H hostname] [-p|-P|--port port] [-N|--no-nfs-version version ] [-s|--syslog] [-T|--no-tcp] [-U|--no-udp] nrservs\n", prog); exit(2); }