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 230a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande#ifdef ANDROID 240a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande#include <sys/stat.h> 250a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande#endif 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int newline_terminated(const char *buf, size_t buflen) 2861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 2961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt size_t len = os_strlen(buf); 3061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (len == 0) 3161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 3261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (len == buflen - 1 && buf[buflen - 1] != '\r' && 3361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt buf[len - 1] != '\n') 3461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 3561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 1; 3661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 3761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 3861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 3961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void skip_line_end(FILE *stream) 4061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 4161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char buf[100]; 4261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt while (fgets(buf, sizeof(buf), stream)) { 4361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt buf[sizeof(buf) - 1] = '\0'; 4461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (newline_terminated(buf, sizeof(buf))) 4561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return; 4661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 4761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 4861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 4961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_config_get_line - Read the next configuration file line 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @s: Buffer for the line 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @size: The buffer length 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @stream: File stream to read from 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @line: Pointer to a variable storing the file line number 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @_pos: Buffer for the pointer to the beginning of data on the text line or 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * %NULL if not needed (returned value used instead) 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Pointer to the beginning of data on the text line or %NULL if no 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * more text lines are available. 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function reads the next non-empty line from the configuration file and 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * removes comments. The returned string is guaranteed to be null-terminated. 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char * wpa_config_get_line(char *s, int size, FILE *stream, int *line, 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **_pos) 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos, *end, *sstart; 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (fgets(s, size, stream)) { 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*line)++; 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt s[size - 1] = '\0'; 7261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!newline_terminated(s, size)) { 7361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* 7461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * The line was truncated - skip rest of it to avoid 7561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * confusing error messages. 7661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt */ 7761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_INFO, "Long line in configuration file " 7861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "truncated"); 7961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt skip_line_end(stream); 8061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = s; 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Skip white space from the beginning of line. */ 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ' || *pos == '\t' || *pos == '\r') 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Skip comment lines and empty lines */ 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '#' || *pos == '\n' || *pos == '\0') 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Remove # comments unless they are within a double quoted 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * string. 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sstart = os_strchr(pos, '"'); 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sstart) 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sstart = os_strrchr(sstart + 1, '"'); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!sstart) 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sstart = pos; 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = os_strchr(sstart, '#'); 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end) 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end-- = '\0'; 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = pos + os_strlen(pos) - 1; 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Remove trailing white space. */ 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (end > pos && 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (*end == '\n' || *end == ' ' || *end == '\t' || 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end == '\r')) 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end-- = '\0'; 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (_pos) 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *_pos = pos; 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos; 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (_pos) 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *_pos = NULL; 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_config_validate_network(struct wpa_ssid *ssid, int line) 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int errors = 0; 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->passphrase) { 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->psk_set) { 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: both PSK and " 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "passphrase configured.", line); 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_update_psk(ssid); 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((ssid->group_cipher & WPA_CIPHER_CCMP) && 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !(ssid->pairwise_cipher & WPA_CIPHER_CCMP) && 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !(ssid->pairwise_cipher & WPA_CIPHER_NONE)) { 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Group cipher cannot be stronger than the pairwise cipher. */ 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Line %d: removed CCMP from group cipher" 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " list since it was not allowed for pairwise " 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "cipher", line); 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->group_cipher &= ~WPA_CIPHER_CCMP; 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return errors; 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ssid * wpa_config_read_network(FILE *f, int *line, int id) 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int errors = 0, end = 0; 15761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char buf[2000], *pos, *pos2; 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new network block", 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *line); 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = os_zalloc(sizeof(*ssid)); 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 164391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt dl_list_init(&ssid->psk_list); 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid->id = id; 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_network_defaults(ssid); 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_config_get_line(buf, sizeof(buf), f, line, &pos)) { 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(pos, "}") == 0) { 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = 1; 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = os_strchr(pos, '='); 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2 == NULL) { 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid SSID line " 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'%s'.", *line, pos); 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2++ = '\0'; 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos2 == '"') { 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strchr(pos2 + 1, '"') == NULL) { 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "quotation '%s'.", *line, pos2); 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_set(ssid, pos, pos2, *line) < 0) 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!end) { 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: network block was not " 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "terminated properly.", *line); 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors += wpa_config_validate_network(ssid, *line); 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errors) { 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_free_ssid(ssid); 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = NULL; 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ssid; 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic struct wpa_cred * wpa_config_read_cred(FILE *f, int *line, int id) 21504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 21604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_cred *cred; 21704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int errors = 0, end = 0; 21804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char buf[256], *pos, *pos2; 21904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 22004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new cred block", *line); 22104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred = os_zalloc(sizeof(*cred)); 22204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred == NULL) 22304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return NULL; 22404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred->id = id; 225f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt cred->sim_num = DEFAULT_USER_SELECTED_SIM; 22604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 22704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt while (wpa_config_get_line(buf, sizeof(buf), f, line, &pos)) { 22804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strcmp(pos, "}") == 0) { 22904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt end = 1; 23004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt break; 23104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 23204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 23304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos2 = os_strchr(pos, '='); 23404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (pos2 == NULL) { 23504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid cred line " 23604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "'%s'.", *line, pos); 23704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 23804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 23904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 24004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 24104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *pos2++ = '\0'; 24204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (*pos2 == '"') { 24304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_strchr(pos2 + 1, '"') == NULL) { 24404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: invalid " 24504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "quotation '%s'.", *line, pos2); 24604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 24704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 24804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 24904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 25004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 25104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (wpa_config_set_cred(cred, pos, pos2, *line) < 0) 25204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 25304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 25404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 25504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (!end) { 25604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: cred block was not " 25704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "terminated properly.", *line); 25804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 25904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 26004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 26104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (errors) { 26204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_config_free_cred(cred); 26304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred = NULL; 26404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 26504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 26604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return cred; 26704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 26804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 26904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_config_blob * wpa_config_read_blob(FILE *f, int *line, 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *name) 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[256], *pos; 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned char *encoded = NULL, *nencoded; 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int end = 0; 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t encoded_len = 0, len; 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new named blob '%s'", 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *line, name); 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_config_get_line(buf, sizeof(buf), f, line, &pos)) { 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(pos, "}") == 0) { 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = 1; 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = os_strlen(pos); 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nencoded = os_realloc(encoded, encoded_len + len); 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nencoded == NULL) { 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: not enough memory for " 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "blob", *line); 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(encoded); 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encoded = nencoded; 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(encoded + encoded_len, pos, len); 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encoded_len += len; 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!end) { 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: blob was not terminated " 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "properly", *line); 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(encoded); 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = os_zalloc(sizeof(*blob)); 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob == NULL) { 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(encoded); 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->name = os_strdup(name); 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob->data = base64_decode(encoded, encoded_len, &blob->len); 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(encoded); 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob->name == NULL || blob->data == NULL) { 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_free_blob(blob); 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return blob; 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_config_process_blob(struct wpa_config *config, FILE *f, 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int *line, char *bname) 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *name_end; 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt name_end = os_strchr(bname, '='); 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (name_end == NULL) { 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: no blob name terminator", 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *line); 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *name_end = '\0'; 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt blob = wpa_config_read_blob(f, line, bname); 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (blob == NULL) { 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to read blob %s", 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *line, bname); 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_set_blob(config, blob); 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35364f47c5c24428834677459e048420f86e3514c20Dmitry Shmidtstruct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp) 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 35604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char buf[512], *pos; 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int errors = 0, line = 0; 3587832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt struct wpa_ssid *ssid, *tail, *head; 3597832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt struct wpa_cred *cred, *cred_tail, *cred_head; 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config *config; 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id = 0; 36204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int cred_id = 0; 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36464f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt if (name == NULL) 36564f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt return NULL; 36664f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt if (cfgp) 36764f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt config = cfgp; 36864f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt else 36964f47c5c24428834677459e048420f86e3514c20Dmitry Shmidt config = wpa_config_alloc_empty(NULL, NULL); 37061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (config == NULL) { 37161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to allocate config file " 37261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "structure"); 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 37461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 3757832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt tail = head = config->ssid; 3767832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt while (tail && tail->next) 3777832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt tail = tail->next; 3787832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt cred_tail = cred_head = config->cred; 3797832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt while (cred_tail && cred_tail->next) 3807832adbbd72a1b784b7fb74a71a5d4085b0cb0d3Dmitry Shmidt cred_tail = cred_tail->next; 38161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Reading configuration file '%s'", name); 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen(name, "r"); 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (f == NULL) { 38561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Failed to open config file '%s', " 38661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "error: %s", name, strerror(errno)); 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(config); 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_config_get_line(buf, sizeof(buf), f, &line, &pos)) { 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(pos, "network={") == 0) { 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = wpa_config_read_network(f, &line, id++); 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) { 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to " 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "parse network block.", line); 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (head == NULL) { 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head = tail = ssid; 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail->next = ssid; 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tail = ssid; 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_add_prio_network(config, ssid)) { 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to add " 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "network block to priority list.", 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt line); 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 41304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else if (os_strcmp(pos, "cred={") == 0) { 41404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred = wpa_config_read_cred(f, &line, cred_id++); 41504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred == NULL) { 41604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to " 41704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "parse cred block.", line); 41804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt errors++; 41904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt continue; 42004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 42104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred_head == NULL) { 42204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred_head = cred_tail = cred; 42304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } else { 42404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred_tail->next = cred; 42504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cred_tail = cred; 42604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(pos, "blob-base64-", 12) == 0) { 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_config_process_blob(config, f, &line, pos + 12) 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt < 0) { 43161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: failed to " 43261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "process blob.", line); 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_config_process_global(config, pos, line) < 0) { 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Line %d: Invalid configuration " 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "line '%s'.", line, pos); 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt errors++; 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44797d980693a6550ea7a66d85cf1f453b1246436b2Iliyan Malchev config->ssid = head; 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_debug_dump_networks(config); 44997d980693a6550ea7a66d85cf1f453b1246436b2Iliyan Malchev config->cred = cred_head; 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef WPA_IGNORE_CONFIG_ERRORS 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errors) { 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_free(config); 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config = NULL; 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt head = NULL; 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPA_IGNORE_CONFIG_ERRORS */ 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return config; 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_str(FILE *f, const char *field, struct wpa_ssid *ssid) 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value = wpa_config_get(ssid, field); 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\t%s=%s\n", field, value); 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_int(FILE *f, const char *field, int value, int def) 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == def) 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\t%s=%d\n", field, value); 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_bssid(FILE *f, struct wpa_ssid *ssid) 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value = wpa_config_get(ssid, "bssid"); 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tbssid=%s\n", value); 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_psk(FILE *f, struct wpa_ssid *ssid) 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value = wpa_config_get(ssid, "psk"); 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tpsk=%s\n", value); 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_proto(FILE *f, struct wpa_ssid *ssid) 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->proto == DEFAULT_PROTO) 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "proto"); 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tproto=%s\n", value); 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_key_mgmt(FILE *f, struct wpa_ssid *ssid) 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->key_mgmt == DEFAULT_KEY_MGMT) 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "key_mgmt"); 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tkey_mgmt=%s\n", value); 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_pairwise(FILE *f, struct wpa_ssid *ssid) 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->pairwise_cipher == DEFAULT_PAIRWISE) 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "pairwise"); 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tpairwise=%s\n", value); 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_group(FILE *f, struct wpa_ssid *ssid) 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->group_cipher == DEFAULT_GROUP) 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "group"); 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tgroup=%s\n", value); 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_auth_alg(FILE *f, struct wpa_ssid *ssid) 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->auth_alg == 0) 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "auth_alg"); 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\tauth_alg=%s\n", value); 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef IEEE8021X_EAPOL 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_eap(FILE *f, struct wpa_ssid *ssid) 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *value; 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, "eap"); 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value == NULL) 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value[0]) 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\teap=%s\n", value); 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* IEEE8021X_EAPOL */ 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void write_wep_key(FILE *f, int idx, struct wpa_ssid *ssid) 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char field[20], *value; 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(field, sizeof(field), "wep_key%d", idx); 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(field)) 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt value = wpa_config_get(ssid, field); 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (value) { 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\t%s=%s\n", field, value); 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(value); 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 616391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 6175460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidtstatic void write_go_p2p_dev_addr(FILE *f, struct wpa_ssid *ssid) 6185460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt{ 6195460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt char *value = wpa_config_get(ssid, "go_p2p_dev_addr"); 6205460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt if (value == NULL) 6215460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt return; 6225460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt fprintf(f, "\tgo_p2p_dev_addr=%s\n", value); 6235460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt os_free(value); 6245460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt} 6255460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt 6261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void write_p2p_client_list(FILE *f, struct wpa_ssid *ssid) 6271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 6281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *value = wpa_config_get(ssid, "p2p_client_list"); 6291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (value == NULL) 6301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 6311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fprintf(f, "\tp2p_client_list=%s\n", value); 6321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(value); 6331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 634391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 635391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 636391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic void write_psk_list(FILE *f, struct wpa_ssid *ssid) 637391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{ 638391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt struct psk_list_entry *psk; 639391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt char hex[32 * 2 + 1]; 640391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 641391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt dl_list_for_each(psk, &ssid->psk_list, struct psk_list_entry, list) { 642391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt wpa_snprintf_hex(hex, sizeof(hex), psk->psk, sizeof(psk->psk)); 643391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt fprintf(f, "\tpsk_list=%s" MACSTR "-%s\n", 644391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt psk->p2p ? "P2P-" : "", MAC2STR(psk->addr), hex); 645391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt } 646391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt} 647391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 6481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 6491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid) 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define STR(t) write_str(f, #t, ssid) 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define INT(t) write_int(f, #t, ssid->t, 0) 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define INTe(t) write_int(f, #t, ssid->eap.t, 0) 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define INT_DEF(t, def) write_int(f, #t, ssid->t, def) 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define INT_DEFe(t, def) write_int(f, #t, ssid->eap.t, def) 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ssid); 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(scan_ssid); 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_bssid(f, ssid); 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_psk(f, ssid); 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_proto(f, ssid); 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_key_mgmt(f, ssid); 66704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt INT_DEF(bg_scan_period, DEFAULT_BG_SCAN_PERIOD); 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_pairwise(f, ssid); 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_group(f, ssid); 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_auth_alg(f, ssid); 67104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt STR(bgscan); 67204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt STR(autoscan); 6735605286c30e1701491bd3af974ae423727750eddDmitry Shmidt STR(scan_freq); 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef IEEE8021X_EAPOL 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_eap(f, ssid); 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(identity); 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(anonymous_identity); 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(password); 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_cert); 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_path); 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(client_cert); 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(private_key); 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(private_key_passwd); 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(dh_file); 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(subject_match); 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(altsubject_match); 687051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt STR(domain_suffix_match); 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_cert2); 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_path2); 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(client_cert2); 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(private_key2); 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(private_key2_passwd); 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(dh_file2); 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(subject_match2); 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(altsubject_match2); 696051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt STR(domain_suffix_match2); 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(phase1); 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(phase2); 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(pcsc); 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(pin); 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(engine_id); 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(key_id); 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(cert_id); 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_cert_id); 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(key2_id); 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(pin2); 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(engine2_id); 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(cert2_id); 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(ca_cert2_id); 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INTe(engine); 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INTe(engine2); 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT_DEF(eapol_flags, DEFAULT_EAPOL_FLAGS); 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* IEEE8021X_EAPOL */ 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 4; i++) 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt write_wep_key(f, i, ssid); 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(wep_tx_keyidx); 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(priority); 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef IEEE8021X_EAPOL 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT_DEF(eap_workaround, DEFAULT_EAP_WORKAROUND); 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(pac_file); 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT_DEFe(fragment_size, DEFAULT_FRAGMENT_SIZE); 722df5a7e4c5c64890c2425bb47d665bbce4992b676Dmitry Shmidt INTe(ocsp); 723f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt INT_DEFe(sim_num, DEFAULT_USER_SELECTED_SIM); 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* IEEE8021X_EAPOL */ 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(mode); 726a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt INT(frequency); 727d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt write_int(f, "proactive_key_caching", ssid->proactive_key_caching, -1); 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(disabled); 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INT(peerkey); 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211W 731d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt write_int(f, "ieee80211w", ssid->ieee80211w, 732d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt MGMT_FRAME_PROTECTION_DEFAULT); 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211W */ 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt STR(id_str); 7351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 7365460547a121207cf7a99eac45e05fcdd83be3161Dmitry Shmidt write_go_p2p_dev_addr(f, ssid); 7371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt write_p2p_client_list(f, ssid); 738391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt write_psk_list(f, ssid); 7391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 7407a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt INT(dtim_period); 7417a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt INT(beacon_int); 7425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifdef CONFIG_MACSEC 7435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt INT(macsec_policy); 7445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* CONFIG_MACSEC */ 745c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt#ifdef CONFIG_HS20 746c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt INT(update_identifier); 747c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt#endif /* CONFIG_HS20 */ 748661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt write_int(f, "mac_addr", ssid->mac_addr, -1); 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#undef STR 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#undef INT 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#undef INT_DEF 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 75604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic void wpa_config_write_cred(FILE *f, struct wpa_cred *cred) 75704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 758051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt size_t i; 759051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 76004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->priority) 76104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tpriority=%d\n", cred->priority); 76204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->pcsc) 76304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tpcsc=%d\n", cred->pcsc); 76404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->realm) 76504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\trealm=\"%s\"\n", cred->realm); 76604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->username) 76704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tusername=\"%s\"\n", cred->username); 768a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->password && cred->ext_password) 769a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tpassword=ext:%s\n", cred->password); 770a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt else if (cred->password) 77104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tpassword=\"%s\"\n", cred->password); 77204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->ca_cert) 77304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tca_cert=\"%s\"\n", cred->ca_cert); 774a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->client_cert) 775a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tclient_cert=\"%s\"\n", cred->client_cert); 776a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->private_key) 777a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tprivate_key=\"%s\"\n", cred->private_key); 778a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->private_key_passwd) 779a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tprivate_key_passwd=\"%s\"\n", 780a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt cred->private_key_passwd); 78104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->imsi) 78204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\timsi=\"%s\"\n", cred->imsi); 78304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (cred->milenage) 78404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\tmilenage=\"%s\"\n", cred->milenage); 785051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt for (i = 0; i < cred->num_domain; i++) 786051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt fprintf(f, "\tdomain=\"%s\"\n", cred->domain[i]); 787051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (cred->domain_suffix_match) 788b58836ed5520bf4b769f76ef7dcb802af8c900b8Dmitry Shmidt fprintf(f, "\tdomain_suffix_match=\"%s\"\n", 789051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt cred->domain_suffix_match); 790a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->roaming_consortium_len) { 791a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\troaming_consortium="); 792a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt for (i = 0; i < cred->roaming_consortium_len; i++) 793a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "%02x", cred->roaming_consortium[i]); 794a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\n"); 795a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 796a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->eap_method) { 797a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt const char *name; 798a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt name = eap_get_name(cred->eap_method[0].vendor, 799a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt cred->eap_method[0].method); 80009f57babfc1e4473db20ced4f58a4c9f082c8ed8Dmitry Shmidt if (name) 80109f57babfc1e4473db20ced4f58a4c9f082c8ed8Dmitry Shmidt fprintf(f, "\teap=%s\n", name); 802a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 803a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->phase1) 804a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tphase1=\"%s\"\n", cred->phase1); 805a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->phase2) 806a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\tphase2=\"%s\"\n", cred->phase2); 807a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (cred->excluded_ssid) { 808051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt size_t j; 809a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt for (i = 0; i < cred->num_excluded_ssid; i++) { 810a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt struct excluded_ssid *e = &cred->excluded_ssid[i]; 811a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\texcluded_ssid="); 812a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt for (j = 0; j < e->ssid_len; j++) 813a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "%02x", e->ssid[j]); 814a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\n"); 815a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 816a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 817f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->roaming_partner) { 818f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt for (i = 0; i < cred->num_roaming_partner; i++) { 819f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt struct roaming_partner *p = &cred->roaming_partner[i]; 820f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\troaming_partner=\"%s,%d,%u,%s\"\n", 821f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt p->fqdn, p->exact_match, p->priority, 822f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt p->country); 823f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 824f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 825f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->update_identifier) 826f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tupdate_identifier=%d\n", cred->update_identifier); 827f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 828f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->provisioning_sp) 82961593f02176862f4880ddefcb1f54cb5f5d9f043Dmitry Shmidt fprintf(f, "\tprovisioning_sp=\"%s\"\n", cred->provisioning_sp); 830f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->sp_priority) 831f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tsp_priority=%d\n", cred->sp_priority); 832f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 833f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->min_dl_bandwidth_home) 834f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tmin_dl_bandwidth_home=%u\n", 835f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cred->min_dl_bandwidth_home); 836f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->min_ul_bandwidth_home) 837f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tmin_ul_bandwidth_home=%u\n", 838f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cred->min_ul_bandwidth_home); 839f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->min_dl_bandwidth_roaming) 840f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tmin_dl_bandwidth_roaming=%u\n", 841f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cred->min_dl_bandwidth_roaming); 842f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->min_ul_bandwidth_roaming) 843f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tmin_ul_bandwidth_roaming=%u\n", 844f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cred->min_ul_bandwidth_roaming); 845f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 846f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->max_bss_load) 847f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tmax_bss_load=%u\n", 848f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cred->max_bss_load); 849f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 850f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (cred->ocsp) 851f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt fprintf(f, "\tocsp=%d\n", cred->ocsp); 8520cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt 8530cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt if (cred->num_req_conn_capab) { 8540cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt for (i = 0; i < cred->num_req_conn_capab; i++) { 8550cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt int *ports; 8560cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt 8570cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt fprintf(f, "\treq_conn_capab=%u", 8580cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt cred->req_conn_capab_proto[i]); 8590cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt ports = cred->req_conn_capab_port[i]; 8600cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt if (ports) { 8610cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt int j; 8620cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt for (j = 0; ports[j] != -1; j++) { 8630cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt fprintf(f, "%s%d", j > 0 ? "," : ":", 8640cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt ports[j]); 8650cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt } 8660cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt } 8670cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt fprintf(f, "\n"); 8680cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt } 8690cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt } 8700cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt 8710cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt if (cred->required_roaming_consortium_len) { 8720cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt fprintf(f, "\trequired_roaming_consortium="); 8730cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt for (i = 0; i < cred->required_roaming_consortium_len; i++) 8740cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt fprintf(f, "%02x", 8750cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt cred->required_roaming_consortium[i]); 8760cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt fprintf(f, "\n"); 8770cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt } 878f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt 879f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt if (cred->sim_num != DEFAULT_USER_SELECTED_SIM) 880f9bdef99ce3b2858f2812c745a3d6bb093fb0e5dDmitry Shmidt fprintf(f, "\tsim_num=%d\n", cred->sim_num); 88104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 88204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 88304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_config_write_blob(FILE *f, struct wpa_config_blob *blob) 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned char *encoded; 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encoded = base64_encode(blob->data, blob->len, NULL); 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (encoded == NULL) 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\nblob-base64-%s={\n%s}\n", blob->name, encoded); 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(encoded); 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 90004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic void write_global_bin(FILE *f, const char *field, 90104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const struct wpabuf *val) 90204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 90304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t i; 90404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *pos; 90504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 90604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (val == NULL) 90704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return; 90804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 90904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "%s=", field); 91004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt pos = wpabuf_head(val); 91104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < wpabuf_len(val); i++) 91204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "%02X", *pos++); 91304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\n"); 91404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 91504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 91604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_config_write_global(FILE *f, struct wpa_config *config) 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->ctrl_interface) 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "ctrl_interface=%s\n", config->ctrl_interface); 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->ctrl_interface_group) 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "ctrl_interface_group=%s\n", 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->ctrl_interface_group); 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */ 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->eapol_version != DEFAULT_EAPOL_VERSION) 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "eapol_version=%d\n", config->eapol_version); 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->ap_scan != DEFAULT_AP_SCAN) 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "ap_scan=%d\n", config->ap_scan); 93004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->disable_scan_offload) 93104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "disable_scan_offload=%d\n", 93204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt config->disable_scan_offload); 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->fast_reauth != DEFAULT_FAST_REAUTH) 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "fast_reauth=%d\n", config->fast_reauth); 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->opensc_engine_path) 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "opensc_engine_path=%s\n", 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->opensc_engine_path); 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->pkcs11_engine_path) 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "pkcs11_engine_path=%s\n", 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->pkcs11_engine_path); 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->pkcs11_module_path) 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "pkcs11_module_path=%s\n", 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->pkcs11_module_path); 94404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->pcsc_reader) 94504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "pcsc_reader=%s\n", config->pcsc_reader); 94604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->pcsc_pin) 94704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "pcsc_pin=%s\n", config->pcsc_pin); 9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->driver_param) 9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "driver_param=%s\n", config->driver_param); 9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->dot11RSNAConfigPMKLifetime) 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "dot11RSNAConfigPMKLifetime=%d\n", 9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->dot11RSNAConfigPMKLifetime); 9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->dot11RSNAConfigPMKReauthThreshold) 9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "dot11RSNAConfigPMKReauthThreshold=%d\n", 9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->dot11RSNAConfigPMKReauthThreshold); 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->dot11RSNAConfigSATimeout) 9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "dot11RSNAConfigSATimeout=%d\n", 9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->dot11RSNAConfigSATimeout); 9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->update_config) 9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "update_config=%d\n", config->update_config); 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!is_nil_uuid(config->uuid)) { 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[40]; 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt uuid_bin2str(config->uuid, buf, sizeof(buf)); 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "uuid=%s\n", buf); 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->device_name) 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "device_name=%s\n", config->device_name); 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->manufacturer) 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "manufacturer=%s\n", config->manufacturer); 9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->model_name) 9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "model_name=%s\n", config->model_name); 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->model_number) 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "model_number=%s\n", config->model_number); 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->serial_number) 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "serial_number=%s\n", config->serial_number); 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char _buf[WPS_DEV_TYPE_BUFSIZE], *buf; 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = wps_dev_type_bin2str(config->device_type, 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt _buf, sizeof(_buf)); 9811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (os_strcmp(buf, "0-00000000-0") != 0) 9821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fprintf(f, "device_type=%s\n", buf); 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (WPA_GET_BE32(config->os_version)) 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "os_version=%08x\n", 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_GET_BE32(config->os_version)); 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->config_methods) 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "config_methods=%s\n", config->config_methods); 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->wps_cred_processing) 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "wps_cred_processing=%d\n", 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->wps_cred_processing); 99204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->wps_vendor_ext_m1) { 99304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int i, len = wpabuf_len(config->wps_vendor_ext_m1); 99404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt const u8 *p = wpabuf_head_u8(config->wps_vendor_ext_m1); 99504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (len > 0) { 99604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "wps_vendor_ext_m1="); 99704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < len; i++) 99804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "%02x", *p++); 99904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\n"); 100004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 100104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS */ 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_listen_reg_class) 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_listen_reg_class=%u\n", 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->p2p_listen_reg_class); 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_listen_channel) 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_listen_channel=%u\n", 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->p2p_listen_channel); 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_oper_reg_class) 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_oper_reg_class=%u\n", 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->p2p_oper_reg_class); 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_oper_channel) 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_oper_channel=%u\n", config->p2p_oper_channel); 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_go_intent != DEFAULT_P2P_GO_INTENT) 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_go_intent=%u\n", config->p2p_go_intent); 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_ssid_postfix) 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_ssid_postfix=%s\n", config->p2p_ssid_postfix); 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->persistent_reconnect) 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "persistent_reconnect=%u\n", 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->persistent_reconnect); 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_intra_bss != DEFAULT_P2P_INTRA_BSS) 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_intra_bss=%u\n", config->p2p_intra_bss); 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->p2p_group_idle) 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "p2p_group_idle=%u\n", config->p2p_group_idle); 10262271d3fdd5982d0e5e81cf9999a861bba933eacbDmitry Shmidt if (config->p2p_passphrase_len) 10272271d3fdd5982d0e5e81cf9999a861bba933eacbDmitry Shmidt fprintf(f, "p2p_passphrase_len=%u\n", 10282271d3fdd5982d0e5e81cf9999a861bba933eacbDmitry Shmidt config->p2p_passphrase_len); 102904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->p2p_pref_chan) { 103004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt unsigned int i; 103104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "p2p_pref_chan="); 103204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (i = 0; i < config->num_p2p_pref_chan; i++) { 103304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "%s%u:%u", i > 0 ? "," : "", 103404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt config->p2p_pref_chan[i].op_class, 103504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt config->p2p_pref_chan[i].chan); 103604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 103704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\n"); 103804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 103968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (config->p2p_no_go_freq.num) { 104068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt char *val = freq_range_list_str(&config->p2p_no_go_freq); 104168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (val) { 104268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt fprintf(f, "p2p_no_go_freq=%s\n", val); 104368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt os_free(val); 104468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt } 104568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt } 104668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (config->p2p_add_cli_chan) 104768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt fprintf(f, "p2p_add_cli_chan=%d\n", config->p2p_add_cli_chan); 104843cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt if (config->p2p_optimize_listen_chan != 104943cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt DEFAULT_P2P_OPTIMIZE_LISTEN_CHAN) 105043cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt fprintf(f, "p2p_optimize_listen_chan=%d\n", 105143cb578dfe2c492257636f6234a24178ed27789eDmitry Shmidt config->p2p_optimize_listen_chan); 1052d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (config->p2p_go_ht40) 1053d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt fprintf(f, "p2p_go_ht40=%u\n", config->p2p_go_ht40); 105468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (config->p2p_go_vht) 105568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt fprintf(f, "p2p_go_vht=%u\n", config->p2p_go_vht); 1056d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (config->p2p_disabled) 1057d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt fprintf(f, "p2p_disabled=%u\n", config->p2p_disabled); 1058d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (config->p2p_no_group_iface) 1059d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt fprintf(f, "p2p_no_group_iface=%u\n", 1060d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt config->p2p_no_group_iface); 10610ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt if (config->p2p_ignore_shared_freq) 10620ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt fprintf(f, "p2p_ignore_shared_freq=%u\n", 10630ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt config->p2p_ignore_shared_freq); 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->country[0] && config->country[1]) { 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "country=%c%c\n", 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->country[0], config->country[1]); 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->bss_max_count != DEFAULT_BSS_MAX_COUNT) 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "bss_max_count=%u\n", config->bss_max_count); 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->bss_expiration_age != DEFAULT_BSS_EXPIRATION_AGE) 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "bss_expiration_age=%u\n", 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->bss_expiration_age); 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->bss_expiration_scan_count != 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DEFAULT_BSS_EXPIRATION_SCAN_COUNT) 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "bss_expiration_scan_count=%u\n", 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt config->bss_expiration_scan_count); 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->filter_ssids) 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "filter_ssids=%d\n", config->filter_ssids); 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->max_num_sta != DEFAULT_MAX_NUM_STA) 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "max_num_sta=%u\n", config->max_num_sta); 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (config->disassoc_low_ack) 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "disassoc_low_ack=%u\n", config->disassoc_low_ack); 108404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HS20 108504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->hs20) 108604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "hs20=1\n"); 108704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HS20 */ 10881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 10891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (config->interworking) 10901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fprintf(f, "interworking=%u\n", config->interworking); 10911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (!is_zero_ether_addr(config->hessid)) 10921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fprintf(f, "hessid=" MACSTR "\n", MAC2STR(config->hessid)); 10931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (config->access_network_type != DEFAULT_ACCESS_NETWORK_TYPE) 10941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt fprintf(f, "access_network_type=%d\n", 10951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt config->access_network_type); 10961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 109704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (config->pbc_in_m1) 109804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "pbc_in_m1=%u\n", config->pbc_in_m1); 1099f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt if (config->wps_nfc_pw_from_config) { 1100f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt if (config->wps_nfc_dev_pw_id) 1101f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt fprintf(f, "wps_nfc_dev_pw_id=%d\n", 1102f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt config->wps_nfc_dev_pw_id); 1103f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt write_global_bin(f, "wps_nfc_dh_pubkey", 1104f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt config->wps_nfc_dh_pubkey); 1105f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt write_global_bin(f, "wps_nfc_dh_privkey", 1106f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt config->wps_nfc_dh_privkey); 1107f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt write_global_bin(f, "wps_nfc_dev_pw", config->wps_nfc_dev_pw); 1108f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt } 110961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 111061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (config->ext_password_backend) 111161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt fprintf(f, "ext_password_backend=%s\n", 111261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt config->ext_password_backend); 111361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (config->p2p_go_max_inactivity != DEFAULT_P2P_GO_MAX_INACTIVITY) 111461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt fprintf(f, "p2p_go_max_inactivity=%d\n", 111561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt config->p2p_go_max_inactivity); 111661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (config->auto_interworking) 111761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt fprintf(f, "auto_interworking=%d\n", 111861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt config->auto_interworking); 1119d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (config->okc) 1120d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt fprintf(f, "okc=%d\n", config->okc); 1121d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (config->pmf) 1122d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt fprintf(f, "pmf=%d\n", config->pmf); 11237a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt if (config->dtim_period) 11247a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt fprintf(f, "dtim_period=%d\n", config->dtim_period); 11257a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt if (config->beacon_int) 11267a5e50a0554bee77a9da492ea3d86f46147f1671Dmitry Shmidt fprintf(f, "beacon_int=%d\n", config->beacon_int); 1127a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 1128a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt if (config->sae_groups) { 1129a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt int i; 1130a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "sae_groups="); 1131a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt for (i = 0; config->sae_groups[i] >= 0; i++) { 1132a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "%s%d", i > 0 ? " " : "", 1133a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt config->sae_groups[i]); 1134a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 1135a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt fprintf(f, "\n"); 1136a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt } 11370ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt 11380ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt if (config->ap_vendor_elements) { 11390ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt int i, len = wpabuf_len(config->ap_vendor_elements); 11400ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt const u8 *p = wpabuf_head_u8(config->ap_vendor_elements); 11410ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt if (len > 0) { 11420ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt fprintf(f, "ap_vendor_elements="); 11430ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt for (i = 0; i < len; i++) 11440ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt fprintf(f, "%02x", *p++); 11450ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt fprintf(f, "\n"); 11460ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt } 11470ccb66edb8d2a0a397320ace3ec2a03fb0d00d5fDmitry Shmidt } 1148444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt 1149444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt if (config->ignore_old_scan_res) 1150444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt fprintf(f, "ignore_old_scan_res=%d\n", 1151444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt config->ignore_old_scan_res); 115251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 115351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (config->freq_list && config->freq_list[0]) { 115451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt int i; 115551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt fprintf(f, "freq_list="); 115651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt for (i = 0; config->freq_list[i]; i++) { 115751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt fprintf(f, "%s%u", i > 0 ? " " : "", 115851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt config->freq_list[i]); 115951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt } 116051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt fprintf(f, "\n"); 116151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt } 1162ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt if (config->scan_cur_freq != DEFAULT_SCAN_CUR_FREQ) 1163ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt fprintf(f, "scan_cur_freq=%d\n", config->scan_cur_freq); 116451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 116551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (config->sched_scan_interval) 116651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt fprintf(f, "sched_scan_interval=%u\n", 116751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt config->sched_scan_interval); 1168051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1169051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (config->external_sim) 1170051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt fprintf(f, "external_sim=%d\n", config->external_sim); 1171e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 1172e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt if (config->tdls_external_control) 1173e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt fprintf(f, "tdls_external_control=%d\n", 1174e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt config->tdls_external_control); 1175a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt 1176b58836ed5520bf4b769f76ef7dcb802af8c900b8Dmitry Shmidt if (config->wowlan_triggers) 117703658834c33748b9ad86f3d4cdf0c7be9c6887d1Dmitry Shmidt fprintf(f, "wowlan_triggers=%s\n", 1178b58836ed5520bf4b769f76ef7dcb802af8c900b8Dmitry Shmidt config->wowlan_triggers); 1179b58836ed5520bf4b769f76ef7dcb802af8c900b8Dmitry Shmidt 1180a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt if (config->bgscan) 1181a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt fprintf(f, "bgscan=\"%s\"\n", config->bgscan); 118209f57babfc1e4473db20ced4f58a4c9f082c8ed8Dmitry Shmidt 118309f57babfc1e4473db20ced4f58a4c9f082c8ed8Dmitry Shmidt if (config->p2p_search_delay != DEFAULT_P2P_SEARCH_DELAY) 118409f57babfc1e4473db20ced4f58a4c9f082c8ed8Dmitry Shmidt fprintf(f, "p2p_search_delay=%u\n", 118509f57babfc1e4473db20ced4f58a4c9f082c8ed8Dmitry Shmidt config->p2p_search_delay); 1186661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1187661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (config->mac_addr) 1188661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt fprintf(f, "mac_addr=%d\n", config->mac_addr); 1189661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1190661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (config->rand_addr_lifetime != DEFAULT_RAND_ADDR_LIFETIME) 1191661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt fprintf(f, "rand_addr_lifetime=%u\n", 1192661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt config->rand_addr_lifetime); 1193661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 1194661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (config->preassoc_mac_addr) 1195661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt fprintf(f, "preassoc_mac_addr=%d\n", config->preassoc_mac_addr); 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */ 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint wpa_config_write(const char *name, struct wpa_config *config) 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ssid *ssid; 120604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt struct wpa_cred *cred; 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_config_blob *blob; 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = 0; 12110a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande int tmp_len = os_strlen(name) + 5; /* allow space for .tmp suffix */ 12120a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande char *tmp_name = os_malloc(tmp_len); 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12140a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande if (tmp_name == NULL) 12150a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande tmp_name = (char *)name; 12160a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande else 12170a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande os_snprintf(tmp_name, tmp_len, "%s.tmp", name); 12180a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande 12190a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande wpa_printf(MSG_DEBUG, "Writing configuration file '%s'", tmp_name); 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12210a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande f = fopen(tmp_name, "w"); 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (f == NULL) { 12230a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande wpa_printf(MSG_DEBUG, "Failed to open '%s' for writing", tmp_name); 12240a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande if (tmp_name != name) 12250a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande os_free(tmp_name); 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_write_global(f, config); 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 123104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt for (cred = config->cred; cred; cred = cred->next) { 1232fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (cred->temporary) 1233fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt continue; 123404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "\ncred={\n"); 123504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt wpa_config_write_cred(f, cred); 123604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(f, "}\n"); 123704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 123804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (ssid = config->ssid; ssid; ssid = ssid->next) { 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid->key_mgmt == WPA_KEY_MGMT_WPS || ssid->temporary) 12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; /* do not save temporary networks */ 12421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set && 12431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt !ssid->passphrase) 12441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt continue; /* do not save invalid network */ 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "\nnetwork={\n"); 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_config_write_network(f, ssid); 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "}\n"); 12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_BLOBS 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (blob = config->blobs; blob; blob = blob->next) { 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_config_write_blob(f, blob); 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret) 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_BLOBS */ 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12600a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande if (tmp_name != name) { 12610a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande int chmod_ret = 0; 12620a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande#ifdef ANDROID 12630a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande chmod_ret = chmod(tmp_name, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); 12640a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande#endif 12650a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande if (chmod_ret != 0 || rename(tmp_name, name) != 0) 12660a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande ret = -1; 12670a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande 12680a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande os_free(tmp_name); 12690a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande } 12700a217de1802bc5cf785524c1913af7ae3faa9c54Vinit Deshpande 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Configuration file '%s' written %ssuccessfully", 12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt name, ret ? "un" : ""); 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_NO_CONFIG_WRITE */ 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */ 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1278