]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/configfile.c
pdate addres for Free Software Foundation
[nfs-utils.git] / utils / mount / configfile.c
index e347b0ebcaf3fed77f86b873c25a3e77b6bd5ec7..6f2ee75f11c9c159124f2127914c819f12c9bacf 100644 (file)
 #include <config.h>
 #endif
 #include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
+#include <errno.h>
 
 #include "xlog.h"
+#include "mount.h"
+#include "parse_opt.h"
+#include "network.h"
 #include "conffile.h"
 
 #define KBYTES(x)     ((x) * (1024))
@@ -185,6 +191,87 @@ void free_all(void)
                free(entry);
        }
 }
+static char *versions[] = {"v2", "v3", "v4", "vers", "nfsvers", NULL};
+static int 
+check_vers(char *mopt, char *field)
+{
+       int i, found=0;
+
+       /*
+        * First check to see if the config setting is one 
+        * of the many version settings
+        */
+       for (i=0; versions[i]; i++) { 
+               if (strcasestr(field, versions[i]) != NULL) {
+                       found++;
+                       break;
+               }
+       }
+       if (!found)
+               return 0;
+       /*
+        * It appears the version is being set, now see
+        * if the version appears on the command 
+        */
+       for (i=0; versions[i]; i++)  {
+               if (strcasestr(mopt, versions[i]) != NULL)
+                       return 1;
+       }
+
+       return 0;
+}
+
+unsigned long config_default_vers;
+unsigned long config_default_proto;
+extern sa_family_t config_default_family;
+
+/*
+ * Check to see if a default value is being set.
+ * If so, set the appropriate global value which will 
+ * be used as the initial value in the server negation.
+ */
+static int 
+default_value(char *mopt)
+{
+       struct mount_options *options = NULL;
+       int dftlen = strlen("default");
+       char *field;
+
+       if (strncasecmp(mopt, "default", dftlen) != 0)
+               return 0;
+
+       field = mopt + dftlen;
+       if (strncasecmp(field, "proto", strlen("proto")) == 0) {
+               if ((options = po_split(field)) != NULL) {
+                       if (!nfs_nfs_protocol(options, &config_default_proto)) {
+                               xlog_warn("Unable to set default protocol : %s", 
+                                       strerror(errno));
+                       }
+                       if (!nfs_nfs_proto_family(options, &config_default_family)) {
+                               xlog_warn("Unable to set default family : %s", 
+                                       strerror(errno));
+                       }
+               } else {
+                       xlog_warn("Unable to alloc memory for default protocol");
+               }
+       } else if (strncasecmp(field, "vers", strlen("vers")) == 0) {
+               if ((options = po_split(field)) != NULL) {
+                       if (!nfs_nfs_version(options, &config_default_vers)) {
+                               xlog_warn("Unable to set default version: %s", 
+                                       strerror(errno));
+                               
+                       }
+               } else {
+                       xlog_warn("Unable to alloc memory for default version");
+               }
+       } else 
+               xlog_warn("Invalid default setting: '%s'", mopt);
+
+       if (options)
+               po_destroy(options);
+
+       return 1;
+}
 /*
  * Parse the given section of the configuration 
  * file to if there are any mount options set.
@@ -207,6 +294,12 @@ conf_parse_mntopts(char *section, char *arg, char *opts)
                snprintf(buf, BUFSIZ, "%s=", node->field);
                if (opts && strcasestr(opts, buf) != NULL)
                        continue;
+               /* 
+                * Protocol verions can be set in a number of ways
+                */
+               if (opts && check_vers(opts, node->field))
+                       continue;
+
                if (lookup_entry(node->field) != NULL)
                        continue;
                buf[0] = '\0';
@@ -302,15 +395,19 @@ char *conf_get_mntopts(char *spec, char *mount_point,
                free_all();
                return mount_opts;
        }
+
        if (mount_opts) {
                strcpy(config_opts, mount_opts);
                strcat(config_opts, ",");
        }
        SLIST_FOREACH(entry, &head, entries) {
+               if (default_value(entry->opt))
+                       continue;
                strcat(config_opts, entry->opt);
                strcat(config_opts, ",");
        }
-       *(strrchr(config_opts, ',')) = '\0';
+       if ((ptr = strrchr(config_opts, ',')) != NULL)
+               *ptr = '\0';
 
        free_all();
        if (mount_opts)