~ubuntu-branches/ubuntu/saucy/wpasupplicant/saucy

« back to all changes in this revision

Viewing changes to wpa_supplicant/config.c

  • Committer: Bazaar Package Importer
  • Author(s): Mathieu Trudel-Lapierre
  • Date: 2010-11-22 09:43:43 UTC
  • mfrom: (1.1.16 upstream)
  • Revision ID: james.westby@ubuntu.com-20101122094343-qgsxaojvmswfri77
Tags: 0.7.3-0ubuntu1
* Get wpasupplicant 0.7.3 from Debian's SVN. Leaving 0.7.3-1 as unreleased
  for now.
* Build-Depend on debhelper 8, since the packaging from Debian uses compat 8.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
#include "includes.h"
16
16
 
17
17
#include "common.h"
18
 
#include "wpa.h"
19
 
#include "sha1.h"
 
18
#include "crypto/sha1.h"
 
19
#include "rsn_supp/wpa.h"
20
20
#include "eap_peer/eap.h"
21
21
#include "config.h"
22
22
 
917
917
#endif /* NO_CONFIG_WRITE */
918
918
 
919
919
 
 
920
static int * wpa_config_parse_freqs(const struct parse_data *data,
 
921
                                    struct wpa_ssid *ssid, int line,
 
922
                                    const char *value)
 
923
{
 
924
        int *freqs;
 
925
        size_t used, len;
 
926
        const char *pos;
 
927
 
 
928
        used = 0;
 
929
        len = 10;
 
930
        freqs = os_zalloc((len + 1) * sizeof(int));
 
931
        if (freqs == NULL)
 
932
                return NULL;
 
933
 
 
934
        pos = value;
 
935
        while (pos) {
 
936
                while (*pos == ' ')
 
937
                        pos++;
 
938
                if (used == len) {
 
939
                        int *n;
 
940
                        size_t i;
 
941
                        n = os_realloc(freqs, (len * 2 + 1) * sizeof(int));
 
942
                        if (n == NULL) {
 
943
                                os_free(freqs);
 
944
                                return NULL;
 
945
                        }
 
946
                        for (i = len; i <= len * 2; i++)
 
947
                                n[i] = 0;
 
948
                        freqs = n;
 
949
                        len *= 2;
 
950
                }
 
951
 
 
952
                freqs[used] = atoi(pos);
 
953
                if (freqs[used] == 0)
 
954
                        break;
 
955
                used++;
 
956
                pos = os_strchr(pos + 1, ' ');
 
957
        }
 
958
 
 
959
        return freqs;
 
960
}
 
961
 
 
962
 
 
963
static int wpa_config_parse_scan_freq(const struct parse_data *data,
 
964
                                      struct wpa_ssid *ssid, int line,
 
965
                                      const char *value)
 
966
{
 
967
        int *freqs;
 
968
 
 
969
        freqs = wpa_config_parse_freqs(data, ssid, line, value);
 
970
        if (freqs == NULL)
 
971
                return -1;
 
972
        os_free(ssid->scan_freq);
 
973
        ssid->scan_freq = freqs;
 
974
 
 
975
        return 0;
 
976
}
 
977
 
 
978
 
 
979
static int wpa_config_parse_freq_list(const struct parse_data *data,
 
980
                                      struct wpa_ssid *ssid, int line,
 
981
                                      const char *value)
 
982
{
 
983
        int *freqs;
 
984
 
 
985
        freqs = wpa_config_parse_freqs(data, ssid, line, value);
 
986
        if (freqs == NULL)
 
987
                return -1;
 
988
        os_free(ssid->freq_list);
 
989
        ssid->freq_list = freqs;
 
990
 
 
991
        return 0;
 
992
}
 
993
 
 
994
 
 
995
#ifndef NO_CONFIG_WRITE
 
996
static char * wpa_config_write_freqs(const struct parse_data *data,
 
997
                                     const int *freqs)
 
998
{
 
999
        char *buf, *pos, *end;
 
1000
        int i, ret;
 
1001
        size_t count;
 
1002
 
 
1003
        if (freqs == NULL)
 
1004
                return NULL;
 
1005
 
 
1006
        count = 0;
 
1007
        for (i = 0; freqs[i]; i++)
 
1008
                count++;
 
1009
 
 
1010
        pos = buf = os_zalloc(10 * count + 1);
 
1011
        if (buf == NULL)
 
1012
                return NULL;
 
1013
        end = buf + 10 * count + 1;
 
1014
 
 
1015
        for (i = 0; freqs[i]; i++) {
 
1016
                ret = os_snprintf(pos, end - pos, "%s%u",
 
1017
                                  i == 0 ? "" : " ", freqs[i]);
 
1018
                if (ret < 0 || ret >= end - pos) {
 
1019
                        end[-1] = '\0';
 
1020
                        return buf;
 
1021
                }
 
1022
                pos += ret;
 
1023
        }
 
1024
 
 
1025
        return buf;
 
1026
}
 
1027
 
 
1028
 
 
1029
static char * wpa_config_write_scan_freq(const struct parse_data *data,
 
1030
                                         struct wpa_ssid *ssid)
 
1031
{
 
1032
        return wpa_config_write_freqs(data, ssid->scan_freq);
 
1033
}
 
1034
 
 
1035
 
 
1036
static char * wpa_config_write_freq_list(const struct parse_data *data,
 
1037
                                         struct wpa_ssid *ssid)
 
1038
{
 
1039
        return wpa_config_write_freqs(data, ssid->freq_list);
 
1040
}
 
1041
#endif /* NO_CONFIG_WRITE */
 
1042
 
 
1043
 
920
1044
#ifdef IEEE8021X_EAPOL
921
1045
static int wpa_config_parse_eap(const struct parse_data *data,
922
1046
                                struct wpa_ssid *ssid, int line,
1317
1441
        { FUNC(pairwise) },
1318
1442
        { FUNC(group) },
1319
1443
        { FUNC(auth_alg) },
 
1444
        { FUNC(scan_freq) },
 
1445
        { FUNC(freq_list) },
1320
1446
#ifdef IEEE8021X_EAPOL
1321
1447
        { FUNC(eap) },
1322
1448
        { STR_LENe(identity) },
1366
1492
        { STRe(pac_file) },
1367
1493
        { INTe(fragment_size) },
1368
1494
#endif /* IEEE8021X_EAPOL */
1369
 
        { INT_RANGE(mode, 0, 1) },
 
1495
        { INT_RANGE(mode, 0, 2) },
1370
1496
        { INT_RANGE(proactive_key_caching, 0, 1) },
1371
1497
        { INT_RANGE(disabled, 0, 1) },
1372
1498
        { STR(id_str) },
1376
1502
        { INT_RANGE(peerkey, 0, 1) },
1377
1503
        { INT_RANGE(mixed_cell, 0, 1) },
1378
1504
        { INT_RANGE(frequency, 0, 10000) },
1379
 
        { INT(wpa_ptk_rekey) }
 
1505
        { INT(wpa_ptk_rekey) },
 
1506
        { STR(bgscan) },
1380
1507
};
1381
1508
 
1382
1509
#undef OFFSET
1460
1587
 * configuration when a network is being added or removed. This is also called
1461
1588
 * if a priority for a network is changed.
1462
1589
 */
1463
 
static int wpa_config_update_prio_list(struct wpa_config *config)
 
1590
int wpa_config_update_prio_list(struct wpa_config *config)
1464
1591
{
1465
1592
        struct wpa_ssid *ssid;
1466
1593
        int ret = 0;
1540
1667
        eap_peer_config_free(&ssid->eap);
1541
1668
#endif /* IEEE8021X_EAPOL */
1542
1669
        os_free(ssid->id_str);
 
1670
        os_free(ssid->scan_freq);
 
1671
        os_free(ssid->freq_list);
 
1672
        os_free(ssid->bgscan);
1543
1673
        os_free(ssid);
1544
1674
}
1545
1675
 
1576
1706
 
1577
1707
        os_free(config->ctrl_interface);
1578
1708
        os_free(config->ctrl_interface_group);
1579
 
#ifdef EAP_TLS_OPENSSL
1580
1709
        os_free(config->opensc_engine_path);
1581
1710
        os_free(config->pkcs11_engine_path);
1582
1711
        os_free(config->pkcs11_module_path);
1583
 
#endif /* EAP_TLS_OPENSSL */
1584
1712
        os_free(config->driver_param);
1585
1713
        os_free(config->device_name);
1586
1714
        os_free(config->manufacturer);
1588
1716
        os_free(config->model_number);
1589
1717
        os_free(config->serial_number);
1590
1718
        os_free(config->device_type);
 
1719
        os_free(config->config_methods);
1591
1720
        os_free(config->pssid);
1592
1721
        os_free(config);
1593
1722
}
1747
1876
}
1748
1877
 
1749
1878
 
 
1879
/**
 
1880
 * wpa_config_get_all - Get all options from network configuration
 
1881
 * @ssid: Pointer to network configuration data
 
1882
 * @get_keys: Determines if keys/passwords will be included in returned list
 
1883
 * Returns: %NULL terminated list of all set keys and their values in the form
 
1884
 * of [key1, val1, key2, val2, ... , NULL]
 
1885
 *
 
1886
 * This function can be used to get list of all configured network properties.
 
1887
 * The caller is responsible for freeing the returned list and all its
 
1888
 * elements.
 
1889
 */
 
1890
char ** wpa_config_get_all(struct wpa_ssid *ssid, int get_keys)
 
1891
{
 
1892
        const struct parse_data *field;
 
1893
        char *key, *value;
 
1894
        size_t i;
 
1895
        char **props;
 
1896
        int fields_num;
 
1897
 
 
1898
        props = os_zalloc(sizeof(char *) * ((2 * NUM_SSID_FIELDS) + 1));
 
1899
        if (!props)
 
1900
                return NULL;
 
1901
 
 
1902
        fields_num = 0;
 
1903
        for (i = 0; i < NUM_SSID_FIELDS; i++) {
 
1904
                field = &ssid_fields[i];
 
1905
                if (field->key_data && !get_keys)
 
1906
                        continue;
 
1907
                value = field->writer(field, ssid);
 
1908
                if (value == NULL)
 
1909
                        continue;
 
1910
                if (os_strlen(value) == 0) {
 
1911
                        os_free(value);
 
1912
                        continue;
 
1913
                }
 
1914
 
 
1915
                key = os_strdup(field->name);
 
1916
                if (key == NULL) {
 
1917
                        os_free(value);
 
1918
                        goto err;
 
1919
                }
 
1920
 
 
1921
                props[fields_num * 2] = key;
 
1922
                props[fields_num * 2 + 1] = value;
 
1923
 
 
1924
                fields_num++;
 
1925
        }
 
1926
 
 
1927
        return props;
 
1928
 
 
1929
err:
 
1930
        value = *props;
 
1931
        while (value)
 
1932
                os_free(value++);
 
1933
        os_free(props);
 
1934
        return NULL;
 
1935
}
 
1936
 
 
1937
 
1750
1938
#ifndef NO_CONFIG_WRITE
1751
1939
/**
1752
1940
 * wpa_config_get - Get a variable in network configuration
1943
2131
        config->eapol_version = DEFAULT_EAPOL_VERSION;
1944
2132
        config->ap_scan = DEFAULT_AP_SCAN;
1945
2133
        config->fast_reauth = DEFAULT_FAST_REAUTH;
 
2134
        config->bss_max_count = DEFAULT_BSS_MAX_COUNT;
1946
2135
 
1947
2136
        if (ctrl_interface)
1948
2137
                config->ctrl_interface = os_strdup(ctrl_interface);