bb_show_usage();
if (opt & CPIO_OPT_FILE) {
fclose(stdout);
- stdout = fopen(cpio_filename, "w");
+ stdout = fopen_for_write(cpio_filename);
/* Paranoia: I don't trust libc that much */
xdup2(fileno(stdout), STDOUT_FILENO);
}
status_node_t *status_node = NULL;
unsigned status_num;
- status_file = xfopen(filename, "r");
+ status_file = xfopen_for_read(filename);
while ((control_buffer = xmalloc_fgetline_str(status_file, "\n\n")) != NULL) {
const unsigned package_num = fill_package_struct(control_buffer);
if (package_num != -1) {
/* This could do with a cleanup */
static void write_status_file(deb_file_t **deb_file)
{
- FILE *old_status_file = xfopen("/var/lib/dpkg/status", "r");
- FILE *new_status_file = xfopen("/var/lib/dpkg/status.udeb", "w");
+ FILE *old_status_file = xfopen_for_read("/var/lib/dpkg/status");
+ FILE *new_status_file = xfopen_for_write("/var/lib/dpkg/status.udeb");
char *package_name;
char *status_from_file;
char *control_buffer = NULL;
int count;
/* don't use [xw]fopen here, handle error ourself */
- list_stream = fopen(filename, "r");
+ list_stream = fopen_for_read(filename);
if (list_stream == NULL) {
return NULL;
}
/* Create the list file */
list_filename = xasprintf("/var/lib/dpkg/info/%s.%s", package_name, "list");
- out_stream = xfopen(list_filename, "w");
+ out_stream = xfopen_for_write(list_filename);
while (archive_handle->sub_archive->passed) {
/* the leading . has been stripped by data_extract_all_prefix already */
fputs(archive_handle->sub_archive->passed->data, out_stream);
llist_t *newlist = NULL;
while (list) {
- src_stream = xfopen(llist_pop(&list), "r");
+ src_stream = xfopen_for_read(llist_pop(&list));
while ((line = xmalloc_fgetline(src_stream)) != NULL) {
/* kill trailing '/' unless the string is just "/" */
char *cp = last_char_is(line, '/');
resolved_fn = xmalloc_follow_symlinks(fn);
if (resolved_fn == NULL)
bb_simple_perror_msg_and_die(fn);
- in = xfopen(resolved_fn, "r");
+ in = xfopen_for_read(resolved_fn);
fstat(fileno(in), &st);
temp_fn = xasprintf("%sXXXXXX", resolved_fn);
"k::"; /* -k takes list */
getopt32(argv, OPT_STR, &str_ignored, &str_ignored, &str_o, &lst_k, &str_t);
#if ENABLE_FEATURE_SORT_BIG
- if (option_mask32 & FLAG_o) outfile = xfopen(str_o, "w");
+ if (option_mask32 & FLAG_o) outfile = xfopen_for_write(str_o);
if (option_mask32 & FLAG_t) {
if (!str_t[0] || str_t[1])
bb_error_msg_and_die("bad -t parameter");
}
dst_stream = stdout;
if (NOT_LONE_DASH(outname)) {
- dst_stream = xfopen(outname, "w");
+ dst_stream = xfopen_for_write(outname);
fchmod(fileno(dst_stream), mode & (S_IRWXU | S_IRWXG | S_IRWXO));
}
free(line);
FILE *f;
unsigned pid;
- f = fopen(pidfile, "r");
+ f = fopen_for_read(pidfile);
if (f) {
if (fscanf(f, "%u", &pid) == 1)
check(pid);
dev_t ret = 0;
DBG(DEBUG_DEVNAME, printf("opening %s\n", lvm_device));
- if ((lvf = fopen(lvm_device, "r")) == NULL) {
+ if ((lvf = fopen_for_read(lvm_device)) == NULL) {
DBG(DEBUG_DEVNAME, printf("%s: (%d) %s\n", lvm_device, errno,
strerror(errno)));
return 0;
FILE *procpt;
char device[110];
- procpt = fopen(PROC_EVMS_VOLUMES, "r");
+ procpt = fopen_for_read(PROC_EVMS_VOLUMES);
if (!procpt)
return 0;
while (fgets(line, sizeof(line), procpt)) {
lvm_probe_all(cache);
#endif
- proc = fopen(PROC_PARTITIONS, "r");
+ proc = fopen_for_read(PROC_PARTITIONS);
if (!proc)
return -BLKID_ERR_PROC;
}
if (!file) {
- file = fopen(filename, "w");
+ file = fopen_for_write(filename);
opened = filename;
}
unsigned int acflag;
struct dirent* de;
- f = fopen("/proc/apm", "r");
+ f = fopen_for_read("/proc/apm");
if (f) {
if (fscanf(f, "%s %s %s %x", tmp, tmp, tmp, &acflag) != 4)
acflag = 1;
continue;
snprintf(fname, 80, "/proc/acpi/ac_adapter/%s/state",
de->d_name);
- f = fopen(fname, "r");
+ f = fopen_for_read(fname);
if (!f)
continue;
if (fscanf(f, "%s %s", tmp2, tmp) != 2)
file_dev = st_buf.st_rdev;
#endif /* __GNU__ */
- if (!(f = fopen("/proc/swaps", "r")))
+ if (!(f = fopen_for_read("/proc/swaps")))
return 0;
/* Skip the first line */
fgets(buf, sizeof(buf), f);
data->outfile = NULL;
if ((value = getenv("TEST_IO_LOGFILE")) != NULL)
- data->outfile = fopen(value, "w");
+ data->outfile = fopen_for_write(value);
if (!data->outfile)
data->outfile = stderr;
FILE *f;
errcode_t retval;
- f = xfopen(bad_blocks_file, "r");
+ f = xfopen_for_read(bad_blocks_file);
retval = ext2fs_read_bb_FILE(fs, f, bb_list, invalid_block);
fclose (f);
mke2fs_error_msg_and_die(retval, "read bad blocks from list");
X.rsm->F = popen(L.s, "r");
X.rsm->is_pipe = TRUE;
} else {
- X.rsm->F = fopen(L.s, "r"); /* not xfopen! */
+ X.rsm->F = fopen_for_read(L.s); /* not xfopen! */
}
}
} else {
} else {
backup_filename = xasprintf("%s.orig", new_filename);
xrename(new_filename, backup_filename);
- src_stream = xfopen(backup_filename, "r");
+ src_stream = xfopen_for_read(backup_filename);
}
- dst_stream = xfopen(new_filename, "w");
+ dst_stream = xfopen_for_write(new_filename);
fchmod(fileno(dst_stream), saved_stat.st_mode);
printf("patching file %s\n", new_filename);
bb_error_msg_and_die("command only uses one address");
cmdstr += parse_file_cmd(/*sed_cmd,*/ cmdstr, &sed_cmd->string);
if (sed_cmd->cmd == 'w') {
- sed_cmd->sw_file = xfopen(sed_cmd->string, "w");
+ sed_cmd->sw_file = xfopen_for_write(sed_cmd->string);
sed_cmd->sw_last_char = '\n';
}
/* handle branch commands */
{
FILE *rfile;
- rfile = fopen(sed_cmd->string, "r");
+ rfile = fopen_for_read(sed_cmd->string);
if (rfile) {
char *line;
while (opt_f) { // -f
char *line;
FILE *cmdfile;
- cmdfile = xfopen(llist_pop(&opt_f), "r");
+ cmdfile = xfopen_for_read(llist_pop(&opt_f));
while ((line = xmalloc_fgetline(cmdfile)) != NULL) {
add_cmd(line);
free(line);
void* matched,
int depth UNUSED_PARAM)
{
- FILE *file = fopen(filename, "r");
+ FILE *file = fopen_for_read(filename);
if (file == NULL) {
if (!SUPPRESS_ERR_MSGS)
bb_simple_perror_msg(filename);
}
}
/* else: fopen(dir) will succeed, but reading won't */
- file = fopen(cur_file, "r");
+ file = fopen_for_read(cur_file);
if (file == NULL) {
if (!SUPPRESS_ERR_MSGS)
bb_simple_perror_msg(cur_file);
FILE *tty_stream;
int c, savec;
- tty_stream = xfopen(CURRENT_TTY, "r");
+ tty_stream = xfopen_for_read(CURRENT_TTY);
fputs(" ?...", stderr);
fflush(stderr);
c = savec = getc(tty_stream);
/* "Opens" stdin if filename is special, else just opens file: */
extern FILE *xfopen_stdin(const char *filename) FAST_FUNC;
extern FILE *fopen_or_warn_stdin(const char *filename) FAST_FUNC;
+extern FILE* fopen_for_read(const char *path) FAST_FUNC;
+extern FILE* xfopen_for_read(const char *path) FAST_FUNC;
+extern FILE* fopen_for_write(const char *path) FAST_FUNC;
+extern FILE* xfopen_for_write(const char *path) FAST_FUNC;
int bb_pstrcmp(const void *a, const void *b) /* not FAST_FUNC! */;
void qsort_string_vector(char **sv, unsigned count) FAST_FUNC;
* Config file parser
*/
enum {
+ PARSE_VANILLA = 0x00000000, // trim line, collapse delimiters, warn and continue if less than mintokens
PARSE_DONT_REDUCE = 0x00010000, // do not treat consecutive delimiters as one
PARSE_DONT_TRIM = 0x00020000, // do not trim line of leading and trailing delimiters
PARSE_LAST_IS_GREEDY = 0x00040000, // last token takes whole remainder of the line
// PARSE_DONT_NULL = 0x00080000, // do not set tokens[] to NULL
+ PARSE_MIN_DIE = 0x00100000, // die if less tokens found
// keep a copy of current line
PARSE_KEEP_COPY = 0x00200000 * ENABLE_DEBUG_CROND_OPTION,
};
int lineno;
} 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;
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)
"sysinit\0""respawn\0""askfirst\0""wait\0""once\0"
"ctrlaltdel\0""shutdown\0""restart\0";
- parser_t *parser = config_open(INITTAB);
+ parser_t *parser = config_open2(INITTAB, fopen_for_read);
/* No inittab file -- set up some default behavior */
if (parser == NULL) {
/* Reboot on Ctrl-Alt-Del */
|| !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;
}
/* 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;) {
{
FILE *fp;
- fp = fopen(tofile, "w");
+ fp = fopen_for_write(tofile);
if (fp) {
int i;
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) {
*/
-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)
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);
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);
//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;
}
FILE *file;
strcpy(filename_tail, "/smaps");
- file = fopen(filename, "r");
+ file = fopen_for_read(filename);
if (!file)
break;
while (fgets(buf, sizeof(buf), file)) {
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);
}
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");
+}
*result = NULL; /* In case of error... */
if (!pwf) {
- pwf = fopen(_PATH_PASSWD, "r");
+ pwf = fopen_for_read(_PATH_PASSWD);
if (!pwf) {
rv = errno;
goto ERR;
*result = NULL; /* In case of error... */
if (!grf) {
- grf = fopen(_PATH_GROUP, "r");
+ grf = fopen_for_read(_PATH_GROUP);
if (!grf) {
rv = errno;
goto ERR;
*result = NULL; /* In case of error... */
if (!spf) {
- spf = fopen(_PATH_SHADOW, "r");
+ spf = fopen_for_read(_PATH_SHADOW);
if (!spf) {
rv = errno;
goto ERR;
char buff[PWD_BUFFER_SIZE];
rv = -1;
- grfile = fopen(_PATH_GROUP, "r");
+ grfile = fopen_for_read(_PATH_GROUP);
if (grfile != NULL) {
/* We alloc space for 8 gids at a time. */
*result = NULL;
- stream = fopen(GETXXKEY_R_PATHNAME, "r");
+ stream = fopen_for_read(GETXXKEY_R_PATHNAME);
if (!stream)
return errno;
while (1) {
logmode = LOGMODE_BOTH;
#ifdef DEBUGGING
- dbf = xfopen(DEBUGTERM, "w");
+ dbf = xfopen_for_write(DEBUGTERM);
for (n = 1; argv[n]; n++) {
debug(argv[n]);
debug("\n");
if (access("/etc/nologin", F_OK))
return;
- fp = fopen("/etc/nologin", "r");
+ fp = fopen_for_read("/etc/nologin");
if (fp) {
while ((c = getc(fp)) != EOF)
bb_putchar((c=='\n') ? '\r' : c);
#if ENABLE_FEATURE_SECURETTY && !ENABLE_PAM
static int check_securetty(void)
{
- FILE *fp;
- int i;
- char buf[256];
-
- fp = fopen("/etc/securetty", "r");
- if (!fp) {
- /* A missing securetty file is not an error. */
- return 1;
- }
- while (fgets(buf, sizeof(buf)-1, fp)) {
- for (i = strlen(buf)-1; i >= 0; --i) {
- if (!isspace(buf[i]))
+ char *buf;
+ int ret = 1;
+ parser_t *parser = config_open2("/etc/securetty", fopen_for_read);
+ /* N.B. A missing securetty file is not an error. */
+ if (parser) {
+ while (config_read(parser, &buf, 1, 1, "# \t", 0)) {
+ if (strcmp(buf, short_tty) == 0)
break;
}
- buf[++i] = '\0';
- if (!buf[0] || (buf[0] == '#'))
- continue;
- if (strcmp(buf, short_tty) == 0) {
- fclose(fp);
- return 1;
- }
+ config_close(parser);
+ // buf != NULL here iff config file was empty (OK) or buf equals short_tty (OK)
+ ret = buf != NULL;
}
- fclose(fp);
- return 0;
+ return ret;
}
#else
static ALWAYS_INLINE int check_securetty(void) { return 1; }
FILE *fi;
char buf[256];
- fi = fopen(CRONUPDATE, "r");
+ fi = fopen_for_read(CRONUPDATE);
if (fi != NULL) {
unlink(CRONUPDATE);
while (fgets(buf, sizeof(buf), fi) != NULL) {
free(p);
return;
}
- fp = fopen(path, "r");
+ fp = fopen_for_read(path);
if (fp != NULL) {
while (fgets(buf, STRING_LENGTH, fp) != NULL) {
/* Skip whitespace */
case 7:
G.bdebug_messages = val;
if (G.bdebug_messages)
- G.logfile_fd = xfopen("/tmp/fbsplash.log", "w");
+ G.logfile_fd = xfopen_for_write("/tmp/fbsplash.log");
break;
#endif
err:
print_statusline("Log file: ");
current_line = less_gets(sizeof("Log file: ")-1);
if (current_line[0]) {
- fp = fopen(current_line, "w");
+ fp = fopen_for_write(current_line);
if (!fp) {
msg = "Error opening log file";
goto ret;
getopt32(argv, "d:", &line);
if (line)
- table = xfopen(line, "r");
+ table = xfopen_for_read(line);
if (optind >= argc || (rootdir=argv[optind])==NULL) {
bb_error_msg_and_die("root directory not specified");
if (parser) {
/* go through man configuration file and search relevant paths, sections */
char *token[2];
- while (config_read(parser, token, 2, 0, "# \t", PARSE_LAST_IS_GREEDY)) {
- if (!token[1])
- continue;
+ while (config_read(parser, token, 2, 2, "# \t", PARSE_LAST_IS_GREEDY)) {
if (strcmp("MANPATH", token[0]) == 0) {
man_path_list[count_mp] = xstrdup(token[1]);
count_mp++;
if (!(option_mask32 & ARG_n)) { /* --dry-run */
chp = concat_path_file(moddir, CONFIG_DEFAULT_DEPMOD_FILE);
- filedes = xfopen(chp, "w");
+ filedes = xfopen_for_write(chp);
if (ENABLE_FEATURE_CLEAN_UP)
free(chp);
}
/* Get a filedesc for the module. Check that we have a complete path */
if (stat(arg1, &st) < 0 || !S_ISREG(st.st_mode)
- || (fp = fopen(arg1, "r")) == NULL
+ || (fp = fopen_for_read(arg1)) == NULL
) {
/* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
* but do not error out yet if we fail to find it... */
}
/* Check if we have found anything yet */
- if (!m_filename || ((fp = fopen(m_filename, "r")) == NULL)) {
+ if (!m_filename || ((fp = fopen_for_read(m_filename)) == NULL)) {
int r;
char *module_dir;
bb_error_msg_and_die("%s: module not found", m_fullName);
free(module_dir);
if (m_filename == NULL
- || ((fp = fopen(m_filename, "r")) == NULL)
+ || ((fp = fopen_for_read(m_filename)) == NULL)
) {
bb_error_msg_and_die("%s: module not found", m_fullName);
}
FILE *f;
tainted = 0;
- f = fopen(TAINT_FILENAME, "r");
+ f = fopen_for_read(TAINT_FILENAME);
if (f) {
fscanf(f, "%d", &tainted);
fclose(f);
int lsmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int lsmod_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
{
- FILE *file = xfopen("/proc/modules", "r");
+ FILE *file = xfopen_for_read("/proc/modules");
printf("Module Size Used by");
check_tainted();
static int load_dep_bb(void)
{
char *line;
- FILE *fp = fopen(DEPFILE_BB, "r");
+ FILE *fp = fopen_for_read(DEPFILE_BB);
if (!fp)
return 0;
char *line;
FILE* modules;
- modules = xfopen("/proc/modules", "r");
+ modules = xfopen_for_read("/proc/modules");
while ((line = xmalloc_fgets(modules)) != NULL) {
if (strncmp(line, name, len) == 0 && line[len] == ' ') {
free(line);
/* are we lsmod? -> just dump /proc/modules */
if ('l' == applet0) {
- xprint_and_close_file(xfopen("/proc/modules", "r"));
+ xprint_and_close_file(xfopen_for_read("/proc/modules"));
return EXIT_SUCCESS;
}
}
host = xstrdup(ap->sprint(&sa, 1));
}
- fp = xfopen("/proc/net/arp", "r");
+ fp = xfopen_for_read("/proc/net/arp");
/* Bypass header -- read one line */
fgets(line, sizeof(line), fp);
parser = config_open(fileconf);
if (parser) {
char *token[2];
- while (config_read(parser, token, 2, 0, "# \t", 0)) {
+ while (config_read(parser, token, 2, 2, "# \t", 0)) {
unsigned int a,b,c,d;
/*
* Assumes all host names are lower case only
* Presently the dot is copied into name without
* converting to a length/string substring for that label.
*/
- if (!token[1] || sscanf(token[1], ".%u.%u.%u.%u"+1, &a, &b, &c, &d) != 4)
+// if (!token[1] || sscanf(token[1], ".%u.%u.%u.%u"+1, &a, &b, &c, &d) != 4)
+ if (sscanf(token[1], ".%u.%u.%u.%u"+1, &a, &b, &c, &d) != 4)
continue;
m = xzalloc(sizeof(*m));
static void do_sethostname(char *s, int isfile)
{
- FILE *f;
-
if (!s)
return;
- if (!isfile) {
- if (sethostname(s, strlen(s)) < 0) {
- if (errno == EPERM)
- bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
- bb_perror_msg_and_die("sethostname");
- }
- } else {
- f = xfopen(s, "r");
-#define strbuf bb_common_bufsiz1
- while (fgets(strbuf, sizeof(strbuf), f) != NULL) {
- if (strbuf[0] == '#') {
- continue;
- }
- chomp(strbuf);
- do_sethostname(strbuf, 0);
+ if (isfile) {
+ parser_t *parser = config_open2(s, xfopen_for_read);
+ while (config_read(parser, &s, 1, 1, "# \t", 0)) {
+ do_sethostname(s, 0);
}
if (ENABLE_FEATURE_CLEAN_UP)
- fclose(f);
+ config_close(parser);
+ } else if (sethostname(s, strlen(s)) < 0) {
+ if (errno == EPERM)
+ bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
+ bb_perror_msg_and_die("sethostname");
}
}
}
if (ENABLE_FEATURE_CLEAN_UP)
free(buf);
- return 0;
+ return EXIT_SUCCESS;
}
sprintf((char *)filename, "%s/%s", path, httpd_conf);
}
- while ((f = fopen(filename, "r")) == NULL) {
+ while ((f = fopen_for_read(filename)) == NULL) {
if (flag == SUBDIR_PARSE || flag == FIND_FROM_HTTPD_ROOT) {
/* config file not found, no changes to config */
return;
enum { NONE, IFACE, MAPPING } currently_processing = NONE;
defn = xzalloc(sizeof(*defn));
- f = xfopen(filename, "r");
+ f = xfopen_for_read(filename);
while ((buf = xmalloc_fgetline(f)) != NULL) {
#if ENABLE_DESKTOP
static llist_t *read_iface_state(void)
{
llist_t *state_list = NULL;
- FILE *state_fp = fopen(CONFIG_IFUPDOWN_IFSTATE_PATH, "r");
+ FILE *state_fp = fopen_for_read(CONFIG_IFUPDOWN_IFSTATE_PATH);
if (state_fp) {
char *start, *end_ptr;
}
/* Actually write the new state */
- state_fp = xfopen(CONFIG_IFUPDOWN_IFSTATE_PATH, "w");
+ state_fp = xfopen_for_write(CONFIG_IFUPDOWN_IFSTATE_PATH);
state = state_list;
while (state) {
if (state->data) {
#define IPV6_ADDR_MAPPED 0x1000U
#define IPV6_ADDR_RESERVED 0x2000U /* reserved address space */
- f = fopen(_PATH_PROCNET_IFINET6, "r");
+ f = fopen_for_read(_PATH_PROCNET_IFINET6);
if (f != NULL) {
while (fscanf
(f, "%4s%4s%4s%4s%4s%4s%4s%4s %08x %02x %02x %02x %20s\n",
if (hz_internal)
return hz_internal;
- fp = fopen("/proc/net/psched", "r");
+ fp = fopen_for_read("/proc/net/psched");
if (fp) {
unsigned nom, denom;
char buf[512];
FILE *fp;
- fp = fopen(file, "r");
+ fp = fopen_for_read(file);
if (!fp)
return;
while (fgets(buf, sizeof(buf), fp)) {
}
ctl_sk = xsocket(PF_INET, SOCK_DGRAM, 0);
- ifh = xfopen("/proc/net/dev", "r");
+ ifh = xfopen_for_read("/proc/net/dev");
linenum = 0;
while (clist) {
FILE *procinfo;
char *buffer;
- procinfo = fopen(file, "r");
+ procinfo = fopen_for_read(file);
if (procinfo == NULL) {
if (errno != ENOENT) {
bb_simple_perror_msg(file);
struct sockaddr_in s_addr;
struct in_addr mask;
- FILE *fp = xfopen("/proc/net/route", "r");
+ FILE *fp = xfopen_for_read("/proc/net/route");
printf("Kernel IP routing table\n"
"Destination Gateway Genmask Flags %s Iface\n",
int iflags, metric, refcnt, use, prefix_len, slen;
struct sockaddr_in6 snaddr6;
- FILE *fp = xfopen("/proc/net/ipv6_route", "r");
+ FILE *fp = xfopen_for_read("/proc/net/ipv6_route");
printf("Kernel IPv6 routing table\n%-44s%-40s"
"Flags Metric Ref Use Iface\n",
struct IFADDRLIST *al;
char buf[256], tdevice[256], device[256];
- f = xfopen("/proc/net/route", "r");
+ f = xfopen_for_read("/proc/net/route");
/* Find the appropriate interface */
n = 0;
if (!parser)
return;
- while (config_read(parser, token, 2, 0, "# \t", PARSE_LAST_IS_GREEDY)) {
- if (!token[1])
- continue;
+ while (config_read(parser, token, 2, 2, "# \t", PARSE_LAST_IS_GREEDY)) {
for (k = keywords, i = 0; i < ARRAY_SIZE(keywords); k++, i++) {
if (!strcasecmp(token[0], k->keyword)) {
if (!k->handler(token[1], k->var)) {
tmp_dev = find_socket_dev();
sprintf(path, "/proc/net/%s", proto);
- f = fopen(path, "r");
+ f = fopen_for_read(path);
if (!f)
return ilist;
long long uint64_inode;
dev_t dev;
- file = fopen(fname, "r");
+ file = fopen_for_read(fname);
if (!file)
return plist;
while (fgets(line, MAX_LINE, file)) {
if (!parser)
return 1;
- while (config_read(parser, token, 2, 0, "# \t=", PARSE_LAST_IS_GREEDY)) { // TODO: ';' is comment char too
- if (!token[1]) {
- bb_error_msg(WARN_BAD_LINE, filename, parser->lineno);
- } else {
+ while (config_read(parser, token, 2, 2, "# \t=", PARSE_LAST_IS_GREEDY)) { // TODO: ';' is comment char too
+// if (!token[1]) {
+// bb_error_msg(WARN_BAD_LINE, filename, parser->lineno);
+// } else {
+ {
#if 0
char *s = xasprintf("%s=%s", token[0], token[1]);
sysctl_write_setting(s);
while ((cptr = strchr(outname, '/')) != NULL)
*cptr = '.';
- fp = fopen(tmpname, "r");
+ fp = fopen_for_read(tmpname);
if (fp == NULL) {
switch (errno) {
case ENOENT:
static void get_jiffy_counts(void)
{
- FILE* fp = xfopen("stat", "r");
+ FILE* fp = xfopen_for_read("stat");
prev_jif = jif;
if (fscanf(fp, "cpu %lld %lld %lld %lld %lld %lld %lld %lld",
&jif.usr,&jif.nic,&jif.sys,&jif.idle,
#endif
/* read memory info */
- fp = xfopen("meminfo", "r");
+ fp = xfopen_for_read("meminfo");
/*
* Old kernels (such as 2.4.x) had a nice summary of memory info that
memset(&Z, 0, sizeof(Z));
/* read memory info */
- fp = xfopen("meminfo", "r");
+ fp = xfopen_for_read("meminfo");
while (fgets(linebuf, sizeof(linebuf), fp)) {
char *p;
}
/* Write the file. */
- if ((fp_target = fopen(ptarget, "w" )) == NULL)
+ if ((fp_target = fopen(ptarget, "w")) == NULL)
ERROR_EXIT(ptarget);
fputs(line, fp_target);
if (ferror(fp_target) || fclose(fp_target) != 0)
if ((applet_name[0] == 's') && (flags & OPT_c)) {
FILE *policystream;
- policystream = xfopen(policyfile, "r");
+ policystream = xfopen_for_read(policyfile);
if (sepol_set_policydb_from_file(policystream) < 0) {
bb_error_msg_and_die("sepol_set_policydb_from_file on %s", policyfile);
}
if (flags & OPT_o) {
outfile = stdout;
if (NOT_LONE_CHAR(out_filename, '-')) {
- outfile = xfopen(out_filename, "w");
+ outfile = xfopen_for_write(out_filename);
}
}
if (applet_name[0] == 'r') { /* restorecon */
FILE *f = stdin;
if (NOT_LONE_CHAR(input_filename, '-'))
- f = xfopen(input_filename, "r");
+ f = xfopen_for_read(input_filename);
while ((len = getline(&buf, &buf_len, f)) > 0) {
buf[len - 1] = '\0';
errors |= process_one(buf);
getopt32(argv, "c:", &command);
- f = argv[optind] ? xfopen(argv[optind],"r") : NULL;
+ f = argv[optind] ? xfopen_for_read(argv[optind]) : NULL;
if (command) handle(command);
else {
unsigned cmdlen=0;
if (argv[0] && argv[0][0] == '-') {
debug_printf("sourcing /etc/profile\n");
- input = fopen("/etc/profile", "r");
+ input = fopen_for_read("/etc/profile");
if (input != NULL) {
close_on_exec_on(fileno(input));
parse_and_run_file(input);
debug_printf("\nrunning script '%s'\n", argv[optind]);
global_argv = argv + optind;
global_argc = argc - optind;
- input = xfopen(argv[optind], "r");
+ input = xfopen_for_read(argv[optind]);
fcntl(fileno(input), F_SETFD, FD_CLOEXEC);
opt = parse_and_run_file(input);
}
return EXIT_FAILURE;
/* XXX search through $PATH is missing */
- input = fopen(argv[1], "r");
+ input = fopen_for_read(argv[1]);
if (!input) {
bb_error_msg("can't open '%s'", argv[1]);
return EXIT_FAILURE;
if (global_argv[0] && global_argv[0][0] == '-') {
FILE *prof_input;
- prof_input = fopen("/etc/profile", "r");
+ prof_input = fopen_for_read("/etc/profile");
if (prof_input) {
llist_add_to(&close_me_list, (void *)(long)fileno(prof_input));
/* Now run the file */
}
} else if (!local_pending_command && global_argv[optind]) {
//printf( "optind=%d argv[optind]='%s'\n", optind, argv[optind]);
- input = xfopen(global_argv[optind], "r");
+ input = xfopen_for_read(global_argv[optind]);
/* be lazy, never mark this closed */
llist_add_to(&close_me_list, (void *)(long)fileno(input));
}
char buf[256];
char *p = buf;
- f = xfopen(fn, "r");
+ f = xfopen_for_read(fn);
while (!feof(f)) {
fgets(buf, sizeof(buf), f);
p = strstr(buf, "mode ");
return 0;
snprintf(buf, sizeof(buf), "/proc/ide/%s/media", device+5);
- procf = fopen(buf, "r");
+ procf = fopen_for_read(buf);
if (procf != NULL && fgets(buf, sizeof(buf), procf))
is_ide = (!strncmp(buf, "cdrom", 5) ||
!strncmp(buf, "tape", 4));
id[0] & 0xff,
(id[0]>>8) & 0xff
);
- pfd = fopen("/proc/scsi/scsi", "r");
+ pfd = fopen_for_read("/proc/scsi/scsi");
if (!pfd) {
return NULL;
}
/* This is a NOEXEC applet. Be very careful! */
-
static void bb_dump_addfile(dumper_t *dumper, char *name)
{
- char *p;
- FILE *fp;
- char *buf;
-
- fp = xfopen(name, "r");
-
- while ((buf = xmalloc_fgetline(fp)) != NULL) {
- p = skip_whitespace(buf);
-
- if (*p && (*p != '#')) {
- bb_dump_add(dumper, p);
- }
- free(buf);
+ parser_t *parser = config_open2(name, xfopen_for_read);
+ while (config_read(parser, &name, 1, 1, "# \t", 0)) {
+ bb_dump_add(dumper, name);
}
- fclose(fp);
+ config_close(parser);
}
static const char *const add_strings[] = {
do {
char *buf;
- fp = xfopen(*argv, "r");
+ fp = xfopen_for_read(*argv);
jump_in:
while ((buf = xmalloc_fgetline(fp)) != NULL) {
p = buf;
FILE *listfile;
unsigned long blockno;
- listfile = xfopen(filename, "r");
+ listfile = xfopen_for_read(filename);
while (!feof(listfile)) {
fscanf(listfile, "%ld\n", &blockno);
mark_zone(blockno);
* is not a tty and turns into cat. This makes sense. */
if (!isatty(STDOUT_FILENO))
return bb_cat(argv);
- cin = fopen(CURRENT_TTY, "r");
+ cin = fopen_for_read(CURRENT_TTY);
if (!cin)
return bb_cat(argv);
FILE *f;
for (i = 0; i < 2; i++) {
- f = fopen(filesystems[i], "r");
+ f = fopen_for_read(filesystems[i]);
if (!f) continue;
while ((buf = xmalloc_fgetline(f)) != NULL) {
total = 0;
- map = xfopen(mapFile, "r");
+ map = xfopen_for_read(mapFile);
while (fgets(mapline, S_LEN, map)) {
if (sscanf(mapline, "%llx %s %s", &fn_add, mode, fn_name) != 3)
int handleOnFirst;
char *chptr;
- procpt = xfopen("/proc/partitions", "r");
+ procpt = xfopen_for_read("/proc/partitions");
/*
# cat /proc/partitions
major minor #blocks name
int ma, mi;
FILE *proccd;
- proccd = fopen(PROC_CDROMS, "r");
+ proccd = fopen_for_read(PROC_CDROMS);
if (!proccd) {
// static smallint warn = 0;
// if (!warn) {