⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config_file.c

📁 一个Linux下无线网卡的设置工具
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * WPA Supplicant / Configuration backend: text file * Copyright (c) 2003-2006, Jouni Malinen <jkmaline@cc.hut.fi> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Alternatively, this software may be distributed under the terms of BSD * license. * * See README and COPYING for more details. * * This file implements a configuration backend for text files. All the * configuration information is stored in a text file that uses a format * described in the sample configuration file, wpa_supplicant.conf. */#include <stdlib.h>#include <stdio.h>#include <string.h>#include "common.h"#include "wpa.h"#include "wpa_supplicant.h"#include "config.h"#include "base64.h"static char * wpa_config_get_line(char *s, int size, FILE *stream, int *line){	char *pos, *end, *sstart;	while (fgets(s, size, stream)) {		(*line)++;		s[size - 1] = '\0';		pos = s;		while (*pos == ' ' || *pos == '\t' || *pos == '\r')			pos++;		if (*pos == '#' || *pos == '\n' || *pos == '\0' ||		    *pos == '\r')			continue;		/* Remove # comments unless they are within a double quoted		 * string. Remove trailing white space. */		sstart = strchr(pos, '"');		if (sstart)			sstart = strrchr(sstart + 1, '"');		if (!sstart)			sstart = pos;		end = strchr(sstart, '#');		if (end)			*end-- = '\0';		else			end = pos + strlen(pos) - 1;		while (end > pos &&		       (*end == '\n' || *end == ' ' || *end == '\t' ||			*end == '\r')) {			*end-- = '\0';		}		if (*pos == '\0')			continue;		return pos;	}	return NULL;}static struct wpa_ssid * wpa_config_read_network(FILE *f, int *line, int id){	struct wpa_ssid *ssid;	int errors = 0, end = 0;	char buf[256], *pos, *pos2;	wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new network block",		   *line);	ssid = (struct wpa_ssid *) malloc(sizeof(*ssid));	if (ssid == NULL)		return NULL;	memset(ssid, 0, sizeof(*ssid));	ssid->id = id;	wpa_config_set_network_defaults(ssid);	while ((pos = wpa_config_get_line(buf, sizeof(buf), f, line))) {		if (strcmp(pos, "}") == 0) {			end = 1;			break;		}		pos2 = strchr(pos, '=');		if (pos2 == NULL) {			wpa_printf(MSG_ERROR, "Line %d: Invalid SSID line "				   "'%s'.", *line, pos);			errors++;			continue;		}		*pos2++ = '\0';		if (*pos2 == '"') {			if (strchr(pos2 + 1, '"') == NULL) {				wpa_printf(MSG_ERROR, "Line %d: invalid "					   "quotation '%s'.", *line, pos2);				errors++;				continue;			}		}		if (wpa_config_set(ssid, pos, pos2, *line) < 0)			errors++;	}	if (!end) {		wpa_printf(MSG_ERROR, "Line %d: network block was not "			   "terminated properly.", *line);		errors++;	}	if (ssid->passphrase) {		if (ssid->psk_set) {			wpa_printf(MSG_ERROR, "Line %d: both PSK and "				   "passphrase configured.", *line);			errors++;		}		wpa_config_update_psk(ssid);	}	if ((ssid->key_mgmt & WPA_KEY_MGMT_PSK) && !ssid->psk_set) {		wpa_printf(MSG_ERROR, "Line %d: WPA-PSK accepted for key "			   "management, but no PSK configured.", *line);		errors++;	}	if ((ssid->group_cipher & WPA_CIPHER_CCMP) &&	    !(ssid->pairwise_cipher & WPA_CIPHER_CCMP)) {		/* Group cipher cannot be stronger than the pairwise cipher. */		wpa_printf(MSG_DEBUG, "Line %d: removed CCMP from group cipher"			   " list since it was not allowed for pairwise "			   "cipher", *line);		ssid->group_cipher &= ~WPA_CIPHER_CCMP;	}	if (errors) {		wpa_config_free_ssid(ssid);		ssid = NULL;	}	return ssid;}static struct wpa_config_blob * wpa_config_read_blob(FILE *f, int *line,						     const char *name){	struct wpa_config_blob *blob;	char buf[256], *pos;	unsigned char *encoded = NULL, *nencoded;	int end = 0;	size_t encoded_len = 0, len;	wpa_printf(MSG_MSGDUMP, "Line: %d - start of a new named blob '%s'",		   *line, name);	while ((pos = wpa_config_get_line(buf, sizeof(buf), f, line))) {		if (strcmp(pos, "}") == 0) {			end = 1;			break;		}		len = strlen(pos);		nencoded = realloc(encoded, encoded_len + len);		if (nencoded == NULL) {			wpa_printf(MSG_ERROR, "Line %d: not enough memory for "				   "blob", *line);			free(encoded);			return NULL;		}		encoded = nencoded;		memcpy(encoded + encoded_len, pos, len);		encoded_len += len;	}	if (!end) {		wpa_printf(MSG_ERROR, "Line %d: blob was not terminated "			   "properly", *line);		free(encoded);		return NULL;	}	blob = malloc(sizeof(*blob));	if (blob == NULL) {		free(encoded);		return NULL;	}	memset(blob, 0, sizeof(*blob));	blob->name = strdup(name);	blob->data = base64_decode(encoded, encoded_len, &blob->len);	free(encoded);	if (blob->name == NULL || blob->data == NULL) {		wpa_config_free_blob(blob);		return NULL;	}	return blob;}struct wpa_config * wpa_config_read(const char *name){	FILE *f;	char buf[256], *pos;	int errors = 0, line = 0;	struct wpa_ssid *ssid, *tail = NULL, *head = NULL;	struct wpa_config *config;	int id = 0, prio;	config = wpa_config_alloc_empty(NULL, NULL);	if (config == NULL)		return NULL;	wpa_printf(MSG_DEBUG, "Reading configuration file '%s'", name);	f = fopen(name, "r");	if (f == NULL) {		free(config);		return NULL;	}	while ((pos = wpa_config_get_line(buf, sizeof(buf), f, &line))) {		if (strcmp(pos, "network={") == 0) {			ssid = wpa_config_read_network(f, &line, id++);			if (ssid == NULL) {				wpa_printf(MSG_ERROR, "Line %d: failed to "					   "parse network block.", line);				errors++;				continue;			}			if (head == NULL) {				head = tail = ssid;			} else {				tail->next = ssid;				tail = ssid;			}			if (wpa_config_add_prio_network(config, ssid)) {				wpa_printf(MSG_ERROR, "Line %d: failed to add "					   "network block to priority list.",					   line);				errors++;				continue;			}		} else if (strncmp(pos, "blob-base64-", 12) == 0) {			char *name = pos + 12, *name_end;			struct wpa_config_blob *blob;			name_end = strchr(name, '=');			if (name_end == NULL) {				wpa_printf(MSG_ERROR, "Line %d: no blob name "					   "terminator", line);				errors++;				continue;			}			*name_end = '\0';			blob = wpa_config_read_blob(f, &line, name);			if (blob == NULL) {				wpa_printf(MSG_ERROR, "Line %d: failed to read"					   " blob %s", line, name);				errors++;				continue;			}			wpa_config_set_blob(config, blob);#ifdef CONFIG_CTRL_IFACE		} else if (strncmp(pos, "ctrl_interface=", 15) == 0) {			free(config->ctrl_interface);			config->ctrl_interface = strdup(pos + 15);			wpa_printf(MSG_DEBUG, "ctrl_interface='%s'",				   config->ctrl_interface);#ifndef CONFIG_CTRL_IFACE_UDP		} else if (strncmp(pos, "ctrl_interface_group=", 21) == 0) {			struct group *grp;			char *endp;			const char *group = pos + 21;			grp = getgrnam(group);			if (grp) {				config->ctrl_interface_gid = grp->gr_gid;				config->ctrl_interface_gid_set = 1;				wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d"					   " (from group name '%s')",					   (int) config->ctrl_interface_gid,					   group);				continue;			}			/* Group name not found - try to parse this as gid */			config->ctrl_interface_gid = strtol(group, &endp, 10);			if (*group == '\0' || *endp != '\0') {				wpa_printf(MSG_DEBUG, "Line %d: Invalid group "					   "'%s'", line, group);				errors++;				continue;			}			config->ctrl_interface_gid_set = 1;			wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d",				   (int) config->ctrl_interface_gid);#endif /* CONFIG_CTRL_IFACE_UDP */#endif /* CONFIG_CTRL_IFACE */		} else if (strncmp(pos, "eapol_version=", 14) == 0) {			config->eapol_version = atoi(pos + 14);			if (config->eapol_version < 1 ||			    config->eapol_version > 2) {				wpa_printf(MSG_ERROR, "Line %d: Invalid EAPOL "					   "version (%d): '%s'.",					   line, config->eapol_version, pos);				errors++;				continue;			}			wpa_printf(MSG_DEBUG, "eapol_version=%d",				   config->eapol_version);		} else if (strncmp(pos, "ap_scan=", 8) == 0) {			config->ap_scan = atoi(pos + 8);			wpa_printf(MSG_DEBUG, "ap_scan=%d", config->ap_scan);		} else if (strncmp(pos, "fast_reauth=", 12) == 0) {			config->fast_reauth = atoi(pos + 12);			wpa_printf(MSG_DEBUG, "fast_reauth=%d",				   config->fast_reauth);		} else if (strncmp(pos, "opensc_engine_path=", 19) == 0) {			free(config->opensc_engine_path);			config->opensc_engine_path = strdup(pos + 19);			wpa_printf(MSG_DEBUG, "opensc_engine_path='%s'",				   config->opensc_engine_path);		} else if (strncmp(pos, "pkcs11_engine_path=", 19) == 0) {			free(config->pkcs11_engine_path);			config->pkcs11_engine_path = strdup(pos + 19);			wpa_printf(MSG_DEBUG, "pkcs11_engine_path='%s'",				   config->pkcs11_engine_path);		} else if (strncmp(pos, "pkcs11_module_path=", 19) == 0) {			free(config->pkcs11_module_path);			config->pkcs11_module_path = strdup(pos + 19);			wpa_printf(MSG_DEBUG, "pkcs11_module_path='%s'",				   config->pkcs11_module_path);		} else if (strncmp(pos, "driver_param=", 13) == 0) {			free(config->driver_param);			config->driver_param = strdup(pos + 13);			wpa_printf(MSG_DEBUG, "driver_param='%s'",				   config->driver_param);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -