libbb: [x]fopen_for_{read,write} introduced and used.
 (by Valdimir)

function                                             old     new   delta
config_open2                                           -      41     +41
config_read                                          507     542     +35
find_pair                                            169     187     +18
fopen_for_write                                        -      14     +14
fopen_for_read                                         -      14     +14
find_main                                            406     418     +12
xfopen_for_write                                       -      10     +10
xfopen_for_read                                        -      10     +10
popstring                                            134     140      +6
parse_inittab                                        396     401      +5
next_token                                           923     928      +5
pack_gzip                                           1659    1661      +2
bb__parsespent                                       117     119      +2
fallbackSort                                        1719    1717      -2
evalvar                                             1376    1374      -2
qrealloc                                              36      33      -3
...
...
...
...
singlemount                                         4579    4569     -10
process_stdin                                        443     433     -10
patch_main                                          1111    1101     -10
ifupdown_main                                       2175    2165     -10
file_action_grep                                      90      80     -10
uuidcache_init                                       649     637     -12
hush_main                                            797     785     -12
read_config                                          230     217     -13
dpkg_main                                           3835    3820     -15
read_line_input                                     3134    3110     -24
sysctl_main                                          232     203     -29
config_open                                           40      10     -30
WARN_BAD_LINE                                         44       -     -44
login_main                                          1714    1575    -139
------------------------------------------------------------------------------
(add/remove: 5/1 grow/shrink: 8/74 up/down: 174/-737)        Total: -563 bytes


diff --git a/libbb/parse_config.c b/libbb/parse_config.c
index 3174a64..5109066 100644
--- a/libbb/parse_config.c
+++ b/libbb/parse_config.c
@@ -59,11 +59,11 @@
 
 */
 
-parser_t* FAST_FUNC config_open(const char *filename)
+parser_t* FAST_FUNC config_open2(const char *filename, FILE* FAST_FUNC (*fopen_func)(const char *path))
 {
 	parser_t *parser = xzalloc(sizeof(parser_t));
 	/* empty file configures nothing */
-	parser->fp = fopen_or_warn_stdin(filename);
+	parser->fp = fopen_func(filename);
 	if (parser->fp)
 		return parser;
 	if (ENABLE_FEATURE_CLEAN_UP)
@@ -71,6 +71,11 @@
 	return NULL;
 }
 
+parser_t* FAST_FUNC config_open(const char *filename)
+{
+	return config_open2(filename, fopen_or_warn_stdin);
+}
+
 static void config_free_data(parser_t *const parser)
 {
 	free(parser->line);
@@ -114,6 +119,7 @@
 	int ntokens = flags & 0xFF;
 	int mintokens = (flags & 0xFF00) >> 8;
 
+ again:
 	// N.B. this could only be used in read-in-one-go version, or when tokens use xstrdup(). TODO
 	//if (!parser->lineno || !(flags & PARSE_DONT_NULL))
 		memset(tokens, 0, sizeof(tokens[0]) * ntokens);
@@ -211,9 +217,13 @@
 		//bb_info_msg("A[%s]", line);
 	}
 
-	if (ii < mintokens)
-		bb_error_msg_and_die("bad line %u: %d tokens found, %d needed",
-				parser->lineno, ii, mintokens);
+	if (ii < mintokens) {
+		bb_error_msg("bad line %u: %d tokens found, %d needed",
+ 				parser->lineno, ii, mintokens);
+		if (flags & PARSE_MIN_DIE)
+			xfunc_die();
+		goto again;
+	}
 
 	return ii;
 }