[RFC/PATCH 08/10] libbb: add config_from_fp() and config_free() functions

Bartosz Golaszewski bartekgola at gmail.com
Thu Aug 13 13:57:28 UTC 2015


The first function allows to create parser_t objects for files
that are already open.

The second frees the parser_t instance without closing the file.

With these functions it is now possible to feed config files to
applets via stdin.

Signed-off-by: Bartosz Golaszewski <bartekgola at gmail.com>
---
 include/libbb.h      |  3 +++
 libbb/parse_config.c | 27 +++++++++++++++++++++------
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/include/libbb.h b/include/libbb.h
index 7b41c9b..e5559be 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1285,11 +1285,14 @@ typedef struct parser_t {
 } parser_t;
 parser_t* config_open(const char *filename) FAST_FUNC;
 parser_t* config_open2(const char *filename, FILE* FAST_FUNC (*fopen_func)(const char *path)) FAST_FUNC;
+parser_t* config_from_fp(FILE *fp) FAST_FUNC;
 /* delims[0] is a comment char (use '\0' to disable), the rest are token delimiters */
 int config_read(parser_t *parser, char **tokens, unsigned flags, const char *delims) FAST_FUNC;
 #define config_read(parser, tokens, max, min, str, flags) \
 	config_read(parser, tokens, ((flags) | (((min) & 0xFF) << 8) | ((max) & 0xFF)), str)
 void config_close(parser_t *parser) FAST_FUNC;
+/* Free all memory used by parser, but don't close the file. */
+void config_free(parser_t *parser) FAST_FUNC;
 
 /* Concatenate path and filename to new allocated buffer.
  * Add "/" only as needed (no duplicate "//" are produced).
diff --git a/libbb/parse_config.c b/libbb/parse_config.c
index 1590d9a..7e3be8a 100644
--- a/libbb/parse_config.c
+++ b/libbb/parse_config.c
@@ -65,17 +65,25 @@ int parse_main(int argc UNUSED_PARAM, char **argv)
 }
 #endif
 
+parser_t* FAST_FUNC config_from_fp(FILE *fp)
+{
+	parser_t *parser;
+
+	parser = xzalloc(sizeof(*parser));
+	parser->fp = fp;
+
+	return parser;
+}
+
 parser_t* FAST_FUNC config_open2(const char *filename, FILE* FAST_FUNC (*fopen_func)(const char *path))
 {
 	FILE* fp;
-	parser_t *parser;
 
 	fp = fopen_func(filename);
 	if (!fp)
 		return NULL;
-	parser = xzalloc(sizeof(*parser));
-	parser->fp = fp;
-	return parser;
+
+	return config_from_fp(fp);
 }
 
 parser_t* FAST_FUNC config_open(const char *filename)
@@ -83,18 +91,25 @@ parser_t* FAST_FUNC config_open(const char *filename)
 	return config_open2(filename, fopen_or_warn_stdin);
 }
 
-void FAST_FUNC config_close(parser_t *parser)
+void FAST_FUNC config_free(parser_t *parser)
 {
 	if (parser) {
 		if (PARSE_KEEP_COPY) /* compile-time constant */
 			free(parser->data);
-		fclose(parser->fp);
 		free(parser->line);
 		free(parser->nline);
 		free(parser);
 	}
 }
 
+void FAST_FUNC config_close(parser_t *parser)
+{
+	if (parser) {
+		fclose(parser->fp);
+		config_free(parser);
+	}
+}
+
 /* This function reads an entire line from a text file,
  * up to a newline, exclusive.
  * Trailing '\' is recognized as line continuation.
-- 
2.1.4



More information about the busybox mailing list