]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/mountd.c
Support sec= option to specify export security
[nfs-utils.git] / utils / mountd / mountd.c
index e151fa2246eee9c390a0aee88996be0a3b85b808..999f035d9a0227426f3bd112fda3df6fda416321 100644 (file)
@@ -29,7 +29,7 @@
 
 extern void    cache_open(void);
 extern struct nfs_fh_len *cache_get_filehandle(nfs_export *exp, int len, char *p);
-extern void cache_export(nfs_export *exp);
+extern int cache_export(nfs_export *exp, char *path);
 
 extern void my_svc_run(void);
 
@@ -37,7 +37,9 @@ static void           usage(const char *, int exitcode);
 static exports         get_exportlist(void);
 static struct nfs_fh_len *get_rootfh(struct svc_req *, dirpath *, mountstat3 *, int v3);
 
+int reverse_resolve = 0;
 int new_cache = 0;
+int manage_gids;
 
 /* PRC: a high-availability callout program can be specified with -H
  * When this is done, the program will receive callouts whenever clients
@@ -66,6 +68,8 @@ static struct option longopts[] =
        { "ha-callout", 1, 0, 'H' },
        { "state-directory-path", 1, 0, 's' },
        { "num-threads", 1, 0, 't' },
+       { "reverse-lookup", 0, 0, 'r' },
+       { "manage-gids", 0, 0, 'g' },
        { NULL, 0, 0, 0 }
 };
 
@@ -395,7 +399,7 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, mountstat3 *error, int v3)
                     p, strerror(errno));
                *error = NFSERR_NOENT;
        } else if (estb.st_dev != stb.st_dev
-                  /* && (!new_cache || !(exp->m_export.e_flags & NFSEXP_CROSSMOUNT)) */
+                  && (!new_cache || !(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);
@@ -414,7 +418,10 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, mountstat3 *error, int v3)
                 */
                struct nfs_fh_len  *fh;
 
-               cache_export(exp);
+               if (cache_export(exp, p)) {
+                       *error = NFSERR_ACCES;
+                       return NULL;
+               }
                fh = cache_get_filehandle(exp, v3?64:32, p);
                if (fh == NULL) 
                        *error = NFSERR_ACCES;
@@ -462,10 +469,15 @@ get_exportlist(void)
        struct groupnode        *g, *ng, *c, **cp;
        nfs_export              *exp;
        int                     i;
+       static unsigned int     ecounter;
+       unsigned int            acounter;
 
-       if (!auth_reload() && elist)
+       acounter = auth_reload();
+       if (elist && acounter == ecounter)
                return elist;
 
+       ecounter = acounter;
+
        for (e = elist; e != NULL; e = ne) {
                ne = e->ex_next;
                for (g = e->ex_groups; g != NULL; g = ng) {
@@ -557,8 +569,11 @@ main(int argc, char **argv)
 
        /* Parse the command line options and arguments. */
        opterr = 0;
-       while ((c = getopt_long(argc, argv, "o:nFd:f:p:P:hH:N:V:vs:t:", longopts, NULL)) != EOF)
+       while ((c = getopt_long(argc, argv, "o:nFd:f:p:P:hH:N:V:vrs:t:g", longopts, NULL)) != EOF)
                switch (c) {
+               case 'g':
+                       manage_gids = 1;
+                       break;
                case 'o':
                        descriptors = atoi(optarg);
                        if (descriptors <= 0) {
@@ -597,6 +612,9 @@ main(int argc, char **argv)
                case 'n':
                        _rpcfdtype = SOCK_DGRAM;
                        break;
+               case 'r':
+                       reverse_resolve = 1;
+                       break;
                case 's':
                        if ((state_dir = xstrdup(optarg)) == NULL) {
                                fprintf(stderr, "%s: xstrdup(%s) failed!\n",
@@ -733,6 +751,6 @@ usage(const char *prog, int n)
 "      [-p|--port port] [-V version|--nfs-version version]\n"
 "      [-N version|--no-nfs-version version] [-n|--no-tcp]\n"
 "      [-H ha-callout-prog] [-s|--state-directory-path path]\n"
-"      [-t num|--num-threads=num]\n", prog);
+"      [-g|--manage-gids] [-t num|--num-threads=num]\n", prog);
        exit(n);
 }