diff options
Diffstat (limited to 'libbb/parse_config.c')
-rw-r--r-- | libbb/parse_config.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/libbb/parse_config.c b/libbb/parse_config.c index 3174a649e..5109066d8 100644 --- a/libbb/parse_config.c +++ b/libbb/parse_config.c | |||
@@ -59,11 +59,11 @@ Typical usage: | |||
59 | 59 | ||
60 | */ | 60 | */ |
61 | 61 | ||
62 | parser_t* FAST_FUNC config_open(const char *filename) | 62 | parser_t* FAST_FUNC config_open2(const char *filename, FILE* FAST_FUNC (*fopen_func)(const char *path)) |
63 | { | 63 | { |
64 | parser_t *parser = xzalloc(sizeof(parser_t)); | 64 | parser_t *parser = xzalloc(sizeof(parser_t)); |
65 | /* empty file configures nothing */ | 65 | /* empty file configures nothing */ |
66 | parser->fp = fopen_or_warn_stdin(filename); | 66 | parser->fp = fopen_func(filename); |
67 | if (parser->fp) | 67 | if (parser->fp) |
68 | return parser; | 68 | return parser; |
69 | if (ENABLE_FEATURE_CLEAN_UP) | 69 | if (ENABLE_FEATURE_CLEAN_UP) |
@@ -71,6 +71,11 @@ parser_t* FAST_FUNC config_open(const char *filename) | |||
71 | return NULL; | 71 | return NULL; |
72 | } | 72 | } |
73 | 73 | ||
74 | parser_t* FAST_FUNC config_open(const char *filename) | ||
75 | { | ||
76 | return config_open2(filename, fopen_or_warn_stdin); | ||
77 | } | ||
78 | |||
74 | static void config_free_data(parser_t *const parser) | 79 | static void config_free_data(parser_t *const parser) |
75 | { | 80 | { |
76 | free(parser->line); | 81 | free(parser->line); |
@@ -114,6 +119,7 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, unsigned flags, const | |||
114 | int ntokens = flags & 0xFF; | 119 | int ntokens = flags & 0xFF; |
115 | int mintokens = (flags & 0xFF00) >> 8; | 120 | int mintokens = (flags & 0xFF00) >> 8; |
116 | 121 | ||
122 | again: | ||
117 | // N.B. this could only be used in read-in-one-go version, or when tokens use xstrdup(). TODO | 123 | // N.B. this could only be used in read-in-one-go version, or when tokens use xstrdup(). TODO |
118 | //if (!parser->lineno || !(flags & PARSE_DONT_NULL)) | 124 | //if (!parser->lineno || !(flags & PARSE_DONT_NULL)) |
119 | memset(tokens, 0, sizeof(tokens[0]) * ntokens); | 125 | memset(tokens, 0, sizeof(tokens[0]) * ntokens); |
@@ -211,9 +217,13 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, unsigned flags, const | |||
211 | //bb_info_msg("A[%s]", line); | 217 | //bb_info_msg("A[%s]", line); |
212 | } | 218 | } |
213 | 219 | ||
214 | if (ii < mintokens) | 220 | if (ii < mintokens) { |
215 | bb_error_msg_and_die("bad line %u: %d tokens found, %d needed", | 221 | bb_error_msg("bad line %u: %d tokens found, %d needed", |
216 | parser->lineno, ii, mintokens); | 222 | parser->lineno, ii, mintokens); |
223 | if (flags & PARSE_MIN_DIE) | ||
224 | xfunc_die(); | ||
225 | goto again; | ||
226 | } | ||
217 | 227 | ||
218 | return ii; | 228 | return ii; |
219 | } | 229 | } |