From 5415c856eaccd1bc5d064022770a288f43b2e94f Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Mon, 21 Jul 2008 23:05:26 +0000 Subject: 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 --- libbb/appletlib.c | 2 +- libbb/lineedit.c | 4 ++-- libbb/login.c | 2 +- libbb/parse_config.c | 20 +++++++++++++++----- libbb/procps.c | 2 +- libbb/rtc.c | 2 +- libbb/wfopen.c | 20 ++++++++++++++++++++ 7 files changed, 41 insertions(+), 11 deletions(-) (limited to 'libbb') diff --git a/libbb/appletlib.c b/libbb/appletlib.c index 8c35450..beb1d6f 100644 --- a/libbb/appletlib.c +++ b/libbb/appletlib.c @@ -316,7 +316,7 @@ static void parse_config_file(void) || !S_ISREG(st.st_mode) /* Not a regular file? */ || (st.st_uid != 0) /* Not owned by root? */ || (st.st_mode & (S_IWGRP | S_IWOTH)) /* Writable by non-root? */ - || !(f = fopen(config_file, "r")) /* Cannot open? */ + || !(f = fopen_for_read(config_file)) /* Cannot open? */ ) { return; } diff --git a/libbb/lineedit.c b/libbb/lineedit.c index a46b5d2..2e16e6a 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -989,7 +989,7 @@ static void load_history(const char *fromfile) /* NB: do not trash old history if file can't be opened */ - fp = fopen(fromfile, "r"); + fp = fopen_for_read(fromfile); if (fp) { /* clean up old history */ for (hi = state->cnt_history; hi > 0;) { @@ -1022,7 +1022,7 @@ static void save_history(const char *tofile) { FILE *fp; - fp = fopen(tofile, "w"); + fp = fopen_for_write(tofile); if (fp) { int i; diff --git a/libbb/login.c b/libbb/login.c index 1703a2e..b3e199c 100644 --- a/libbb/login.c +++ b/libbb/login.c @@ -32,7 +32,7 @@ void FAST_FUNC print_login_issue(const char *issue_file, const char *tty) puts("\r"); /* start a new line */ - fp = fopen(issue_file, "r"); + fp = fopen_for_read(issue_file); if (!fp) return; while ((c = fgetc(fp)) != EOF) { 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 @@ Typical usage: */ -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 @@ parser_t* FAST_FUNC config_open(const char *filename) 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 FAST_FUNC config_read(parser_t *parser, char **tokens, unsigned flags, const 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 @@ int FAST_FUNC config_read(parser_t *parser, char **tokens, unsigned flags, const //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; } diff --git a/libbb/procps.c b/libbb/procps.c index f799099..ba3d250 100644 --- a/libbb/procps.c +++ b/libbb/procps.c @@ -308,7 +308,7 @@ procps_status_t* FAST_FUNC procps_scan(procps_status_t* sp, int flags) FILE *file; strcpy(filename_tail, "/smaps"); - file = fopen(filename, "r"); + file = fopen_for_read(filename); if (!file) break; while (fgets(buf, sizeof(buf), file)) { diff --git a/libbb/rtc.c b/libbb/rtc.c index 1fdeee8..222d977 100644 --- a/libbb/rtc.c +++ b/libbb/rtc.c @@ -14,7 +14,7 @@ int FAST_FUNC rtc_adjtime_is_utc(void) { int utc = 0; - FILE *f = fopen(ADJTIME_PATH, "r"); + FILE *f = fopen_for_read(ADJTIME_PATH); if (f) { RESERVE_CONFIG_BUFFER(buffer, 128); diff --git a/libbb/wfopen.c b/libbb/wfopen.c index ac365c2..4c84b3b 100644 --- a/libbb/wfopen.c +++ b/libbb/wfopen.c @@ -18,3 +18,23 @@ FILE* FAST_FUNC fopen_or_warn(const char *path, const char *mode) } return fp; } + +FILE* FAST_FUNC fopen_for_read(const char *path) +{ + return fopen(path, "r"); +} + +FILE* FAST_FUNC xfopen_for_read(const char *path) +{ + return xfopen(path, "r"); +} + +FILE* FAST_FUNC fopen_for_write(const char *path) +{ + return fopen(path, "w"); +} + +FILE* FAST_FUNC xfopen_for_write(const char *path) +{ + return xfopen(path, "w"); +} -- cgit v1.1