]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/mountd.c
mountd: add IPv6 support in auth_authenticate()
[nfs-utils.git] / utils / mountd / mountd.c
index ecd7c35cd66e43b0ea2b9634bc6c841c7028a537..c8ea3f792ba87ea835738d29e5ca44b50840b6d5 100644 (file)
@@ -80,10 +80,10 @@ static int nfs_version = -1;
 static void
 unregister_services (void)
 {
-       if (nfs_version & 0x1)
+       if (nfs_version & (0x1 << 1)) {
                pmap_unset (MOUNTPROG, MOUNTVERS);
-       if (nfs_version & (0x1 << 1))
                pmap_unset (MOUNTPROG, MOUNTVERS_POSIX);
+       }
        if (nfs_version & (0x1 << 2))
                pmap_unset (MOUNTPROG, MOUNTVERS_NFSV3);
 }
@@ -192,7 +192,8 @@ sig_hup (int sig)
 }
 
 bool_t
-mount_null_1_svc(struct svc_req *rqstp, void *argp, void *resp)
+mount_null_1_svc(struct svc_req *UNUSED(rqstp), void *UNUSED(argp), 
+       void *UNUSED(resp))
 {
        return 1;
 }
@@ -210,7 +211,7 @@ mount_mnt_1_svc(struct svc_req *rqstp, dirpath *path, fhstatus *res)
 }
 
 bool_t
-mount_dump_1_svc(struct svc_req *rqstp, void *argp, mountlist *res)
+mount_dump_1_svc(struct svc_req *rqstp, void *UNUSED(argp), mountlist *res)
 {
        struct sockaddr_in *addr = nfs_getrpccaller_in(rqstp->rq_xprt);
 
@@ -221,7 +222,7 @@ mount_dump_1_svc(struct svc_req *rqstp, void *argp, mountlist *res)
 }
 
 bool_t
-mount_umnt_1_svc(struct svc_req *rqstp, dirpath *argp, void *resp)
+mount_umnt_1_svc(struct svc_req *rqstp, dirpath *argp, void *UNUSED(resp))
 {
        struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt);
        nfs_export      *exp;
@@ -236,16 +237,17 @@ mount_umnt_1_svc(struct svc_req *rqstp, dirpath *argp, void *resp)
                p = rpath;
        }
 
-       if (!(exp = auth_authenticate("unmount", sin, p))) {
+       exp = auth_authenticate("unmount", (struct sockaddr *)sin, p);
+       if (exp == NULL)
                return 1;
-       }
 
        mountlist_del(inet_ntoa(sin->sin_addr), p);
        return 1;
 }
 
 bool_t
-mount_umntall_1_svc(struct svc_req *rqstp, void *argp, void *resp)
+mount_umntall_1_svc(struct svc_req *rqstp, void *UNUSED(argp), 
+       void *UNUSED(resp))
 {
        /* Reload /etc/xtab if necessary */
        auth_reload();
@@ -255,7 +257,7 @@ mount_umntall_1_svc(struct svc_req *rqstp, void *argp, void *resp)
 }
 
 bool_t
-mount_export_1_svc(struct svc_req *rqstp, void *argp, exports *resp)
+mount_export_1_svc(struct svc_req *rqstp, void *UNUSED(argp), exports *resp)
 {
        struct sockaddr_in *addr = nfs_getrpccaller_in(rqstp->rq_xprt);
 
@@ -266,7 +268,7 @@ mount_export_1_svc(struct svc_req *rqstp, void *argp, exports *resp)
 }
 
 bool_t
-mount_exportall_1_svc(struct svc_req *rqstp, void *argp, exports *resp)
+mount_exportall_1_svc(struct svc_req *rqstp, void *UNUSED(argp), exports *resp)
 {
        struct sockaddr_in *addr = nfs_getrpccaller_in(rqstp->rq_xprt);
 
@@ -311,10 +313,10 @@ mount_pathconf_2_svc(struct svc_req *rqstp, dirpath *path, ppathcnf *res)
        }
 
        /* Now authenticate the intruder... */
-       exp = auth_authenticate("pathconf", sin, p);
-       if (!exp) {
+       exp = auth_authenticate("pathconf", (struct sockaddr *)sin, p);
+       if (exp == NULL)
                return 1;
-       else if (stat(p, &stb) < 0) {
+       else if (stat(p, &stb) < 0) {
                xlog(L_WARNING, "can't stat exported dir %s: %s",
                                p, strerror(errno));
                return 1;
@@ -413,8 +415,8 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret,
        }
 
        /* Now authenticate the intruder... */
-       exp = auth_authenticate("mount", sin, p);
-       if (!exp) {
+       exp = auth_authenticate("mount", (struct sockaddr *)sin, p);
+       if (exp == NULL) {
                *error = NFSERR_ACCES;
                return NULL;
        }
@@ -482,14 +484,13 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret,
                        xtab_append(exp);
 
                if (v3)
-                       fh = getfh_size ((struct sockaddr *) sin, p, 64);
+                       fh = getfh_size(sin, p, 64);
                if (!v3 || (fh == NULL && errno == EINVAL)) {
                        /* We first try the new nfs syscall. */
-                       fh = getfh ((struct sockaddr *) sin, p);
+                       fh = getfh(sin, p);
                        if (fh == NULL && errno == EINVAL)
                                /* Let's try the old one. */
-                               fh = getfh_old ((struct sockaddr *) sin,
-                                               stb.st_dev, stb.st_ino);
+                               fh = getfh_old(sin, stb.st_dev, stb.st_ino);
                }
                if (fh == NULL && !did_export) {
                        exp->m_exported = 0;
@@ -536,22 +537,21 @@ static void free_exportlist(exports *elist)
 
 static void prune_clients(nfs_export *exp, struct exportnode *e)
 {
-       struct hostent  *hp;
+       struct addrinfo *ai = NULL;
        struct groupnode *c, **cp;
 
        cp = &e->ex_groups;
        while ((c = *cp) != NULL) {
                if (client_gettype(c->gr_name) == MCL_FQDN
-                               && (hp = gethostbyname(c->gr_name))) {
-                       hp = hostent_dup(hp);
-                       if (client_check(exp->m_client, hp)) {
+                   && (ai = host_addrinfo(c->gr_name))) {
+                       if (client_check(exp->m_client, ai)) {
                                *cp = c->gr_next;
                                xfree(c->gr_name);
                                xfree(c);
-                               xfree (hp);
+                               freeaddrinfo(ai);
                                continue;
                        }
-                       xfree (hp);
+                       freeaddrinfo(ai);
                }
                cp = &(c->gr_next);
        }
@@ -612,20 +612,17 @@ get_exportlist(void)
                                continue;
                        e = lookup_or_create_elist_entry(&elist, exp);
 
-                       /* We need to check if we should remove
-                          previous ones. */
+                       /* exports to "*" absorb any others */
                        if (i == MCL_ANONYMOUS && e->ex_groups) {
                                remove_all_clients(e);
                                continue;
                        }
-
-                       if (i != MCL_FQDN && e->ex_groups) {
+                       /* non-FQDN's absorb FQDN's they contain: */
+                       if (i != MCL_FQDN && e->ex_groups)
                                prune_clients(exp, e);
-                       }
 
-                       if (exp->m_export.e_hostname [0] != '\0') {
+                       if (exp->m_export.e_hostname[0] != '\0')
                                insert_group(e, exp->m_export.e_hostname);
-                       }
                }
        }
 
@@ -715,8 +712,10 @@ main(int argc, char **argv)
                        usage(argv [0], 1);
                }
 
-       /* No more arguments allowed. */
-       if (optind != argc || !(nfs_version & 0x7))
+       /* No more arguments allowed.
+        * Require at least one valid version (2, 3, or 4)
+        */
+       if (optind != argc || !(nfs_version & 0xE))
                usage(argv [0], 1);
 
        if (chdir(state_dir)) {
@@ -764,12 +763,12 @@ main(int argc, char **argv)
        if (new_cache)
                cache_open();
 
-       if (nfs_version & 0x1)
+       if (nfs_version & (0x1 << 1)) {
                rpc_init("mountd", MOUNTPROG, MOUNTVERS,
                         mount_dispatch, port);
-       if (nfs_version & (0x1 << 1))
                rpc_init("mountd", MOUNTPROG, MOUNTVERS_POSIX,
                         mount_dispatch, port);
+       }
        if (nfs_version & (0x1 << 2))
                rpc_init("mountd", MOUNTPROG, MOUNTVERS_NFSV3,
                         mount_dispatch, port);