Merge branch 'moonshot' of ssh://moonshot.suchdamage.org:822/srv/git/libeap into...
[libeap.git] / wpa_supplicant / config_file.c
index 29e494c..0f343fd 100644 (file)
@@ -22,7 +22,6 @@
 #include "config.h"
 #include "base64.h"
 #include "uuid.h"
-#include "eap_peer/eap_methods.h"
 
 
 /**
@@ -270,237 +269,6 @@ static int wpa_config_process_blob(struct wpa_config *config, FILE *f,
 #endif /* CONFIG_NO_CONFIG_BLOBS */
 
 
-struct global_parse_data {
-       char *name;
-       int (*parser)(const struct global_parse_data *data,
-                     struct wpa_config *config, int line, const char *value);
-       void *param1, *param2, *param3;
-};
-
-
-static int wpa_config_parse_int(const struct global_parse_data *data,
-                               struct wpa_config *config, int line,
-                               const char *pos)
-{
-       int *dst;
-       dst = (int *) (((u8 *) config) + (long) data->param1);
-       *dst = atoi(pos);
-       wpa_printf(MSG_DEBUG, "%s=%d", data->name, *dst);
-
-       if (data->param2 && *dst < (long) data->param2) {
-               wpa_printf(MSG_ERROR, "Line %d: too small %s (value=%d "
-                          "min_value=%ld)", line, data->name, *dst,
-                          (long) data->param2);
-               *dst = (long) data->param2;
-               return -1;
-       }
-
-       if (data->param3 && *dst > (long) data->param3) {
-               wpa_printf(MSG_ERROR, "Line %d: too large %s (value=%d "
-                          "max_value=%ld)", line, data->name, *dst,
-                          (long) data->param3);
-               *dst = (long) data->param3;
-               return -1;
-       }
-
-       return 0;
-}
-
-
-static int wpa_config_parse_str(const struct global_parse_data *data,
-                               struct wpa_config *config, int line,
-                               const char *pos)
-{
-       size_t len;
-       char **dst, *tmp;
-
-       len = os_strlen(pos);
-       if (data->param2 && len < (size_t) data->param2) {
-               wpa_printf(MSG_ERROR, "Line %d: too short %s (len=%lu "
-                          "min_len=%ld)", line, data->name,
-                          (unsigned long) len, (long) data->param2);
-               return -1;
-       }
-
-       if (data->param3 && len > (size_t) data->param3) {
-               wpa_printf(MSG_ERROR, "Line %d: too long %s (len=%lu "
-                          "max_len=%ld)", line, data->name,
-                          (unsigned long) len, (long) data->param3);
-               return -1;
-       }
-
-       tmp = os_strdup(pos);
-       if (tmp == NULL)
-               return -1;
-
-       dst = (char **) (((u8 *) config) + (long) data->param1);
-       os_free(*dst);
-       *dst = tmp;
-       wpa_printf(MSG_DEBUG, "%s='%s'", data->name, *dst);
-
-       return 0;
-}
-
-
-static int wpa_config_process_country(const struct global_parse_data *data,
-                                     struct wpa_config *config, int line,
-                                     const char *pos)
-{
-       if (!pos[0] || !pos[1]) {
-               wpa_printf(MSG_DEBUG, "Invalid country set");
-               return -1;
-       }
-       config->country[0] = pos[0];
-       config->country[1] = pos[1];
-       wpa_printf(MSG_DEBUG, "country='%c%c'",
-                  config->country[0], config->country[1]);
-       return 0;
-}
-
-
-static int wpa_config_process_load_dynamic_eap(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *so)
-{
-       int ret;
-       wpa_printf(MSG_DEBUG, "load_dynamic_eap=%s", so);
-       ret = eap_peer_method_load(so);
-       if (ret == -2) {
-               wpa_printf(MSG_DEBUG, "This EAP type was already loaded - not "
-                          "reloading.");
-       } else if (ret) {
-               wpa_printf(MSG_ERROR, "Line %d: Failed to load dynamic EAP "
-                          "method '%s'.", line, so);
-               return -1;
-       }
-
-       return 0;
-}
-
-
-#ifdef CONFIG_WPS
-
-static int wpa_config_process_uuid(const struct global_parse_data *data,
-                                  struct wpa_config *config, int line,
-                                  const char *pos)
-{
-       char buf[40];
-       if (uuid_str2bin(pos, config->uuid)) {
-               wpa_printf(MSG_ERROR, "Line %d: invalid UUID", line);
-               return -1;
-       }
-       uuid_bin2str(config->uuid, buf, sizeof(buf));
-       wpa_printf(MSG_DEBUG, "uuid=%s", buf);
-       return 0;
-}
-
-
-static int wpa_config_process_os_version(const struct global_parse_data *data,
-                                        struct wpa_config *config, int line,
-                                        const char *pos)
-{
-       if (hexstr2bin(pos, config->os_version, 4)) {
-               wpa_printf(MSG_ERROR, "Line %d: invalid os_version", line);
-               return -1;
-       }
-       wpa_printf(MSG_DEBUG, "os_version=%08x",
-                  WPA_GET_BE32(config->os_version));
-       return 0;
-}
-
-#endif /* CONFIG_WPS */
-
-
-#ifdef OFFSET
-#undef OFFSET
-#endif /* OFFSET */
-/* OFFSET: Get offset of a variable within the wpa_config structure */
-#define OFFSET(v) ((void *) &((struct wpa_config *) 0)->v)
-
-#define FUNC(f) #f, wpa_config_process_ ## f, OFFSET(f), NULL, NULL
-#define FUNC_NO_VAR(f) #f, wpa_config_process_ ## f, NULL, NULL, NULL
-#define _INT(f) #f, wpa_config_parse_int, OFFSET(f)
-#define INT(f) _INT(f), NULL, NULL
-#define INT_RANGE(f, min, max) _INT(f), (void *) min, (void *) max
-#define _STR(f) #f, wpa_config_parse_str, OFFSET(f)
-#define STR(f) _STR(f), NULL, NULL
-#define STR_RANGE(f, min, max) _STR(f), (void *) min, (void *) max
-
-static const struct global_parse_data global_fields[] = {
-#ifdef CONFIG_CTRL_IFACE
-       { STR(ctrl_interface) },
-       { STR(ctrl_interface_group) } /* deprecated */,
-#endif /* CONFIG_CTRL_IFACE */
-       { INT_RANGE(eapol_version, 1, 2) },
-       { INT(ap_scan) },
-       { INT(fast_reauth) },
-#ifdef EAP_TLS_OPENSSL
-       { STR(opensc_engine_path) },
-       { STR(pkcs11_engine_path) },
-       { STR(pkcs11_module_path) },
-#endif /* EAP_TLS_OPENSSL */
-       { STR(driver_param) },
-       { INT(dot11RSNAConfigPMKLifetime) },
-       { INT(dot11RSNAConfigPMKReauthThreshold) },
-       { INT(dot11RSNAConfigSATimeout) },
-#ifndef CONFIG_NO_CONFIG_WRITE
-       { INT(update_config) },
-#endif /* CONFIG_NO_CONFIG_WRITE */
-       { FUNC_NO_VAR(load_dynamic_eap) },
-#ifdef CONFIG_WPS
-       { FUNC(uuid) },
-       { STR_RANGE(device_name, 0, 32) },
-       { STR_RANGE(manufacturer, 0, 64) },
-       { STR_RANGE(model_name, 0, 32) },
-       { STR_RANGE(model_number, 0, 32) },
-       { STR_RANGE(serial_number, 0, 32) },
-       { STR(device_type) },
-       { FUNC(os_version) },
-       { INT_RANGE(wps_cred_processing, 0, 2) },
-#endif /* CONFIG_WPS */
-       { FUNC(country) }
-};
-
-#undef FUNC
-#undef _INT
-#undef INT
-#undef INT_RANGE
-#undef _STR
-#undef STR
-#undef STR_RANGE
-#define NUM_GLOBAL_FIELDS (sizeof(global_fields) / sizeof(global_fields[0]))
-
-
-static int wpa_config_process_global(struct wpa_config *config, char *pos,
-                                    int line)
-{
-       size_t i;
-       int ret = 0;
-
-       for (i = 0; i < NUM_GLOBAL_FIELDS; i++) {
-               const struct global_parse_data *field = &global_fields[i];
-               size_t flen = os_strlen(field->name);
-               if (os_strncmp(pos, field->name, flen) != 0 ||
-                   pos[flen] != '=')
-                       continue;
-
-               if (field->parser(field, config, line, pos + flen + 1)) {
-                       wpa_printf(MSG_ERROR, "Line %d: failed to "
-                                  "parse '%s'.", line, pos);
-                       ret = -1;
-               }
-               break;
-       }
-       if (i == NUM_GLOBAL_FIELDS) {
-               wpa_printf(MSG_ERROR, "Line %d: unknown global field '%s'.",
-                          line, pos);
-               ret = -1;
-       }
-
-       return ret;
-}
-
-
 struct wpa_config * wpa_config_read(const char *name)
 {
        FILE *f;
@@ -837,7 +605,6 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
                fprintf(f, "ap_scan=%d\n", config->ap_scan);
        if (config->fast_reauth != DEFAULT_FAST_REAUTH)
                fprintf(f, "fast_reauth=%d\n", config->fast_reauth);
-#ifdef EAP_TLS_OPENSSL
        if (config->opensc_engine_path)
                fprintf(f, "opensc_engine_path=%s\n",
                        config->opensc_engine_path);
@@ -847,7 +614,6 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
        if (config->pkcs11_module_path)
                fprintf(f, "pkcs11_module_path=%s\n",
                        config->pkcs11_module_path);
-#endif /* EAP_TLS_OPENSSL */
        if (config->driver_param)
                fprintf(f, "driver_param=%s\n", config->driver_param);
        if (config->dot11RSNAConfigPMKLifetime)
@@ -882,14 +648,43 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
        if (WPA_GET_BE32(config->os_version))
                fprintf(f, "os_version=%08x\n",
                        WPA_GET_BE32(config->os_version));
+       if (config->config_methods)
+               fprintf(f, "config_methods=%s\n", config->config_methods);
        if (config->wps_cred_processing)
                fprintf(f, "wps_cred_processing=%d\n",
                        config->wps_cred_processing);
 #endif /* CONFIG_WPS */
+#ifdef CONFIG_P2P
+       if (config->p2p_listen_reg_class)
+               fprintf(f, "p2p_listen_reg_class=%u\n",
+                       config->p2p_listen_reg_class);
+       if (config->p2p_listen_channel)
+               fprintf(f, "p2p_listen_channel=%u\n",
+                       config->p2p_listen_channel);
+       if (config->p2p_oper_reg_class)
+               fprintf(f, "p2p_oper_reg_class=%u\n",
+                       config->p2p_oper_reg_class);
+       if (config->p2p_oper_channel)
+               fprintf(f, "p2p_oper_channel=%u\n", config->p2p_oper_channel);
+       if (config->p2p_go_intent != DEFAULT_P2P_GO_INTENT)
+               fprintf(f, "p2p_go_intent=%u\n", config->p2p_go_intent);
+       if (config->p2p_ssid_postfix)
+               fprintf(f, "p2p_ssid_postfix=%s\n", config->p2p_ssid_postfix);
+       if (config->persistent_reconnect)
+               fprintf(f, "persistent_reconnect=%u\n",
+                       config->persistent_reconnect);
+       if (config->p2p_intra_bss != DEFAULT_P2P_INTRA_BSS)
+               fprintf(f, "p2p_intra_bss=%u\n", config->p2p_intra_bss);
+
+#endif /* CONFIG_P2P */
        if (config->country[0] && config->country[1]) {
                fprintf(f, "country=%c%c\n",
                        config->country[0], config->country[1]);
        }
+       if (config->bss_max_count != DEFAULT_BSS_MAX_COUNT)
+               fprintf(f, "bss_max_count=%u\n", config->bss_max_count);
+       if (config->filter_ssids)
+               fprintf(f, "filter_ssids=%d\n", config->filter_ssids);
 }
 
 #endif /* CONFIG_NO_CONFIG_WRITE */
@@ -916,8 +711,8 @@ int wpa_config_write(const char *name, struct wpa_config *config)
        wpa_config_write_global(f, config);
 
        for (ssid = config->ssid; ssid; ssid = ssid->next) {
-               if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
-                       continue; /* do not save temporary WPS networks */
+               if (ssid->key_mgmt == WPA_KEY_MGMT_WPS || ssid->temporary)
+                       continue; /* do not save temporary networks */
                fprintf(f, "\nnetwork={\n");
                wpa_config_write_network(f, ssid);
                fprintf(f, "}\n");