From e6304cad47251e88d073553042f1ea7805a858d1 Mon Sep 17 00:00:00 2001 From: Dmitry Shmidt Date: Tue, 23 Apr 2013 17:38:57 +0300 Subject: [PATCH] wpa_supplicant: Add option -I for additional config file This option can be used only for global parameters that are not going to be changed from settings. Signed-off-by: Dmitry Shmidt Signed-off-by: Iliyan Malchev --- src/utils/os_unix.c | 3 +++ wpa_supplicant/config.h | 3 ++- wpa_supplicant/config_file.c | 11 +++++++++-- wpa_supplicant/config_none.c | 9 +++++++-- wpa_supplicant/config_winreg.c | 9 +++++++-- wpa_supplicant/eapol_test.c | 2 +- wpa_supplicant/main.c | 9 +++++++-- wpa_supplicant/preauth_test.c | 2 +- wpa_supplicant/wpa_supplicant.c | 11 +++++++++-- wpa_supplicant/wpa_supplicant_i.h | 9 +++++++++ 10 files changed, 55 insertions(+), 13 deletions(-) diff --git a/src/utils/os_unix.c b/src/utils/os_unix.c index cc22e83cc..40ad9d482 100644 --- a/src/utils/os_unix.c +++ b/src/utils/os_unix.c @@ -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); diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h index 1315e7bd5..4a175ce99 100644 --- a/wpa_supplicant/config.h +++ b/wpa_supplicant/config.h @@ -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 diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c index 5ca6bf2c6..8604ae8a4 100644 --- a/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c @@ -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"); diff --git a/wpa_supplicant/config_none.c b/wpa_supplicant/config_none.c index 589ea3620..2aac28fa3 100644 --- a/wpa_supplicant/config_none.c +++ b/wpa_supplicant/config_none.c @@ -17,11 +17,16 @@ #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 */ diff --git a/wpa_supplicant/config_winreg.c b/wpa_supplicant/config_winreg.c index 2750b6373..3cf3a91ff 100644 --- a/wpa_supplicant/config_winreg.c +++ b/wpa_supplicant/config_winreg.c @@ -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); diff --git a/wpa_supplicant/eapol_test.c b/wpa_supplicant/eapol_test.c index 87e399c72..dad27654e 100644 --- a/wpa_supplicant/eapol_test.c +++ b/wpa_supplicant/eapol_test.c @@ -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; diff --git a/wpa_supplicant/main.c b/wpa_supplicant/main.c index 19f7ce667..174462045 100644 --- a/wpa_supplicant/main.c +++ b/wpa_supplicant/main.c @@ -32,7 +32,8 @@ static void usage(void) " [-o] [-O] \\\n" " [-N -i -c [-C] " "[-D] \\\n" - " [-p] [-b] ...]\n" + " [-p] [-b] [-I] " + "...]\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; diff --git a/wpa_supplicant/preauth_test.c b/wpa_supplicant/preauth_test.c index 3503e65e5..ff2ae747a 100644 --- a/wpa_supplicant/preauth_test.c +++ b/wpa_supplicant/preauth_test.c @@ -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; diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index c6b45f3b2..8a7bbd940 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -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 diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 030880627..f96b245b7 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -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;