X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fmountd%2Fmountd.c;h=a4fdcc8a98082decf805e826b2a039ecfb962b83;hb=b551b1fd0052de9b8c674b30c39d9f2a1e9d79cc;hp=98b396dbffd278fcc71b389b55d91a0f4990167a;hpb=454aea5dad83ca75f3154ff12ecff39169703e69;p=nfs-utils.git diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c index 98b396d..a4fdcc8 100644 --- a/utils/mountd/mountd.c +++ b/utils/mountd/mountd.c @@ -28,10 +28,6 @@ #include "rpcmisc.h" #include "pseudoflavors.h" -extern void cache_open(void); -extern struct nfs_fh_len *cache_get_filehandle(nfs_export *exp, int len, char *p); -extern int cache_export(nfs_export *exp, char *path); - extern void my_svc_run(void); static void usage(const char *, int exitcode); @@ -75,17 +71,40 @@ static struct option longopts[] = { NULL, 0, 0, 0 } }; -static int nfs_version = -1; +#define NFSVERSBIT(vers) (0x1 << (vers - 1)) +#define NFSVERSBIT_ALL (NFSVERSBIT(2) | NFSVERSBIT(3) | NFSVERSBIT(4)) + +static int nfs_version = NFSVERSBIT_ALL; + +static int version2(void) +{ + return nfs_version & NFSVERSBIT(2); +} + +static int version3(void) +{ + return nfs_version & NFSVERSBIT(3); +} + +static int version23(void) +{ + return nfs_version & (NFSVERSBIT(2) | NFSVERSBIT(3)); +} + +static int version_any(void) +{ + return nfs_version & NFSVERSBIT_ALL; +} static void unregister_services (void) { - if (nfs_version & (0x1 << 1)) { - pmap_unset (MOUNTPROG, MOUNTVERS); - pmap_unset (MOUNTPROG, MOUNTVERS_POSIX); + if (version2()) { + nfs_svc_unregister(MOUNTPROG, MOUNTVERS); + nfs_svc_unregister(MOUNTPROG, MOUNTVERS_POSIX); } - if (nfs_version & (0x1 << 2)) - pmap_unset (MOUNTPROG, MOUNTVERS_NFSV3); + if (version3()) + nfs_svc_unregister(MOUNTPROG, MOUNTVERS_NFSV3); } static void @@ -673,10 +692,12 @@ main(int argc, char **argv) { char *export_file = _PATH_EXPORTS; char *state_dir = NFS_STATEDIR; + unsigned int listeners = 0; int foreground = 0; int port = 0; int descriptors = 0; int c; + int vers; struct sigaction sa; struct rlimit rlim; @@ -720,7 +741,13 @@ main(int argc, char **argv) } break; case 'N': - nfs_version &= ~(1 << (atoi (optarg) - 1)); + vers = atoi(optarg); + if (vers < 2 || vers > 4) { + fprintf(stderr, "%s: bad version number: %s\n", + argv[0], optarg); + usage(argv[0], 1); + } + nfs_version &= ~NFSVERSBIT(vers); break; case 'n': _rpcfdtype = SOCK_DGRAM; @@ -739,7 +766,13 @@ main(int argc, char **argv) num_threads = atoi (optarg); break; case 'V': - nfs_version |= 1 << (atoi (optarg) - 1); + vers = atoi(optarg); + if (vers < 2 || vers > 4) { + fprintf(stderr, "%s: bad version number: %s\n", + argv[0], optarg); + usage(argv[0], 1); + } + nfs_version |= NFSVERSBIT(vers); break; case 'v': printf("kmountd %s\n", VERSION); @@ -754,7 +787,7 @@ main(int argc, char **argv) /* No more arguments allowed. * Require at least one valid version (2, 3, or 4) */ - if (optind != argc || !(nfs_version & 0xE)) + if (optind != argc || !version_any()) usage(argv [0], 1); if (chdir(state_dir)) { @@ -802,15 +835,17 @@ main(int argc, char **argv) if (new_cache) cache_open(); - if (nfs_version & (0x1 << 1)) { - rpc_init("mountd", MOUNTPROG, MOUNTVERS, - mount_dispatch, port); - rpc_init("mountd", MOUNTPROG, MOUNTVERS_POSIX, - mount_dispatch, port); + if (version2()) { + listeners += nfs_svc_create("mountd", MOUNTPROG, + MOUNTVERS, mount_dispatch, port); + listeners += nfs_svc_create("mountd", MOUNTPROG, + MOUNTVERS_POSIX, mount_dispatch, port); } - if (nfs_version & (0x1 << 2)) - rpc_init("mountd", MOUNTPROG, MOUNTVERS_NFSV3, - mount_dispatch, port); + if (version3()) + listeners += nfs_svc_create("mountd", MOUNTPROG, + MOUNTVERS_NFSV3, mount_dispatch, port); + if (version23() && listeners == 0) + xlog(L_FATAL, "mountd: could not create listeners\n"); sa.sa_handler = killer; sigaction(SIGINT, &sa, NULL);