]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wpa_supplicant: Add option -I for additional config file
authorDmitry Shmidt <dimitrysh@google.com>
Tue, 23 Apr 2013 14:38:57 +0000 (17:38 +0300)
committerJouni Malinen <j@w1.fi>
Tue, 23 Apr 2013 14:38:57 +0000 (17:38 +0300)
This option can be used only for global parameters that are not going
to be changed from settings.

Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Signed-off-by: Iliyan Malchev <malchev@google.com>
src/utils/os_unix.c
wpa_supplicant/config.h
wpa_supplicant/config_file.c
wpa_supplicant/config_none.c
wpa_supplicant/config_winreg.c
wpa_supplicant/eapol_test.c
wpa_supplicant/main.c
wpa_supplicant/preauth_test.c
wpa_supplicant/wpa_supplicant.c
wpa_supplicant/wpa_supplicant_i.h

index cc22e83ccea0c0060b52ab399c52ee7449092f62..40ad9d4826bcff9f4496ed8c1eb015f2a89dd87a 100644 (file)
@@ -213,6 +213,9 @@ char * os_rel2abs_path(const char *rel_path)
        size_t len = 128, cwd_len, rel_len, ret_len;
        int last_errno;
 
+       if (!rel_path)
+               return NULL;
+
        if (rel_path[0] == '/')
                return os_strdup(rel_path);
 
index 1315e7bd55e1fea7f5140eb3fca13b43c3890148..4a175ce9918801b91df40a968f04bbdb159bb322 100644 (file)
@@ -912,6 +912,7 @@ int wpa_config_process_global(struct wpa_config *config, char *pos, int line);
  * wpa_config_read - Read and parse configuration database
  * @name: Name of the configuration (e.g., path and file name for the
  * configuration file)
+ * @cfgp: Pointer to previously allocated configuration data or %NULL if none
  * Returns: Pointer to allocated configuration data or %NULL on failure
  *
  * This function reads configuration data, parses its contents, and allocates
@@ -920,7 +921,7 @@ int wpa_config_process_global(struct wpa_config *config, char *pos, int line);
  *
  * Each configuration backend needs to implement this function.
  */
-struct wpa_config * wpa_config_read(const char *name);
+struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp);
 
 /**
  * wpa_config_write - Write or update configuration data
index 5ca6bf2c6486dc3dd28af19fbc211310a6e86a4d..8604ae8a41c09baba4b9cdc63dcd0745d63988b2 100644 (file)
@@ -345,7 +345,7 @@ static int wpa_config_process_blob(struct wpa_config *config, FILE *f,
 #endif /* CONFIG_NO_CONFIG_BLOBS */
 
 
-struct wpa_config * wpa_config_read(const char *name)
+struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp)
 {
        FILE *f;
        char buf[512], *pos;
@@ -356,12 +356,19 @@ struct wpa_config * wpa_config_read(const char *name)
        int id = 0;
        int cred_id = 0;
 
-       config = wpa_config_alloc_empty(NULL, NULL);
+       if (name == NULL)
+               return NULL;
+       if (cfgp)
+               config = cfgp;
+       else
+               config = wpa_config_alloc_empty(NULL, NULL);
        if (config == NULL) {
                wpa_printf(MSG_ERROR, "Failed to allocate config file "
                           "structure");
                return NULL;
        }
+       head = config->ssid;
+       cred_head = config->cred;
 
        wpa_printf(MSG_DEBUG, "Reading configuration file '%s'", name);
        f = fopen(name, "r");
index 589ea3620d15cf729fc4f9b27429070cc5ada064..2aac28fa3d172c536c142b560fb40ed08e6ba2fb 100644 (file)
 #include "base64.h"
 
 
-struct wpa_config * wpa_config_read(const char *name)
+struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp)
 {
        struct wpa_config *config;
 
-       config = wpa_config_alloc_empty(NULL, NULL);
+       if (name == NULL)
+               return NULL;
+       if (cfgp)
+               config = cfgp;
+       else
+               config = wpa_config_alloc_empty(NULL, NULL);
        if (config == NULL)
                return NULL;
        /* TODO: fill in configuration data */
index 2750b63734ae8bc071737a9a9fc9cc0274b57f18..3cf3a91ff66ddf9962fd53ad854f5b39a74b61ae 100644 (file)
@@ -434,7 +434,7 @@ static int wpa_config_read_networks(struct wpa_config *config, HKEY hk)
 }
 
 
-struct wpa_config * wpa_config_read(const char *name)
+struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp)
 {
        TCHAR buf[256];
        int errors = 0;
@@ -442,7 +442,12 @@ struct wpa_config * wpa_config_read(const char *name)
        HKEY hk;
        LONG ret;
 
-       config = wpa_config_alloc_empty(NULL, NULL);
+       if (name == NULL)
+               return NULL;
+       if (cfgp)
+               config = cfgp;
+       else
+               config = wpa_config_alloc_empty(NULL, NULL);
        if (config == NULL)
                return NULL;
        wpa_printf(MSG_DEBUG, "Reading configuration profile '%s'", name);
index 87e399c72238ff2063041eef58ee5728fcacd8f8..dad27654e9aee0e68af6f4d179ed83eae5d424ee 100644 (file)
@@ -1232,7 +1232,7 @@ int main(int argc, char *argv[])
 
        os_memset(&wpa_s, 0, sizeof(wpa_s));
        eapol_test.wpa_s = &wpa_s;
-       wpa_s.conf = wpa_config_read(conf);
+       wpa_s.conf = wpa_config_read(conf, NULL);
        if (wpa_s.conf == NULL) {
                printf("Failed to parse configuration file '%s'.\n", conf);
                return -1;
index 19f7ce6679edda7b285988ee6a4e1a2714f0a9c8..1744620453c8a4a9ca145f0f103aa33eefe7b92d 100644 (file)
@@ -32,7 +32,8 @@ static void usage(void)
               "        [-o<override driver>] [-O<override ctrl>] \\\n"
               "        [-N -i<ifname> -c<conf> [-C<ctrl>] "
               "[-D<driver>] \\\n"
-              "        [-p<driver_param>] [-b<br_ifname>] ...]\n"
+              "        [-p<driver_param>] [-b<br_ifname>] [-I<config file>] "
+              "...]\n"
               "\n"
               "drivers:\n",
               wpa_supplicant_version, wpa_supplicant_license);
@@ -50,6 +51,7 @@ static void usage(void)
               "  -c = Configuration file\n"
               "  -C = ctrl_interface parameter (only used if -c is not)\n"
               "  -i = interface name\n"
+              "  -I = additional configuration file\n"
               "  -d = increase debugging verbosity (-dd even more)\n"
               "  -D = driver name (can be multiple drivers: nl80211,wext)\n"
               "  -e = entropy file\n");
@@ -155,7 +157,7 @@ int main(int argc, char *argv[])
 
        for (;;) {
                c = getopt(argc, argv,
-                          "b:Bc:C:D:de:f:g:hi:KLNo:O:p:P:qsTtuvW");
+                          "b:Bc:C:D:de:f:g:hi:I:KLNo:O:p:P:qsTtuvW");
                if (c < 0)
                        break;
                switch (c) {
@@ -202,6 +204,9 @@ int main(int argc, char *argv[])
                case 'i':
                        iface->ifname = optarg;
                        break;
+               case 'I':
+                       iface->confanother = optarg;
+                       break;
                case 'K':
                        params.wpa_debug_show_keys++;
                        break;
index 3503e65e576bf596a6fcbcbfc66c4d7fb2b7d64d..ff2ae747a9b9a7dba5c4ccc55a4c0371b5b501fd 100644 (file)
@@ -309,7 +309,7 @@ int main(int argc, char *argv[])
        }
 
        os_memset(&wpa_s, 0, sizeof(wpa_s));
-       wpa_s.conf = wpa_config_read(argv[1]);
+       wpa_s.conf = wpa_config_read(argv[1], NULL);
        if (wpa_s.conf == NULL) {
                printf("Failed to parse configuration file '%s'.\n", argv[1]);
                return -1;
index c6b45f3b2df0c5ed8429a0bdb14e6fc988221afc..8a7bbd940fc09b69f1f1d70cda5c56db618303e0 100644 (file)
@@ -399,6 +399,9 @@ static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
        os_free(wpa_s->confname);
        wpa_s->confname = NULL;
 
+       os_free(wpa_s->confanother);
+       wpa_s->confanother = NULL;
+
        wpa_sm_set_eapol(wpa_s->wpa, NULL);
        eapol_sm_deinit(wpa_s->eapol);
        wpa_s->eapol = NULL;
@@ -760,12 +763,14 @@ int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
 
        if (wpa_s->confname == NULL)
                return -1;
-       conf = wpa_config_read(wpa_s->confname);
+       conf = wpa_config_read(wpa_s->confname, NULL);
        if (conf == NULL) {
                wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
                        "file '%s' - exiting", wpa_s->confname);
                return -1;
        }
+       wpa_config_read(wpa_s->confanother, conf);
+
        conf->changed_parameters = (unsigned int) -1;
 
        reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
@@ -2801,12 +2806,14 @@ static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
 #else /* CONFIG_BACKEND_FILE */
                wpa_s->confname = os_strdup(iface->confname);
 #endif /* CONFIG_BACKEND_FILE */
-               wpa_s->conf = wpa_config_read(wpa_s->confname);
+               wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
                if (wpa_s->conf == NULL) {
                        wpa_printf(MSG_ERROR, "Failed to read or parse "
                                   "configuration '%s'.", wpa_s->confname);
                        return -1;
                }
+               wpa_s->confanother = os_rel2abs_path(iface->confanother);
+               wpa_config_read(wpa_s->confanother, wpa_s->conf);
 
                /*
                 * Override ctrl_interface and driver_param if set on command
index 030880627f683be576b2f7dafe1e736a2accd1f1..f96b245b721cd7af8e9f5fc27e142a3c713e9276 100644 (file)
@@ -55,6 +55,14 @@ struct wpa_interface {
         */
        const char *confname;
 
+       /**
+        * confanother - Additional configuration name (file or profile) name
+        *
+        * This can also be %NULL when the additional configuration file is not
+        * used.
+        */
+       const char *confanother;
+
        /**
         * ctrl_interface - Control interface parameter
         *
@@ -307,6 +315,7 @@ struct wpa_supplicant {
        char bridge_ifname[16];
 
        char *confname;
+       char *confanother;
        struct wpa_config *conf;
        int countermeasures;
        os_time_t last_michael_mic_error;