diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-04 21:16:46 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-04 21:16:46 +0000 |
| commit | 855ff6f503ee50fad3eb6fa30e2b02f53f32d63d (patch) | |
| tree | 7cc63f646f0c9c5bcacefe2a8e453a3796902af0 | |
| parent | 5db861a9eb93c4562798654f53022088784f35eb (diff) | |
| download | busybox-w32-855ff6f503ee50fad3eb6fa30e2b02f53f32d63d.tar.gz busybox-w32-855ff6f503ee50fad3eb6fa30e2b02f53f32d63d.tar.bz2 busybox-w32-855ff6f503ee50fad3eb6fa30e2b02f53f32d63d.zip | |
modprobe: use buffering line reads (fgets) instead of reads().
libbb: remove reads()
function old new delta
include_conf_file_act 961 980 +19
localcmd 282 284 +2
already_loaded 155 151 -4
in_cksum 58 53 -5
modprobe_main 1630 1624 -6
reads 129 - -129
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 2/3 up/down: 21/-144) Total: -123 bytes
| -rw-r--r-- | include/libbb.h | 3 | ||||
| -rw-r--r-- | libbb/read.c | 25 | ||||
| -rw-r--r-- | modutils/modprobe.c | 39 |
3 files changed, 20 insertions, 47 deletions
diff --git a/include/libbb.h b/include/libbb.h index f7a68492c..9cbab4f1d 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -586,9 +586,6 @@ extern ssize_t nonblock_safe_read(int fd, void *buf, size_t count) FAST_FUNC; | |||
| 586 | extern ssize_t full_read(int fd, void *buf, size_t count) FAST_FUNC; | 586 | extern ssize_t full_read(int fd, void *buf, size_t count) FAST_FUNC; |
| 587 | extern void xread(int fd, void *buf, size_t count) FAST_FUNC; | 587 | extern void xread(int fd, void *buf, size_t count) FAST_FUNC; |
| 588 | extern unsigned char xread_char(int fd) FAST_FUNC; | 588 | extern unsigned char xread_char(int fd) FAST_FUNC; |
| 589 | // Reads one line a-la fgets (but doesn't save terminating '\n'). | ||
| 590 | // Uses single full_read() call, works only on seekable streams. | ||
| 591 | extern char *reads(int fd, char *buf, size_t count) FAST_FUNC; | ||
| 592 | extern ssize_t read_close(int fd, void *buf, size_t maxsz) FAST_FUNC; | 589 | extern ssize_t read_close(int fd, void *buf, size_t maxsz) FAST_FUNC; |
| 593 | extern ssize_t open_read_close(const char *filename, void *buf, size_t maxsz) FAST_FUNC; | 590 | extern ssize_t open_read_close(const char *filename, void *buf, size_t maxsz) FAST_FUNC; |
| 594 | // Reads one line a-la fgets (but doesn't save terminating '\n'). | 591 | // Reads one line a-la fgets (but doesn't save terminating '\n'). |
diff --git a/libbb/read.c b/libbb/read.c index 7af895207..18f62838e 100644 --- a/libbb/read.c +++ b/libbb/read.c | |||
| @@ -127,31 +127,6 @@ unsigned char FAST_FUNC xread_char(int fd) | |||
| 127 | return tmp; | 127 | return tmp; |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | /* Read one line a-la fgets. Works only on seekable streams */ | ||
| 131 | char* FAST_FUNC reads(int fd, char *buffer, size_t size) | ||
| 132 | { | ||
| 133 | char *p; | ||
| 134 | |||
| 135 | if (size < 2) | ||
| 136 | return NULL; | ||
| 137 | size = full_read(fd, buffer, size-1); | ||
| 138 | if ((ssize_t)size <= 0) | ||
| 139 | return NULL; | ||
| 140 | |||
| 141 | buffer[size] = '\0'; | ||
| 142 | p = strchr(buffer, '\n'); | ||
| 143 | if (p) { | ||
| 144 | off_t offset; | ||
| 145 | *p++ = '\0'; | ||
| 146 | /* avoid incorrect (unsigned) widening */ | ||
| 147 | offset = (off_t)(p - buffer) - (off_t)size; | ||
| 148 | /* set fd position right after '\n' */ | ||
| 149 | if (offset && lseek(fd, offset, SEEK_CUR) == (off_t)-1) | ||
| 150 | return NULL; | ||
| 151 | } | ||
| 152 | return buffer; | ||
| 153 | } | ||
| 154 | |||
| 155 | // Reads one line a-la fgets (but doesn't save terminating '\n'). | 130 | // Reads one line a-la fgets (but doesn't save terminating '\n'). |
| 156 | // Reads byte-by-byte. Useful when it is important to not read ahead. | 131 | // Reads byte-by-byte. Useful when it is important to not read ahead. |
| 157 | // Bytes are appended to pfx (which must be malloced, or NULL). | 132 | // Bytes are appended to pfx (which must be malloced, or NULL). |
diff --git a/modutils/modprobe.c b/modutils/modprobe.c index 3a2d893ee..01f8bb89b 100644 --- a/modutils/modprobe.c +++ b/modutils/modprobe.c | |||
| @@ -280,18 +280,18 @@ static int FAST_FUNC include_conf_file_act(const char *filename, | |||
| 280 | struct dep_t **first = &conf->first; | 280 | struct dep_t **first = &conf->first; |
| 281 | struct dep_t **current = &conf->current; | 281 | struct dep_t **current = &conf->current; |
| 282 | int continuation_line = 0; | 282 | int continuation_line = 0; |
| 283 | int fd; | 283 | FILE *f; |
| 284 | 284 | ||
| 285 | if (bb_basename(filename)[0] == '.') | 285 | if (bb_basename(filename)[0] == '.') |
| 286 | return TRUE; | 286 | return TRUE; |
| 287 | 287 | ||
| 288 | fd = open(filename, O_RDONLY); | 288 | f = fopen_for_read(filename); |
| 289 | if (fd < 0) | 289 | if (f == NULL) |
| 290 | return FALSE; | 290 | return FALSE; |
| 291 | 291 | ||
| 292 | // alias parsing is not 100% correct (no correct handling of continuation lines within an alias)! | 292 | // alias parsing is not 100% correct (no correct handling of continuation lines within an alias)! |
| 293 | 293 | ||
| 294 | while (reads(fd, line_buffer, sizeof(line_buffer))) { | 294 | while (fgets(line_buffer, sizeof(line_buffer), f)) { |
| 295 | int l; | 295 | int l; |
| 296 | 296 | ||
| 297 | *strchrnul(line_buffer, '#') = '\0'; | 297 | *strchrnul(line_buffer, '#') = '\0'; |
| @@ -376,9 +376,9 @@ static int FAST_FUNC include_conf_file_act(const char *filename, | |||
| 376 | if (dt) | 376 | if (dt) |
| 377 | dt->m_isblacklisted = 1; | 377 | dt->m_isblacklisted = 1; |
| 378 | } | 378 | } |
| 379 | } /* while (reads(...)) */ | 379 | } /* while (fgets(...)) */ |
| 380 | 380 | ||
| 381 | close(fd); | 381 | fclose(f); |
| 382 | return TRUE; | 382 | return TRUE; |
| 383 | } | 383 | } |
| 384 | 384 | ||
| @@ -403,7 +403,7 @@ static int include_conf_file2(struct include_conf_t *conf, | |||
| 403 | */ | 403 | */ |
| 404 | static struct dep_t *build_dep(void) | 404 | static struct dep_t *build_dep(void) |
| 405 | { | 405 | { |
| 406 | int fd; | 406 | FILE *f; |
| 407 | struct utsname un; | 407 | struct utsname un; |
| 408 | struct include_conf_t conf = { NULL, NULL }; | 408 | struct include_conf_t conf = { NULL, NULL }; |
| 409 | char *filename; | 409 | char *filename; |
| @@ -419,18 +419,18 @@ static struct dep_t *build_dep(void) | |||
| 419 | } | 419 | } |
| 420 | 420 | ||
| 421 | filename = xasprintf(CONFIG_DEFAULT_MODULES_DIR"/%s/"CONFIG_DEFAULT_DEPMOD_FILE, un.release); | 421 | filename = xasprintf(CONFIG_DEFAULT_MODULES_DIR"/%s/"CONFIG_DEFAULT_DEPMOD_FILE, un.release); |
| 422 | fd = open(filename, O_RDONLY); | 422 | f = fopen_for_read(filename); |
| 423 | if (ENABLE_FEATURE_CLEAN_UP) | 423 | if (ENABLE_FEATURE_CLEAN_UP) |
| 424 | free(filename); | 424 | free(filename); |
| 425 | if (fd < 0) { | 425 | if (f == NULL) { |
| 426 | /* Ok, that didn't work. Fall back to looking in /lib/modules */ | 426 | /* Ok, that didn't work. Fall back to looking in /lib/modules */ |
| 427 | fd = open(CONFIG_DEFAULT_MODULES_DIR"/"CONFIG_DEFAULT_DEPMOD_FILE, O_RDONLY); | 427 | f = fopen_for_read(CONFIG_DEFAULT_MODULES_DIR"/"CONFIG_DEFAULT_DEPMOD_FILE); |
| 428 | if (fd < 0) { | 428 | if (f == NULL) { |
| 429 | bb_error_msg_and_die("cannot parse " CONFIG_DEFAULT_DEPMOD_FILE); | 429 | bb_error_msg_and_die("cannot parse " CONFIG_DEFAULT_DEPMOD_FILE); |
| 430 | } | 430 | } |
| 431 | } | 431 | } |
| 432 | 432 | ||
| 433 | while (reads(fd, line_buffer, sizeof(line_buffer))) { | 433 | while (fgets(line_buffer, sizeof(line_buffer), f)) { |
| 434 | int l = strlen(line_buffer); | 434 | int l = strlen(line_buffer); |
| 435 | char *p = 0; | 435 | char *p = 0; |
| 436 | 436 | ||
| @@ -545,8 +545,8 @@ static struct dep_t *build_dep(void) | |||
| 545 | 545 | ||
| 546 | /* is there other dependable module(s) ? */ | 546 | /* is there other dependable module(s) ? */ |
| 547 | continuation_line = (line_buffer[l-1] == '\\'); | 547 | continuation_line = (line_buffer[l-1] == '\\'); |
| 548 | } /* while (reads(...)) */ | 548 | } /* while (fgets(...)) */ |
| 549 | close(fd); | 549 | fclose(f); |
| 550 | 550 | ||
| 551 | /* | 551 | /* |
| 552 | * First parse system-specific options and aliases | 552 | * First parse system-specific options and aliases |
| @@ -594,13 +594,14 @@ static struct dep_t *build_dep(void) | |||
| 594 | /* return 1 = loaded, 0 = not loaded, -1 = can't tell */ | 594 | /* return 1 = loaded, 0 = not loaded, -1 = can't tell */ |
| 595 | static int already_loaded(const char *name) | 595 | static int already_loaded(const char *name) |
| 596 | { | 596 | { |
| 597 | int fd, ret = 0; | 597 | FILE *f; |
| 598 | int ret = 0; | ||
| 598 | 599 | ||
| 599 | fd = open("/proc/modules", O_RDONLY); | 600 | f = fopen_for_read("/proc/modules"); |
| 600 | if (fd < 0) | 601 | if (f == NULL) |
| 601 | return -1; | 602 | return -1; |
| 602 | 603 | ||
| 603 | while (reads(fd, line_buffer, sizeof(line_buffer))) { | 604 | while (fgets(line_buffer, sizeof(line_buffer), f)) { |
| 604 | char *p; | 605 | char *p; |
| 605 | 606 | ||
| 606 | p = strchr(line_buffer, ' '); | 607 | p = strchr(line_buffer, ' '); |
| @@ -627,7 +628,7 @@ static int already_loaded(const char *name) | |||
| 627 | } | 628 | } |
| 628 | } | 629 | } |
| 629 | done: | 630 | done: |
| 630 | close(fd); | 631 | fclose(f); |
| 631 | return ret; | 632 | return ret; |
| 632 | } | 633 | } |
| 633 | 634 | ||
