config_file.c revision df5a7e4c5c64890c2425bb47d665bbce4992b676
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant / Configuration backend: text file 304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Copyright (c) 2003-2012, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This file implements a configuration backend for text files. All the 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * configuration information is stored in a text file that uses a format 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * described in the sample configuration file, wpa_supplicant.conf. 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "config.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "base64.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "uuid.h" 1904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "p2p/p2p.h" 20a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#include "eap_peer/eap_methods.h" 21a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#include "eap_peer/eap.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int newline_terminated(const char *buf, size_t buflen) 2561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 2661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t len = os_strlen(buf); 2761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (len == 0) 2861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 2961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (len == buflen - 1 && buf[buflen - 1] != '\r' && 3061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt buf[len - 1] != '\n') 3161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 3261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 1; 3361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 3461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 3561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 3661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void skip_line_end(FILE *stream) 3761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 3861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char buf[100]; 3961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt while (fgets(buf, sizeof(buf), stream)) { 4061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt buf[sizeof(buf) - 1] = '\0'; 4161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (newline_terminated(buf, sizeof(buf))) 4261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return; 4361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 4461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 4561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 4661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_config_get_line - Read the next configuration file line 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @s: Buffer for the line 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @size: The buffer length 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @stream: File stream to read from 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @line: Pointer to a variable storing the file line number 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @_pos: Buffer for the pointer to the beginning of data on the text line or 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * %NULL if not needed (returned value used instead) 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the beginning of data on the text line or %NULL if no 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * more text lines are available. 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function reads the next non-empty line from the configuration file and 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * removes comments. The returned string is guaranteed to be null-terminated. 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char * wpa_config_get_line(char *s, int size, FILE *stream, int *line, 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **_pos) 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos, *end, *sstart; 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (fgets(s, size, stream)) { 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*line)++; 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt s[size - 1] = '\0'; 6961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!newline_terminated(s, size)) { 7061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* 7161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * The line was truncated - skip rest of it to avoid 7261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * confusing error messages. 7361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */ 7461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_INFO, "Long line in configuration file " 7561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "truncated"); 7661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt skip_line_end(stream); 7761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = s; 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Skip white space from the beginning of line. */ 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t' || *pos == '\r') 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Skip comment lines and empty lines */ 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '#' || *pos == '\n' || *pos == '\0') 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Remove # comments unless they are within a double quoted 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * string. 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sstart = os_strchr(pos, '"'); 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sstart) 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sstart = os_strrchr(sstart + 1, '"'); 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!sstart) 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sstart = pos; 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = os_strchr(sstart, '#'); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end) 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end-- = '\0'; 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = pos + os_strlen(pos) - 1; 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Remove trailing white space. */ 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (end > pos && 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*end == '\n' || *end == ' ' || *end == '\t' || 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end == '\r')) 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end-- = '\0'; 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (_pos) 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *_pos = pos; 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos; 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (_pos) 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *_pos = NULL; 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_config_validate_network(struct wpa_ssid *ssid, int line) 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int errors = 0; 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->passphrase) { 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->psk_set) { 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: both PSK and " 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "passphrase configured.", line); 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_psk(ssid); 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((ssid->group_cipher & WPA_CIPHER_CCMP) && 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !(ssid->pairwise_cipher & WPA_CIPHER_CCMP) && 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !(ssid->pairwise_cipher & WPA_CIPHER_NONE)) { 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group cipher cannot be stronger than the pairwise cipher. */ 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: removed CCMP from group cipher" 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " list since it was not allowed for pairwise " 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "cipher", line); 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->group_cipher &= ~WPA_CIPHER_CCMP; 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return errors; 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ssid * wpa_config_read_network(FILE *f, int *line, int id) 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int errors = 0, end = 0; 15461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char buf[2000], *pos, *pos2; 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new network block", 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *line); 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = os_zalloc(sizeof(*ssid)); 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 161391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt dl_list_init(&ssid->psk_list); 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->id = id; 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_network_defaults(ssid); 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_config_get_line(buf, sizeof(buf), f, line, &pos)) { 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(pos, "}") == 0) { 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = 1; 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = os_strchr(pos, '='); 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2 == NULL) { 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid SSID line " 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s'.", *line, pos); 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2++ = '\0'; 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos2 == '"') { 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strchr(pos2 + 1, '"') == NULL) { 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "quotation '%s'.", *line, pos2); 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_set(ssid, pos, pos2, *line) < 0) 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!end) { 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: network block was not " 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "terminated properly.", *line); 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors += wpa_config_validate_network(ssid, *line); 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errors) { 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_free_ssid(ssid); 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = NULL; 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ssid; 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic struct wpa_cred * wpa_config_read_cred(FILE *f, int *line, int id) 21204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 21304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_cred *cred; 21404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int errors = 0, end = 0; 21504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char buf[256], *pos, *pos2; 21604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 21704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new cred block", *line); 21804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred = os_zalloc(sizeof(*cred)); 21904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred == NULL) 22004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 22104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred->id = id; 22204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 22304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt while (wpa_config_get_line(buf, sizeof(buf), f, line, &pos)) { 22404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(pos, "}") == 0) { 22504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt end = 1; 22604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 22704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 22804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 22904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos2 = os_strchr(pos, '='); 23004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (pos2 == NULL) { 23104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid cred line " 23204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "'%s'.", *line, pos); 23304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 23404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 23504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 23604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 23704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *pos2++ = '\0'; 23804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (*pos2 == '"') { 23904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strchr(pos2 + 1, '"') == NULL) { 24004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 24104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "quotation '%s'.", *line, pos2); 24204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 24304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 24404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 24504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 24604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 24704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_config_set_cred(cred, pos, pos2, *line) < 0) 24804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 24904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 25004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 25104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!end) { 25204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: cred block was not " 25304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "terminated properly.", *line); 25404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 25504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 25604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 25704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (errors) { 25804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_config_free_cred(cred); 25904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred = NULL; 26004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 26104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 26204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return cred; 26304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 26404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 26504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_config_blob * wpa_config_read_blob(FILE *f, int *line, 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *name) 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[256], *pos; 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned char *encoded = NULL, *nencoded; 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int end = 0; 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t encoded_len = 0, len; 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new named blob '%s'", 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *line, name); 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_config_get_line(buf, sizeof(buf), f, line, &pos)) { 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(pos, "}") == 0) { 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = 1; 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = os_strlen(pos); 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nencoded = os_realloc(encoded, encoded_len + len); 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nencoded == NULL) { 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: not enough memory for " 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "blob", *line); 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(encoded); 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encoded = nencoded; 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(encoded + encoded_len, pos, len); 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encoded_len += len; 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!end) { 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: blob was not terminated " 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "properly", *line); 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(encoded); 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = os_zalloc(sizeof(*blob)); 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob == NULL) { 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(encoded); 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->name = os_strdup(name); 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->data = base64_decode(encoded, encoded_len, &blob->len); 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(encoded); 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob->name == NULL || blob->data == NULL) { 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_free_blob(blob); 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return blob; 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_config_process_blob(struct wpa_config *config, FILE *f, 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *line, char *bname) 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *name_end; 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt name_end = os_strchr(bname, '='); 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (name_end == NULL) { 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: no blob name terminator", 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *line); 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *name_end = '\0'; 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_config_read_blob(f, line, bname); 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob == NULL) { 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to read blob %s", 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *line, bname); 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(config, blob); 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34964f47c5c24428834677459e048420f86e3514c20Dmitry Shmidtstruct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp) 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 35204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char buf[512], *pos; 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int errors = 0, line = 0; 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid, *tail = NULL, *head = NULL; 35504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_cred *cred, *cred_tail = NULL, *cred_head = NULL; 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config *config; 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id = 0; 35804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int cred_id = 0; 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36064f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt if (name == NULL) 36164f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt return NULL; 36264f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt if (cfgp) 36364f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt config = cfgp; 36464f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt else 36564f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt config = wpa_config_alloc_empty(NULL, NULL); 36661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (config == NULL) { 36761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate config file " 36861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "structure"); 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 37061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 37164f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt head = config->ssid; 37264f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt cred_head = config->cred; 37361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Reading configuration file '%s'", name); 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen(name, "r"); 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (f == NULL) { 37761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to open config file '%s', " 37861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "error: %s", name, strerror(errno)); 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(config); 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_config_get_line(buf, sizeof(buf), f, &line, &pos)) { 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(pos, "network={") == 0) { 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_read_network(f, &line, id++); 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to " 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "parse network block.", line); 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (head == NULL) { 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head = tail = ssid; 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail->next = ssid; 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail = ssid; 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_add_prio_network(config, ssid)) { 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to add " 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "network block to priority list.", 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line); 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(pos, "cred={") == 0) { 40604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred = wpa_config_read_cred(f, &line, cred_id++); 40704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred == NULL) { 40804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to " 40904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "parse cred block.", line); 41004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 41104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 41204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 41304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred_head == NULL) { 41404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred_head = cred_tail = cred; 41504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 41604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred_tail->next = cred; 41704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred_tail = cred; 41804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(pos, "blob-base64-", 12) == 0) { 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_process_blob(config, f, &line, pos + 12) 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt < 0) { 42361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to " 42461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "process blob.", line); 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_config_process_global(config, pos, line) < 0) { 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid configuration " 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "line '%s'.", line, pos); 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43997d980693a6550ea7a66d85cf1f453b1246436b2Iliyan Malchev config->ssid = head; 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_debug_dump_networks(config); 44197d980693a6550ea7a66d85cf1f453b1246436b2Iliyan Malchev config->cred = cred_head; 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef WPA_IGNORE_CONFIG_ERRORS 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errors) { 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_free(config); 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config = NULL; 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head = NULL; 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPA_IGNORE_CONFIG_ERRORS */ 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return config; 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_str(FILE *f, const char *field, struct wpa_ssid *ssid) 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value = wpa_config_get(ssid, field); 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\t%s=%s\n", field, value); 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_int(FILE *f, const char *field, int value, int def) 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == def) 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\t%s=%d\n", field, value); 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_bssid(FILE *f, struct wpa_ssid *ssid) 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value = wpa_config_get(ssid, "bssid"); 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tbssid=%s\n", value); 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_psk(FILE *f, struct wpa_ssid *ssid) 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value = wpa_config_get(ssid, "psk"); 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tpsk=%s\n", value); 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_proto(FILE *f, struct wpa_ssid *ssid) 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->proto == DEFAULT_PROTO) 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "proto"); 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tproto=%s\n", value); 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_key_mgmt(FILE *f, struct wpa_ssid *ssid) 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->key_mgmt == DEFAULT_KEY_MGMT) 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "key_mgmt"); 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tkey_mgmt=%s\n", value); 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_pairwise(FILE *f, struct wpa_ssid *ssid) 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->pairwise_cipher == DEFAULT_PAIRWISE) 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "pairwise"); 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tpairwise=%s\n", value); 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_group(FILE *f, struct wpa_ssid *ssid) 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->group_cipher == DEFAULT_GROUP) 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "group"); 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tgroup=%s\n", value); 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_auth_alg(FILE *f, struct wpa_ssid *ssid) 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->auth_alg == 0) 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "auth_alg"); 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tauth_alg=%s\n", value); 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef IEEE8021X_EAPOL 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_eap(FILE *f, struct wpa_ssid *ssid) 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "eap"); 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\teap=%s\n", value); 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* IEEE8021X_EAPOL */ 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_wep_key(FILE *f, int idx, struct wpa_ssid *ssid) 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char field[20], *value; 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(field, sizeof(field), "wep_key%d", idx); 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(field)) 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, field); 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value) { 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\t%s=%s\n", field, value); 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 608391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 6095460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidtstatic void write_go_p2p_dev_addr(FILE *f, struct wpa_ssid *ssid) 6105460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt{ 6115460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt char *value = wpa_config_get(ssid, "go_p2p_dev_addr"); 6125460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt if (value == NULL) 6135460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt return; 6145460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt fprintf(f, "\tgo_p2p_dev_addr=%s\n", value); 6155460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt os_free(value); 6165460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt} 6175460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt 6181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void write_p2p_client_list(FILE *f, struct wpa_ssid *ssid) 6191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 6201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *value = wpa_config_get(ssid, "p2p_client_list"); 6211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (value == NULL) 6221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 6231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fprintf(f, "\tp2p_client_list=%s\n", value); 6241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(value); 6251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 626391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 627391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 628391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic void write_psk_list(FILE *f, struct wpa_ssid *ssid) 629391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{ 630391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt struct psk_list_entry *psk; 631391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt char hex[32 * 2 + 1]; 632391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 633391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt dl_list_for_each(psk, &ssid->psk_list, struct psk_list_entry, list) { 634391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt wpa_snprintf_hex(hex, sizeof(hex), psk->psk, sizeof(psk->psk)); 635391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt fprintf(f, "\tpsk_list=%s" MACSTR "-%s\n", 636391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt psk->p2p ? "P2P-" : "", MAC2STR(psk->addr), hex); 637391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt } 638391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt} 639391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 6401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 6411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid) 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define STR(t) write_str(f, #t, ssid) 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define INT(t) write_int(f, #t, ssid->t, 0) 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define INTe(t) write_int(f, #t, ssid->eap.t, 0) 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define INT_DEF(t, def) write_int(f, #t, ssid->t, def) 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define INT_DEFe(t, def) write_int(f, #t, ssid->eap.t, def) 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ssid); 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(scan_ssid); 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_bssid(f, ssid); 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_psk(f, ssid); 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_proto(f, ssid); 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_key_mgmt(f, ssid); 65904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt INT_DEF(bg_scan_period, DEFAULT_BG_SCAN_PERIOD); 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_pairwise(f, ssid); 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_group(f, ssid); 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_auth_alg(f, ssid); 66304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt STR(bgscan); 66404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt STR(autoscan); 6655605286c30e1701491bd3af974ae423727750eddDmitry Shmidt STR(scan_freq); 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef IEEE8021X_EAPOL 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_eap(f, ssid); 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(identity); 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(anonymous_identity); 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(password); 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_cert); 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_path); 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(client_cert); 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(private_key); 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(private_key_passwd); 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(dh_file); 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(subject_match); 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(altsubject_match); 679051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt STR(domain_suffix_match); 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_cert2); 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_path2); 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(client_cert2); 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(private_key2); 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(private_key2_passwd); 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(dh_file2); 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(subject_match2); 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(altsubject_match2); 688051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt STR(domain_suffix_match2); 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(phase1); 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(phase2); 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(pcsc); 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(pin); 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(engine_id); 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(key_id); 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(cert_id); 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_cert_id); 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(key2_id); 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(pin2); 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(engine2_id); 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(cert2_id); 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_cert2_id); 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INTe(engine); 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INTe(engine2); 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT_DEF(eapol_flags, DEFAULT_EAPOL_FLAGS); 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* IEEE8021X_EAPOL */ 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 4; i++) 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_wep_key(f, i, ssid); 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(wep_tx_keyidx); 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(priority); 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef IEEE8021X_EAPOL 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT_DEF(eap_workaround, DEFAULT_EAP_WORKAROUND); 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(pac_file); 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT_DEFe(fragment_size, DEFAULT_FRAGMENT_SIZE); 714df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt INTe(ocsp); 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* IEEE8021X_EAPOL */ 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(mode); 717a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt INT(frequency); 718d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt write_int(f, "proactive_key_caching", ssid->proactive_key_caching, -1); 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(disabled); 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(peerkey); 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 722d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt write_int(f, "ieee80211w", ssid->ieee80211w, 723d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt MGMT_FRAME_PROTECTION_DEFAULT); 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(id_str); 7261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 7275460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt write_go_p2p_dev_addr(f, ssid); 7281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt write_p2p_client_list(f, ssid); 729391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt write_psk_list(f, ssid); 7301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 7317a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt INT(dtim_period); 7327a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt INT(beacon_int); 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#undef STR 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#undef INT 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#undef INT_DEF 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 74004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic void wpa_config_write_cred(FILE *f, struct wpa_cred *cred) 74104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 742051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt size_t i; 743051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 74404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->priority) 74504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tpriority=%d\n", cred->priority); 74604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->pcsc) 74704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tpcsc=%d\n", cred->pcsc); 74804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->realm) 74904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\trealm=\"%s\"\n", cred->realm); 75004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->username) 75104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tusername=\"%s\"\n", cred->username); 752a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->password && cred->ext_password) 753a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tpassword=ext:%s\n", cred->password); 754a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt else if (cred->password) 75504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tpassword=\"%s\"\n", cred->password); 75604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->ca_cert) 75704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tca_cert=\"%s\"\n", cred->ca_cert); 758a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->client_cert) 759a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tclient_cert=\"%s\"\n", cred->client_cert); 760a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->private_key) 761a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tprivate_key=\"%s\"\n", cred->private_key); 762a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->private_key_passwd) 763a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tprivate_key_passwd=\"%s\"\n", 764a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt cred->private_key_passwd); 76504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->imsi) 76604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\timsi=\"%s\"\n", cred->imsi); 76704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->milenage) 76804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tmilenage=\"%s\"\n", cred->milenage); 769051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt for (i = 0; i < cred->num_domain; i++) 770051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt fprintf(f, "\tdomain=\"%s\"\n", cred->domain[i]); 771051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (cred->domain_suffix_match) 772051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt fprintf(f, "\tdomain_suffix_match=\"%s\"", 773051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt cred->domain_suffix_match); 774a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->roaming_consortium_len) { 775a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\troaming_consortium="); 776a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt for (i = 0; i < cred->roaming_consortium_len; i++) 777a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "%02x", cred->roaming_consortium[i]); 778a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\n"); 779a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 780a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->eap_method) { 781a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt const char *name; 782a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt name = eap_get_name(cred->eap_method[0].vendor, 783a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt cred->eap_method[0].method); 784a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\teap=%s\n", name); 785a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 786a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->phase1) 787a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tphase1=\"%s\"\n", cred->phase1); 788a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->phase2) 789a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tphase2=\"%s\"\n", cred->phase2); 790a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->excluded_ssid) { 791051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt size_t j; 792a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt for (i = 0; i < cred->num_excluded_ssid; i++) { 793a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt struct excluded_ssid *e = &cred->excluded_ssid[i]; 794a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\texcluded_ssid="); 795a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt for (j = 0; j < e->ssid_len; j++) 796a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "%02x", e->ssid[j]); 797a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\n"); 798a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 799a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 800f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->roaming_partner) { 801f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt for (i = 0; i < cred->num_roaming_partner; i++) { 802f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt struct roaming_partner *p = &cred->roaming_partner[i]; 803f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\troaming_partner=\"%s,%d,%u,%s\"\n", 804f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt p->fqdn, p->exact_match, p->priority, 805f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt p->country); 806f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 807f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 808f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->update_identifier) 809f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tupdate_identifier=%d\n", cred->update_identifier); 810f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 811f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->provisioning_sp) 812f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tprovisioning_sp=%s\n", cred->provisioning_sp); 813f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->sp_priority) 814f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tsp_priority=%d\n", cred->sp_priority); 815f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 816f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->min_dl_bandwidth_home) 817f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tmin_dl_bandwidth_home=%u\n", 818f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cred->min_dl_bandwidth_home); 819f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->min_ul_bandwidth_home) 820f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tmin_ul_bandwidth_home=%u\n", 821f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cred->min_ul_bandwidth_home); 822f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->min_dl_bandwidth_roaming) 823f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tmin_dl_bandwidth_roaming=%u\n", 824f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cred->min_dl_bandwidth_roaming); 825f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->min_ul_bandwidth_roaming) 826f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tmin_ul_bandwidth_roaming=%u\n", 827f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cred->min_ul_bandwidth_roaming); 828f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 829f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->max_bss_load) 830f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tmax_bss_load=%u\n", 831f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cred->max_bss_load); 832f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 833f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->ocsp) 834f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tocsp=%d\n", cred->ocsp); 83504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 83604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 83704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_config_write_blob(FILE *f, struct wpa_config_blob *blob) 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned char *encoded; 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encoded = base64_encode(blob->data, blob->len, NULL); 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (encoded == NULL) 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\nblob-base64-%s={\n%s}\n", blob->name, encoded); 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(encoded); 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 85404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic void write_global_bin(FILE *f, const char *field, 85504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const struct wpabuf *val) 85604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 85704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 85804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *pos; 85904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 86004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (val == NULL) 86104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 86204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 86304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "%s=", field); 86404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos = wpabuf_head(val); 86504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < wpabuf_len(val); i++) 86604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "%02X", *pos++); 86704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\n"); 86804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 86904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 87004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_config_write_global(FILE *f, struct wpa_config *config) 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->ctrl_interface) 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "ctrl_interface=%s\n", config->ctrl_interface); 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->ctrl_interface_group) 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "ctrl_interface_group=%s\n", 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->ctrl_interface_group); 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */ 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->eapol_version != DEFAULT_EAPOL_VERSION) 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "eapol_version=%d\n", config->eapol_version); 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->ap_scan != DEFAULT_AP_SCAN) 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "ap_scan=%d\n", config->ap_scan); 88404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->disable_scan_offload) 88504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "disable_scan_offload=%d\n", 88604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt config->disable_scan_offload); 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->fast_reauth != DEFAULT_FAST_REAUTH) 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "fast_reauth=%d\n", config->fast_reauth); 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->opensc_engine_path) 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "opensc_engine_path=%s\n", 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->opensc_engine_path); 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->pkcs11_engine_path) 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "pkcs11_engine_path=%s\n", 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->pkcs11_engine_path); 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->pkcs11_module_path) 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "pkcs11_module_path=%s\n", 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->pkcs11_module_path); 89804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->pcsc_reader) 89904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "pcsc_reader=%s\n", config->pcsc_reader); 90004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->pcsc_pin) 90104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "pcsc_pin=%s\n", config->pcsc_pin); 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->driver_param) 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "driver_param=%s\n", config->driver_param); 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->dot11RSNAConfigPMKLifetime) 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "dot11RSNAConfigPMKLifetime=%d\n", 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->dot11RSNAConfigPMKLifetime); 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->dot11RSNAConfigPMKReauthThreshold) 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "dot11RSNAConfigPMKReauthThreshold=%d\n", 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->dot11RSNAConfigPMKReauthThreshold); 9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->dot11RSNAConfigSATimeout) 9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "dot11RSNAConfigSATimeout=%d\n", 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->dot11RSNAConfigSATimeout); 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->update_config) 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "update_config=%d\n", config->update_config); 9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!is_nil_uuid(config->uuid)) { 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[40]; 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt uuid_bin2str(config->uuid, buf, sizeof(buf)); 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "uuid=%s\n", buf); 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->device_name) 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "device_name=%s\n", config->device_name); 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->manufacturer) 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "manufacturer=%s\n", config->manufacturer); 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->model_name) 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "model_name=%s\n", config->model_name); 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->model_number) 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "model_number=%s\n", config->model_number); 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->serial_number) 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "serial_number=%s\n", config->serial_number); 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char _buf[WPS_DEV_TYPE_BUFSIZE], *buf; 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = wps_dev_type_bin2str(config->device_type, 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _buf, sizeof(_buf)); 9351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (os_strcmp(buf, "0-00000000-0") != 0) 9361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fprintf(f, "device_type=%s\n", buf); 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (WPA_GET_BE32(config->os_version)) 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "os_version=%08x\n", 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_GET_BE32(config->os_version)); 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->config_methods) 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "config_methods=%s\n", config->config_methods); 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->wps_cred_processing) 9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "wps_cred_processing=%d\n", 9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->wps_cred_processing); 94604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->wps_vendor_ext_m1) { 94704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int i, len = wpabuf_len(config->wps_vendor_ext_m1); 94804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *p = wpabuf_head_u8(config->wps_vendor_ext_m1); 94904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (len > 0) { 95004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "wps_vendor_ext_m1="); 95104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < len; i++) 95204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "%02x", *p++); 95304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\n"); 95404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 95504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_listen_reg_class) 9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_listen_reg_class=%u\n", 9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->p2p_listen_reg_class); 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_listen_channel) 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_listen_channel=%u\n", 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->p2p_listen_channel); 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_oper_reg_class) 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_oper_reg_class=%u\n", 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->p2p_oper_reg_class); 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_oper_channel) 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_oper_channel=%u\n", config->p2p_oper_channel); 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_go_intent != DEFAULT_P2P_GO_INTENT) 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_go_intent=%u\n", config->p2p_go_intent); 9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_ssid_postfix) 9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_ssid_postfix=%s\n", config->p2p_ssid_postfix); 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->persistent_reconnect) 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "persistent_reconnect=%u\n", 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->persistent_reconnect); 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_intra_bss != DEFAULT_P2P_INTRA_BSS) 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_intra_bss=%u\n", config->p2p_intra_bss); 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_group_idle) 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_group_idle=%u\n", config->p2p_group_idle); 98004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->p2p_pref_chan) { 98104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt unsigned int i; 98204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "p2p_pref_chan="); 98304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < config->num_p2p_pref_chan; i++) { 98404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "%s%u:%u", i > 0 ? "," : "", 98504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt config->p2p_pref_chan[i].op_class, 98604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt config->p2p_pref_chan[i].chan); 98704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 98804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\n"); 98904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 99068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (config->p2p_no_go_freq.num) { 99168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt char *val = freq_range_list_str(&config->p2p_no_go_freq); 99268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (val) { 99368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt fprintf(f, "p2p_no_go_freq=%s\n", val); 99468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt os_free(val); 99568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt } 99668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt } 99768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (config->p2p_add_cli_chan) 99868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt fprintf(f, "p2p_add_cli_chan=%d\n", config->p2p_add_cli_chan); 999d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (config->p2p_go_ht40) 1000d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt fprintf(f, "p2p_go_ht40=%u\n", config->p2p_go_ht40); 100168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (config->p2p_go_vht) 100268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt fprintf(f, "p2p_go_vht=%u\n", config->p2p_go_vht); 1003d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (config->p2p_disabled) 1004d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt fprintf(f, "p2p_disabled=%u\n", config->p2p_disabled); 1005d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (config->p2p_no_group_iface) 1006d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt fprintf(f, "p2p_no_group_iface=%u\n", 1007d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt config->p2p_no_group_iface); 10080ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt if (config->p2p_ignore_shared_freq) 10090ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt fprintf(f, "p2p_ignore_shared_freq=%u\n", 10100ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt config->p2p_ignore_shared_freq); 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->country[0] && config->country[1]) { 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "country=%c%c\n", 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->country[0], config->country[1]); 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->bss_max_count != DEFAULT_BSS_MAX_COUNT) 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "bss_max_count=%u\n", config->bss_max_count); 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->bss_expiration_age != DEFAULT_BSS_EXPIRATION_AGE) 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "bss_expiration_age=%u\n", 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->bss_expiration_age); 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->bss_expiration_scan_count != 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DEFAULT_BSS_EXPIRATION_SCAN_COUNT) 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "bss_expiration_scan_count=%u\n", 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->bss_expiration_scan_count); 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->filter_ssids) 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "filter_ssids=%d\n", config->filter_ssids); 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->max_num_sta != DEFAULT_MAX_NUM_STA) 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "max_num_sta=%u\n", config->max_num_sta); 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->disassoc_low_ack) 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "disassoc_low_ack=%u\n", config->disassoc_low_ack); 103104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HS20 103204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->hs20) 103304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "hs20=1\n"); 103404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HS20 */ 10351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 10361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (config->interworking) 10371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fprintf(f, "interworking=%u\n", config->interworking); 10381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!is_zero_ether_addr(config->hessid)) 10391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fprintf(f, "hessid=" MACSTR "\n", MAC2STR(config->hessid)); 10401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (config->access_network_type != DEFAULT_ACCESS_NETWORK_TYPE) 10411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fprintf(f, "access_network_type=%d\n", 10421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt config->access_network_type); 10431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 104404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->pbc_in_m1) 104504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "pbc_in_m1=%u\n", config->pbc_in_m1); 1046f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt if (config->wps_nfc_pw_from_config) { 1047f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt if (config->wps_nfc_dev_pw_id) 1048f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt fprintf(f, "wps_nfc_dev_pw_id=%d\n", 1049f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt config->wps_nfc_dev_pw_id); 1050f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt write_global_bin(f, "wps_nfc_dh_pubkey", 1051f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt config->wps_nfc_dh_pubkey); 1052f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt write_global_bin(f, "wps_nfc_dh_privkey", 1053f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt config->wps_nfc_dh_privkey); 1054f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt write_global_bin(f, "wps_nfc_dev_pw", config->wps_nfc_dev_pw); 1055f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt } 105661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 105761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (config->ext_password_backend) 105861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt fprintf(f, "ext_password_backend=%s\n", 105961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt config->ext_password_backend); 106061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (config->p2p_go_max_inactivity != DEFAULT_P2P_GO_MAX_INACTIVITY) 106161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt fprintf(f, "p2p_go_max_inactivity=%d\n", 106261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt config->p2p_go_max_inactivity); 106361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (config->auto_interworking) 106461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt fprintf(f, "auto_interworking=%d\n", 106561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt config->auto_interworking); 1066d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (config->okc) 1067d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt fprintf(f, "okc=%d\n", config->okc); 1068d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (config->pmf) 1069d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt fprintf(f, "pmf=%d\n", config->pmf); 10707a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt if (config->dtim_period) 10717a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt fprintf(f, "dtim_period=%d\n", config->dtim_period); 10727a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt if (config->beacon_int) 10737a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt fprintf(f, "beacon_int=%d\n", config->beacon_int); 1074a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 1075a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (config->sae_groups) { 1076a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt int i; 1077a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "sae_groups="); 1078a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt for (i = 0; config->sae_groups[i] >= 0; i++) { 1079a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "%s%d", i > 0 ? " " : "", 1080a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt config->sae_groups[i]); 1081a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 1082a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\n"); 1083a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 10840ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt 10850ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt if (config->ap_vendor_elements) { 10860ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt int i, len = wpabuf_len(config->ap_vendor_elements); 10870ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt const u8 *p = wpabuf_head_u8(config->ap_vendor_elements); 10880ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt if (len > 0) { 10890ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt fprintf(f, "ap_vendor_elements="); 10900ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt for (i = 0; i < len; i++) 10910ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt fprintf(f, "%02x", *p++); 10920ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt fprintf(f, "\n"); 10930ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt } 10940ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt } 1095444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt 1096444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt if (config->ignore_old_scan_res) 1097444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt fprintf(f, "ignore_old_scan_res=%d\n", 1098444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt config->ignore_old_scan_res); 109951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 110051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (config->freq_list && config->freq_list[0]) { 110151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt int i; 110251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt fprintf(f, "freq_list="); 110351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt for (i = 0; config->freq_list[i]; i++) { 110451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt fprintf(f, "%s%u", i > 0 ? " " : "", 110551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt config->freq_list[i]); 110651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt } 110751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt fprintf(f, "\n"); 110851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt } 1109ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt if (config->scan_cur_freq != DEFAULT_SCAN_CUR_FREQ) 1110ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt fprintf(f, "scan_cur_freq=%d\n", config->scan_cur_freq); 111151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 111251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (config->sched_scan_interval) 111351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt fprintf(f, "sched_scan_interval=%u\n", 111451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt config->sched_scan_interval); 1115051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1116051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (config->external_sim) 1117051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt fprintf(f, "external_sim=%d\n", config->external_sim); 1118e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 1119e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (config->tdls_external_control) 1120e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt fprintf(f, "tdls_external_control=%d\n", 1121e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt config->tdls_external_control); 1122a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt 1123a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt if (config->bgscan) 1124a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt fprintf(f, "bgscan=\"%s\"\n", config->bgscan); 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */ 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_config_write(const char *name, struct wpa_config *config) 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 113504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_cred *cred; 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = 0; 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Writing configuration file '%s'", name); 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen(name, "w"); 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (f == NULL) { 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Failed to open '%s' for writing", name); 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_write_global(f, config); 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 115104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (cred = config->cred; cred; cred = cred->next) { 1152fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (cred->temporary) 1153fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt continue; 115404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\ncred={\n"); 115504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_config_write_cred(f, cred); 115604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "}\n"); 115704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 115804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = config->ssid; ssid; ssid = ssid->next) { 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->key_mgmt == WPA_KEY_MGMT_WPS || ssid->temporary) 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; /* do not save temporary networks */ 11621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set && 11631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !ssid->passphrase) 11641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt continue; /* do not save invalid network */ 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\nnetwork={\n"); 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_write_network(f, ssid); 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "}\n"); 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (blob = config->blobs; blob; blob = blob->next) { 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_config_write_blob(f, blob); 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret) 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Configuration file '%s' written %ssuccessfully", 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt name, ret ? "un" : ""); 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_NO_CONFIG_WRITE */ 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */ 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1187