wpa_supplicant: Move wpa_config_get_line() into utils
The function wpa_config_get_line() is used by the wpa_supplicant config file parser to retrieve the next non-comment non-blank line. We'll need the same kind of functionality to implement the file-based external password backend, so as a preparatory step this commit extracts the function into its own standalone file in the utils package. No functional changes are expected from this commit. Signed-off-by: Patrick Steinhardt <ps@pks.im>
This commit is contained in:
parent
fd78ab8270
commit
e9f449ba59
10 changed files with 143 additions and 100 deletions
|
@ -6,6 +6,7 @@ LIB_OBJS= \
|
||||||
base64.o \
|
base64.o \
|
||||||
bitfield.o \
|
bitfield.o \
|
||||||
common.o \
|
common.o \
|
||||||
|
config.o \
|
||||||
crc32.o \
|
crc32.o \
|
||||||
ip_addr.o \
|
ip_addr.o \
|
||||||
json.o \
|
json.o \
|
||||||
|
|
97
src/utils/config.c
Normal file
97
src/utils/config.c
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* Configuration parsing
|
||||||
|
* Copyright (c) 2003-2019, Jouni Malinen <j@w1.fi>
|
||||||
|
*
|
||||||
|
* This software may be distributed under the terms of the BSD license.
|
||||||
|
* See README for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "includes.h"
|
||||||
|
|
||||||
|
#include "utils/config.h"
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
|
||||||
|
static int newline_terminated(const char *buf, size_t buflen)
|
||||||
|
{
|
||||||
|
size_t len = os_strlen(buf);
|
||||||
|
if (len == 0)
|
||||||
|
return 0;
|
||||||
|
if (len == buflen - 1 && buf[buflen - 1] != '\r' &&
|
||||||
|
buf[len - 1] != '\n')
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void skip_line_end(FILE *stream)
|
||||||
|
{
|
||||||
|
char buf[100];
|
||||||
|
while (fgets(buf, sizeof(buf), stream)) {
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
|
if (newline_terminated(buf, sizeof(buf)))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char * wpa_config_get_line(char *s, int size, FILE *stream, int *line,
|
||||||
|
char **_pos)
|
||||||
|
{
|
||||||
|
char *pos, *end, *sstart;
|
||||||
|
|
||||||
|
while (fgets(s, size, stream)) {
|
||||||
|
(*line)++;
|
||||||
|
s[size - 1] = '\0';
|
||||||
|
if (!newline_terminated(s, size)) {
|
||||||
|
/*
|
||||||
|
* The line was truncated - skip rest of it to avoid
|
||||||
|
* confusing error messages.
|
||||||
|
*/
|
||||||
|
wpa_printf(MSG_INFO, "Long line in configuration file "
|
||||||
|
"truncated");
|
||||||
|
skip_line_end(stream);
|
||||||
|
}
|
||||||
|
pos = s;
|
||||||
|
|
||||||
|
/* Skip white space from the beginning of line. */
|
||||||
|
while (*pos == ' ' || *pos == '\t' || *pos == '\r')
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
/* Skip comment lines and empty lines */
|
||||||
|
if (*pos == '#' || *pos == '\n' || *pos == '\0')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove # comments unless they are within a double quoted
|
||||||
|
* string.
|
||||||
|
*/
|
||||||
|
sstart = os_strchr(pos, '"');
|
||||||
|
if (sstart)
|
||||||
|
sstart = os_strrchr(sstart + 1, '"');
|
||||||
|
if (!sstart)
|
||||||
|
sstart = pos;
|
||||||
|
end = os_strchr(sstart, '#');
|
||||||
|
if (end)
|
||||||
|
*end-- = '\0';
|
||||||
|
else
|
||||||
|
end = pos + os_strlen(pos) - 1;
|
||||||
|
|
||||||
|
/* Remove trailing white space. */
|
||||||
|
while (end > pos &&
|
||||||
|
(*end == '\n' || *end == ' ' || *end == '\t' ||
|
||||||
|
*end == '\r'))
|
||||||
|
*end-- = '\0';
|
||||||
|
|
||||||
|
if (*pos == '\0')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (_pos)
|
||||||
|
*_pos = pos;
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_pos)
|
||||||
|
*_pos = NULL;
|
||||||
|
return NULL;
|
||||||
|
}
|
29
src/utils/config.h
Normal file
29
src/utils/config.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* Configuration parsing
|
||||||
|
* Copyright (c) 2003-2019, Jouni Malinen <j@w1.fi>
|
||||||
|
*
|
||||||
|
* This software may be distributed under the terms of the BSD license.
|
||||||
|
* See README for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UTILS_CONFIG_H
|
||||||
|
#define UTILS_CONFIG_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wpa_config_get_line - Read the next configuration file line
|
||||||
|
* @s: Buffer for the line
|
||||||
|
* @size: The buffer length
|
||||||
|
* @stream: File stream to read from
|
||||||
|
* @line: Pointer to a variable storing the file line number
|
||||||
|
* @_pos: Buffer for the pointer to the beginning of data on the text line or
|
||||||
|
* %NULL if not needed (returned value used instead)
|
||||||
|
* Returns: Pointer to the beginning of data on the text line or %NULL if no
|
||||||
|
* more text lines are available.
|
||||||
|
*
|
||||||
|
* This function reads the next non-empty line from the configuration file and
|
||||||
|
* removes comments. The returned string is guaranteed to be null-terminated.
|
||||||
|
*/
|
||||||
|
char * wpa_config_get_line(char *s, int size, FILE *stream, int *line,
|
||||||
|
char **_pos);
|
||||||
|
|
||||||
|
#endif /* UTILS_CONFIG_H */
|
|
@ -16,7 +16,7 @@
|
||||||
#include "wpa_supplicant_i.h"
|
#include "wpa_supplicant_i.h"
|
||||||
#include "bss.h"
|
#include "bss.h"
|
||||||
#include "wnm_sta.h"
|
#include "wnm_sta.h"
|
||||||
#include "config.h"
|
#include "../../../wpa_supplicant/config.h"
|
||||||
#include "../fuzzer-common.h"
|
#include "../fuzzer-common.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -94,6 +94,7 @@ OBJS += notify.c
|
||||||
OBJS += bss.c
|
OBJS += bss.c
|
||||||
OBJS += eap_register.c
|
OBJS += eap_register.c
|
||||||
OBJS += src/utils/common.c
|
OBJS += src/utils/common.c
|
||||||
|
OBJS += src/utils/config.c
|
||||||
OBJS += src/utils/wpa_debug.c
|
OBJS += src/utils/wpa_debug.c
|
||||||
OBJS += src/utils/wpabuf.c
|
OBJS += src/utils/wpabuf.c
|
||||||
OBJS += src/utils/bitfield.c
|
OBJS += src/utils/bitfield.c
|
||||||
|
|
|
@ -83,6 +83,7 @@ OBJS += notify.o
|
||||||
OBJS += bss.o
|
OBJS += bss.o
|
||||||
OBJS += eap_register.o
|
OBJS += eap_register.o
|
||||||
OBJS += ../src/utils/common.o
|
OBJS += ../src/utils/common.o
|
||||||
|
OBJS += ../src/utils/config.o
|
||||||
OBJS += ../src/utils/wpa_debug.o
|
OBJS += ../src/utils/wpa_debug.o
|
||||||
OBJS += ../src/utils/wpabuf.o
|
OBJS += ../src/utils/wpabuf.o
|
||||||
OBJS += ../src/utils/bitfield.o
|
OBJS += ../src/utils/bitfield.o
|
||||||
|
|
|
@ -23,105 +23,7 @@
|
||||||
#include "p2p/p2p.h"
|
#include "p2p/p2p.h"
|
||||||
#include "eap_peer/eap_methods.h"
|
#include "eap_peer/eap_methods.h"
|
||||||
#include "eap_peer/eap.h"
|
#include "eap_peer/eap.h"
|
||||||
|
#include "utils/config.h"
|
||||||
|
|
||||||
static int newline_terminated(const char *buf, size_t buflen)
|
|
||||||
{
|
|
||||||
size_t len = os_strlen(buf);
|
|
||||||
if (len == 0)
|
|
||||||
return 0;
|
|
||||||
if (len == buflen - 1 && buf[buflen - 1] != '\r' &&
|
|
||||||
buf[len - 1] != '\n')
|
|
||||||
return 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void skip_line_end(FILE *stream)
|
|
||||||
{
|
|
||||||
char buf[100];
|
|
||||||
while (fgets(buf, sizeof(buf), stream)) {
|
|
||||||
buf[sizeof(buf) - 1] = '\0';
|
|
||||||
if (newline_terminated(buf, sizeof(buf)))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* wpa_config_get_line - Read the next configuration file line
|
|
||||||
* @s: Buffer for the line
|
|
||||||
* @size: The buffer length
|
|
||||||
* @stream: File stream to read from
|
|
||||||
* @line: Pointer to a variable storing the file line number
|
|
||||||
* @_pos: Buffer for the pointer to the beginning of data on the text line or
|
|
||||||
* %NULL if not needed (returned value used instead)
|
|
||||||
* Returns: Pointer to the beginning of data on the text line or %NULL if no
|
|
||||||
* more text lines are available.
|
|
||||||
*
|
|
||||||
* This function reads the next non-empty line from the configuration file and
|
|
||||||
* removes comments. The returned string is guaranteed to be null-terminated.
|
|
||||||
*/
|
|
||||||
static char * wpa_config_get_line(char *s, int size, FILE *stream, int *line,
|
|
||||||
char **_pos)
|
|
||||||
{
|
|
||||||
char *pos, *end, *sstart;
|
|
||||||
|
|
||||||
while (fgets(s, size, stream)) {
|
|
||||||
(*line)++;
|
|
||||||
s[size - 1] = '\0';
|
|
||||||
if (!newline_terminated(s, size)) {
|
|
||||||
/*
|
|
||||||
* The line was truncated - skip rest of it to avoid
|
|
||||||
* confusing error messages.
|
|
||||||
*/
|
|
||||||
wpa_printf(MSG_INFO, "Long line in configuration file "
|
|
||||||
"truncated");
|
|
||||||
skip_line_end(stream);
|
|
||||||
}
|
|
||||||
pos = s;
|
|
||||||
|
|
||||||
/* Skip white space from the beginning of line. */
|
|
||||||
while (*pos == ' ' || *pos == '\t' || *pos == '\r')
|
|
||||||
pos++;
|
|
||||||
|
|
||||||
/* Skip comment lines and empty lines */
|
|
||||||
if (*pos == '#' || *pos == '\n' || *pos == '\0')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove # comments unless they are within a double quoted
|
|
||||||
* string.
|
|
||||||
*/
|
|
||||||
sstart = os_strchr(pos, '"');
|
|
||||||
if (sstart)
|
|
||||||
sstart = os_strrchr(sstart + 1, '"');
|
|
||||||
if (!sstart)
|
|
||||||
sstart = pos;
|
|
||||||
end = os_strchr(sstart, '#');
|
|
||||||
if (end)
|
|
||||||
*end-- = '\0';
|
|
||||||
else
|
|
||||||
end = pos + os_strlen(pos) - 1;
|
|
||||||
|
|
||||||
/* Remove trailing white space. */
|
|
||||||
while (end > pos &&
|
|
||||||
(*end == '\n' || *end == ' ' || *end == '\t' ||
|
|
||||||
*end == '\r'))
|
|
||||||
*end-- = '\0';
|
|
||||||
|
|
||||||
if (*pos == '\0')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (_pos)
|
|
||||||
*_pos = pos;
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_pos)
|
|
||||||
*_pos = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int wpa_config_validate_network(struct wpa_ssid *ssid, int line)
|
static int wpa_config_validate_network(struct wpa_ssid *ssid, int line)
|
||||||
|
|
|
@ -230,6 +230,10 @@
|
||||||
RelativePath="..\..\..\src\utils\common.c"
|
RelativePath="..\..\..\src\utils\common.c"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\..\src\utils\config.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\config.c"
|
RelativePath="..\..\config.c"
|
||||||
>
|
>
|
||||||
|
|
|
@ -230,6 +230,10 @@
|
||||||
RelativePath="..\..\..\src\utils\common.c"
|
RelativePath="..\..\..\src\utils\common.c"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\..\src\utils\config.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\config.c"
|
RelativePath="..\..\config.c"
|
||||||
>
|
>
|
||||||
|
|
|
@ -230,6 +230,10 @@
|
||||||
RelativePath="..\..\..\src\utils\common.c"
|
RelativePath="..\..\..\src\utils\common.c"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\..\src\utils\config.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\config.c"
|
RelativePath="..\..\config.c"
|
||||||
>
|
>
|
||||||
|
|
Loading…
Reference in a new issue