The function `wpa_config_get_line()` is used by the wpa_supplicant config file parser in order to retrieve the next non-commend non-blank line. We'll need the same kind of functionality in order 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@xxxxxx> --- src/utils/config.c | 97 +++++++++++++++++++++++++++++++++ src/utils/config.h | 31 +++++++++++ wpa_supplicant/Makefile | 2 + wpa_supplicant/config_file.c | 100 +---------------------------------- 4 files changed, 131 insertions(+), 99 deletions(-) create mode 100644 src/utils/config.c create mode 100644 src/utils/config.h diff --git a/src/utils/config.c b/src/utils/config.c new file mode 100644 index 000000000..4670536f3 --- /dev/null +++ b/src/utils/config.c @@ -0,0 +1,97 @@ +/* + * Configuration parsing + * Copyright (c) 2021, Patrick Steinhardt <ps@xxxxxx> + * + * 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; +} diff --git a/src/utils/config.h b/src/utils/config.h new file mode 100644 index 000000000..fd4472a34 --- /dev/null +++ b/src/utils/config.h @@ -0,0 +1,31 @@ +/* + * Configuration parsing + * Copyright (c) 2021, Patrick Steinhardt <ps@xxxxxx> + * + * 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 + +#include "includes.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 */ diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile index 59b054cd2..6a92aaace 100644 --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile @@ -83,6 +83,7 @@ OBJS += notify.o OBJS += bss.o OBJS += eap_register.o OBJS += ../src/utils/common.o +OBJS += ../src/utils/config.o OBJS += ../src/utils/wpa_debug.o OBJS += ../src/utils/wpabuf.o OBJS += ../src/utils/bitfield.o @@ -93,6 +94,7 @@ OBJS += rrm.o OBJS += robust_av.o OBJS_p = wpa_passphrase.o OBJS_p += ../src/utils/common.o +OBJS_p += ../src/utils/config.o OBJS_p += ../src/utils/wpa_debug.o OBJS_p += ../src/utils/wpabuf.o OBJS_c = wpa_cli.o ../src/common/wpa_ctrl.o diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c index fd6275e22..a535e3f08 100644 --- a/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c @@ -23,105 +23,7 @@ #include "p2p/p2p.h" #include "eap_peer/eap_methods.h" #include "eap_peer/eap.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; -} +#include "utils/config.h" static int wpa_config_validate_network(struct wpa_ssid *ssid, int line) -- 2.30.0
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap