Merge branch 'moonshot' of ssh://moonshot.suchdamage.org:822/srv/git/libeap into...
[libeap.git] / wpa_supplicant / config_file.c
index 76a1935..0f343fd 100644 (file)
@@ -22,7 +22,6 @@
 #include "config.h"
 #include "base64.h"
 #include "uuid.h"
-#include "eap_peer/eap_methods.h"
 
 
 /**
@@ -270,341 +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;
-};
-
-
-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);
-       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;
-}
-
-
-#ifdef CONFIG_CTRL_IFACE
-static int wpa_config_process_ctrl_interface(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *pos)
-{
-       os_free(config->ctrl_interface);
-       config->ctrl_interface = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "ctrl_interface='%s'", config->ctrl_interface);
-       return 0;
-}
-
-
-static int wpa_config_process_ctrl_interface_group(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *pos)
-{
-       os_free(config->ctrl_interface_group);
-       config->ctrl_interface_group = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "ctrl_interface_group='%s' (DEPRECATED)",
-                  config->ctrl_interface_group);
-       return 0;
-}
-#endif /* CONFIG_CTRL_IFACE */
-
-
-static int wpa_config_process_eapol_version(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *pos)
-{
-       config->eapol_version = atoi(pos);
-       if (config->eapol_version < 1 || config->eapol_version > 2) {
-               wpa_printf(MSG_ERROR, "Line %d: Invalid EAPOL version (%d): "
-                          "'%s'.", line, config->eapol_version, pos);
-               return -1;
-       }
-       wpa_printf(MSG_DEBUG, "eapol_version=%d", config->eapol_version);
-       return 0;
-}
-
-
-#ifdef EAP_TLS_OPENSSL
-
-static int wpa_config_process_opensc_engine_path(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *pos)
-{
-       os_free(config->opensc_engine_path);
-       config->opensc_engine_path = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "opensc_engine_path='%s'",
-                  config->opensc_engine_path);
-       return 0;
-}
-
-
-static int wpa_config_process_pkcs11_engine_path(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *pos)
-{
-       os_free(config->pkcs11_engine_path);
-       config->pkcs11_engine_path = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "pkcs11_engine_path='%s'",
-                  config->pkcs11_engine_path);
-       return 0;
-}
-
-
-static int wpa_config_process_pkcs11_module_path(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *pos)
-{
-       os_free(config->pkcs11_module_path);
-       config->pkcs11_module_path = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "pkcs11_module_path='%s'",
-                  config->pkcs11_module_path);
-       return 0;
-}
-
-#endif /* EAP_TLS_OPENSSL */
-
-
-static int wpa_config_process_driver_param(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *pos)
-{
-       os_free(config->driver_param);
-       config->driver_param = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "driver_param='%s'", config->driver_param);
-       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_device_name(const struct global_parse_data *data,
-                                         struct wpa_config *config, int line,
-                                         const char *pos)
-{
-       if (os_strlen(pos) > 32)
-               return -1;
-       os_free(config->device_name);
-       config->device_name = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "device_name='%s'", config->device_name);
-       return 0;
-}
-
-
-static int wpa_config_process_manufacturer(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *pos)
-{
-       if (os_strlen(pos) > 64)
-               return -1;
-       os_free(config->manufacturer);
-       config->manufacturer = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "manufacturer='%s'", config->manufacturer);
-       return 0;
-}
-
-
-static int wpa_config_process_model_name(const struct global_parse_data *data,
-                                        struct wpa_config *config, int line,
-                                        const char *pos)
-{
-       if (os_strlen(pos) > 32)
-               return -1;
-       os_free(config->model_name);
-       config->model_name = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "model_name='%s'", config->model_name);
-       return 0;
-}
-
-
-static int wpa_config_process_model_number(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *pos)
-{
-       if (os_strlen(pos) > 32)
-               return -1;
-       os_free(config->model_number);
-       config->model_number = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "model_number='%s'", config->model_number);
-       return 0;
-}
-
-
-static int wpa_config_process_serial_number(
-       const struct global_parse_data *data, struct wpa_config *config,
-       int line, const char *pos)
-{
-       if (os_strlen(pos) > 32)
-               return -1;
-       os_free(config->serial_number);
-       config->serial_number = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "serial_number='%s'", config->serial_number);
-       return 0;
-}
-
-
-static int wpa_config_process_device_type(const struct global_parse_data *data,
-                                         struct wpa_config *config, int line,
-                                         const char *pos)
-{
-       os_free(config->device_type);
-       config->device_type = os_strdup(pos);
-       wpa_printf(MSG_DEBUG, "device_type='%s'", config->device_type);
-       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)
-#define FUNC_NO_VAR(f) #f, wpa_config_process_ ## f, 0
-#define INT(f) #f, wpa_config_parse_int, OFFSET(f)
-
-static const struct global_parse_data global_fields[] = {
-#ifdef CONFIG_CTRL_IFACE
-       { FUNC(ctrl_interface) },
-       { FUNC(ctrl_interface_group) },
-#endif /* CONFIG_CTRL_IFACE */
-       { FUNC(eapol_version) },
-       { INT(ap_scan) },
-       { INT(fast_reauth) },
-#ifdef EAP_TLS_OPENSSL
-       { FUNC(opensc_engine_path) },
-       { FUNC(pkcs11_engine_path) },
-       { FUNC(pkcs11_module_path) },
-#endif /* EAP_TLS_OPENSSL */
-       { FUNC(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) },
-       { FUNC(device_name) },
-       { FUNC(manufacturer) },
-       { FUNC(model_name) },
-       { FUNC(model_number) },
-       { FUNC(serial_number) },
-       { FUNC(device_type) },
-       { FUNC(os_version) },
-#endif /* CONFIG_WPS */
-       { FUNC(country) }
-};
-
-#undef FUNC
-#undef INT
-#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;
@@ -941,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);
@@ -951,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)
@@ -966,7 +628,7 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
        if (config->update_config)
                fprintf(f, "update_config=%d\n", config->update_config);
 #ifdef CONFIG_WPS
-       if (is_nil_uuid(config->uuid)) {
+       if (!is_nil_uuid(config->uuid)) {
                char buf[40];
                uuid_bin2str(config->uuid, buf, sizeof(buf));
                fprintf(f, "uuid=%s\n", buf);
@@ -983,14 +645,46 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
                fprintf(f, "serial_number=%s\n", config->serial_number);
        if (config->device_type)
                fprintf(f, "device_type=%s\n", config->device_type);
-       if (config->os_version)
+       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 */
@@ -1017,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");