extern ssize_t full_read(int fd, void *buf, size_t count) FAST_FUNC;
extern void xread(int fd, void *buf, size_t count) FAST_FUNC;
extern unsigned char xread_char(int fd) FAST_FUNC;
-// Reads one line a-la fgets (but doesn't save terminating '\n').
-// Uses single full_read() call, works only on seekable streams.
-extern char *reads(int fd, char *buf, size_t count) FAST_FUNC;
extern ssize_t read_close(int fd, void *buf, size_t maxsz) FAST_FUNC;
extern ssize_t open_read_close(const char *filename, void *buf, size_t maxsz) FAST_FUNC;
// Reads one line a-la fgets (but doesn't save terminating '\n').
return tmp;
}
-/* Read one line a-la fgets. Works only on seekable streams */
-char* FAST_FUNC reads(int fd, char *buffer, size_t size)
-{
- char *p;
-
- if (size < 2)
- return NULL;
- size = full_read(fd, buffer, size-1);
- if ((ssize_t)size <= 0)
- return NULL;
-
- buffer[size] = '\0';
- p = strchr(buffer, '\n');
- if (p) {
- off_t offset;
- *p++ = '\0';
- /* avoid incorrect (unsigned) widening */
- offset = (off_t)(p - buffer) - (off_t)size;
- /* set fd position right after '\n' */
- if (offset && lseek(fd, offset, SEEK_CUR) == (off_t)-1)
- return NULL;
- }
- return buffer;
-}
-
// Reads one line a-la fgets (but doesn't save terminating '\n').
// Reads byte-by-byte. Useful when it is important to not read ahead.
// Bytes are appended to pfx (which must be malloced, or NULL).
struct dep_t **first = &conf->first;
struct dep_t **current = &conf->current;
int continuation_line = 0;
- int fd;
+ FILE *f;
if (bb_basename(filename)[0] == '.')
return TRUE;
- fd = open(filename, O_RDONLY);
- if (fd < 0)
+ f = fopen_for_read(filename);
+ if (f == NULL)
return FALSE;
// alias parsing is not 100% correct (no correct handling of continuation lines within an alias)!
- while (reads(fd, line_buffer, sizeof(line_buffer))) {
+ while (fgets(line_buffer, sizeof(line_buffer), f)) {
int l;
*strchrnul(line_buffer, '#') = '\0';
if (dt)
dt->m_isblacklisted = 1;
}
- } /* while (reads(...)) */
+ } /* while (fgets(...)) */
- close(fd);
+ fclose(f);
return TRUE;
}
*/
static struct dep_t *build_dep(void)
{
- int fd;
+ FILE *f;
struct utsname un;
struct include_conf_t conf = { NULL, NULL };
char *filename;
}
filename = xasprintf(CONFIG_DEFAULT_MODULES_DIR"/%s/"CONFIG_DEFAULT_DEPMOD_FILE, un.release);
- fd = open(filename, O_RDONLY);
+ f = fopen_for_read(filename);
if (ENABLE_FEATURE_CLEAN_UP)
free(filename);
- if (fd < 0) {
+ if (f == NULL) {
/* Ok, that didn't work. Fall back to looking in /lib/modules */
- fd = open(CONFIG_DEFAULT_MODULES_DIR"/"CONFIG_DEFAULT_DEPMOD_FILE, O_RDONLY);
- if (fd < 0) {
+ f = fopen_for_read(CONFIG_DEFAULT_MODULES_DIR"/"CONFIG_DEFAULT_DEPMOD_FILE);
+ if (f == NULL) {
bb_error_msg_and_die("cannot parse " CONFIG_DEFAULT_DEPMOD_FILE);
}
}
- while (reads(fd, line_buffer, sizeof(line_buffer))) {
+ while (fgets(line_buffer, sizeof(line_buffer), f)) {
int l = strlen(line_buffer);
char *p = 0;
/* is there other dependable module(s) ? */
continuation_line = (line_buffer[l-1] == '\\');
- } /* while (reads(...)) */
- close(fd);
+ } /* while (fgets(...)) */
+ fclose(f);
/*
* First parse system-specific options and aliases
/* return 1 = loaded, 0 = not loaded, -1 = can't tell */
static int already_loaded(const char *name)
{
- int fd, ret = 0;
+ FILE *f;
+ int ret = 0;
- fd = open("/proc/modules", O_RDONLY);
- if (fd < 0)
+ f = fopen_for_read("/proc/modules");
+ if (f == NULL)
return -1;
- while (reads(fd, line_buffer, sizeof(line_buffer))) {
+ while (fgets(line_buffer, sizeof(line_buffer), f)) {
char *p;
p = strchr(line_buffer, ' ');
}
}
done:
- close(fd);
+ fclose(f);
return ret;
}