X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmountd%2Fmountd.c;h=993b6e65e58f612ef90c718991cd450d66649e65;hp=a4fdcc8a98082decf805e826b2a039ecfb962b83;hb=985f89a8a87f2626583b240f7abad86d97a77596;hpb=b551b1fd0052de9b8c674b30c39d9f2a1e9d79cc diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c index a4fdcc8..993b6e6 100644 --- a/utils/mountd/mountd.c +++ b/utils/mountd/mountd.c @@ -99,12 +99,9 @@ static int version_any(void) static void unregister_services (void) { - if (version2()) { - nfs_svc_unregister(MOUNTPROG, MOUNTVERS); - nfs_svc_unregister(MOUNTPROG, MOUNTVERS_POSIX); - } - if (version3()) - nfs_svc_unregister(MOUNTPROG, MOUNTVERS_NFSV3); + nfs_svc_unregister(MOUNTPROG, MOUNTVERS); + nfs_svc_unregister(MOUNTPROG, MOUNTVERS_POSIX); + nfs_svc_unregister(MOUNTPROG, MOUNTVERS_NFSV3); } static void @@ -199,7 +196,8 @@ killer (int sig) wait_for_workers(); } cleanup_lockfiles(); - xlog (L_FATAL, "Caught signal %d, un-registering and exiting.", sig); + xlog (L_NOTICE, "Caught signal %d, un-registering and exiting.", sig); + exit(0); } static void @@ -474,27 +472,27 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, /* Now authenticate the intruder... */ exp = auth_authenticate("mount", sap, p); if (exp == NULL) { - *error = NFSERR_ACCES; + *error = MNT3ERR_ACCES; return NULL; } if (stat(p, &stb) < 0) { xlog(L_WARNING, "can't stat exported dir %s: %s", p, strerror(errno)); if (errno == ENOENT) - *error = NFSERR_NOENT; + *error = MNT3ERR_NOENT; else - *error = NFSERR_ACCES; + *error = MNT3ERR_ACCES; return NULL; } if (!S_ISDIR(stb.st_mode) && !S_ISREG(stb.st_mode)) { xlog(L_WARNING, "%s is not a directory or regular file", p); - *error = NFSERR_NOTDIR; + *error = MNT3ERR_NOTDIR; return NULL; } if (stat(exp->m_export.e_path, &estb) < 0) { xlog(L_WARNING, "can't stat export point %s: %s", p, strerror(errno)); - *error = NFSERR_NOENT; + *error = MNT3ERR_NOENT; return NULL; } if (estb.st_dev != stb.st_dev @@ -502,7 +500,7 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, || !(exp->m_export.e_flags & NFSEXP_CROSSMOUNT))) { xlog(L_WARNING, "request to export directory %s below nearest filesystem %s", p, exp->m_export.e_path); - *error = NFSERR_ACCES; + *error = MNT3ERR_ACCES; return NULL; } if (exp->m_export.e_mountpoint && @@ -511,7 +509,7 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, exp->m_export.e_path)) { xlog(L_WARNING, "request to export an unmounted filesystem: %s", p); - *error = NFSERR_NOENT; + *error = MNT3ERR_NOENT; return NULL; } @@ -522,12 +520,12 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, */ if (cache_export(exp, p)) { - *error = NFSERR_ACCES; + *error = MNT3ERR_ACCES; return NULL; } fh = cache_get_filehandle(exp, v3?64:32, p); if (fh == NULL) { - *error = NFSERR_ACCES; + *error = MNT3ERR_ACCES; return NULL; } } else { @@ -557,11 +555,11 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, if (fh == NULL) { xlog(L_WARNING, "getfh failed: %s", strerror(errno)); - *error = NFSERR_ACCES; + *error = MNT3ERR_ACCES; return NULL; } } - *error = NFS_OK; + *error = MNT_OK; mountlist_add(host_ntop(sap, buf, sizeof(buf)), p); if (expret) *expret = exp; @@ -636,7 +634,7 @@ static void insert_group(struct exportnode *e, char *newname) struct groupnode *g; for (g = e->ex_groups; g; g = g->gr_next) - if (strcmp(g->gr_name, newname)) + if (!strcmp(g->gr_name, newname)) return; g = xmalloc(sizeof(*g)); @@ -692,6 +690,7 @@ main(int argc, char **argv) { char *export_file = _PATH_EXPORTS; char *state_dir = NFS_STATEDIR; + char *progname; unsigned int listeners = 0; int foreground = 0; int port = 0; @@ -701,6 +700,12 @@ main(int argc, char **argv) struct sigaction sa; struct rlimit rlim; + /* Set the basename */ + if ((progname = strrchr(argv[0], '/')) != NULL) + progname++; + else + progname = argv[0]; + /* Parse the command line options and arguments. */ opterr = 0; while ((c = getopt_long(argc, argv, "o:nFd:f:p:P:hH:N:V:vrs:t:g", longopts, NULL)) != EOF) @@ -712,8 +717,8 @@ main(int argc, char **argv) descriptors = atoi(optarg); if (descriptors <= 0) { fprintf(stderr, "%s: bad descriptors: %s\n", - argv [0], optarg); - usage(argv [0], 1); + progname, optarg); + usage(progname, 1); } break; case 'F': @@ -729,15 +734,15 @@ main(int argc, char **argv) ha_callout_prog = optarg; break; case 'h': - usage(argv [0], 0); + usage(progname, 0); break; case 'P': /* XXX for nfs-server compatibility */ case 'p': port = atoi(optarg); if (port <= 0 || port > 65535) { fprintf(stderr, "%s: bad port number: %s\n", - argv [0], optarg); - usage(argv [0], 1); + progname, optarg); + usage(progname, 1); } break; case 'N': @@ -758,7 +763,7 @@ main(int argc, char **argv) case 's': if ((state_dir = xstrdup(optarg)) == NULL) { fprintf(stderr, "%s: xstrdup(%s) failed!\n", - argv[0], optarg); + progname, optarg); exit(1); } break; @@ -775,30 +780,28 @@ main(int argc, char **argv) nfs_version |= NFSVERSBIT(vers); break; case 'v': - printf("kmountd %s\n", VERSION); + printf("%s version " VERSION "\n", progname); exit(0); case 0: break; case '?': default: - usage(argv [0], 1); + usage(progname, 1); } - /* No more arguments allowed. - * Require at least one valid version (2, 3, or 4) - */ + /* No more arguments allowed. */ if (optind != argc || !version_any()) - usage(argv [0], 1); + usage(progname, 1); if (chdir(state_dir)) { fprintf(stderr, "%s: chdir(%s) failed: %s\n", - argv [0], state_dir, strerror(errno)); + progname, state_dir, strerror(errno)); exit(1); } if (getrlimit (RLIMIT_NOFILE, &rlim) != 0) fprintf(stderr, "%s: getrlimit (RLIMIT_NOFILE) failed: %s\n", - argv [0], strerror(errno)); + progname, strerror(errno)); else { /* glibc sunrpc code dies if getdtablesize > FD_SETSIZE */ if ((descriptors == 0 && rlim.rlim_cur > FD_SETSIZE) || @@ -808,14 +811,14 @@ main(int argc, char **argv) rlim.rlim_cur = descriptors; if (setrlimit (RLIMIT_NOFILE, &rlim) != 0) { fprintf(stderr, "%s: setrlimit (RLIMIT_NOFILE) failed: %s\n", - argv [0], strerror(errno)); + progname, strerror(errno)); exit(1); } } } /* Initialize logging. */ if (!foreground) xlog_stderr(0); - xlog_open("mountd"); + xlog_open(progname); sa.sa_handler = SIG_IGN; sa.sa_flags = 0; @@ -835,6 +838,7 @@ main(int argc, char **argv) if (new_cache) cache_open(); + unregister_services(); if (version2()) { listeners += nfs_svc_create("mountd", MOUNTPROG, MOUNTVERS, mount_dispatch, port); @@ -886,9 +890,11 @@ main(int argc, char **argv) if (num_threads > 1) fork_workers(); + xlog(L_NOTICE, "Version " VERSION " starting"); my_svc_run(); - xlog(L_ERROR, "Ack! Gack! svc_run returned!\n"); + xlog(L_ERROR, "RPC service loop terminated unexpectedly. Exiting...\n"); + unregister_services(); exit(1); }