diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-11-21 14:58:14 +0300 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-11-21 14:58:14 +0300 |
commit | 9229794ab33fa510a5896784958b90f87bef6876 (patch) | |
tree | cbf063d72178aac42b71fe233dc20e5bc226463e | |
parent | a8381948da79b06071c17853a9a2a59947742c8d (diff) |
insmod_ng_main: -80 bytes. Stopp mmapping, use xmalloc_open_read_close().
-rw-r--r-- | archival/libunarchive/archive_xread_all_eof.c | 13 | ||||
-rw-r--r-- | include/libbb.h | 3 | ||||
-rw-r--r-- | modutils/insmod.c | 48 |
3 files changed, 33 insertions, 31 deletions
diff --git a/archival/libunarchive/archive_xread_all_eof.c b/archival/libunarchive/archive_xread_all_eof.c index 8513ffecb..007f68c6d 100644 --- a/archival/libunarchive/archive_xread_all_eof.c +++ b/archival/libunarchive/archive_xread_all_eof.c @@ -3,19 +3,18 @@ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> #include "unarchive.h" #include "libbb.h" -ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *buf, size_t count) +ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, + unsigned char *buf, size_t count) { ssize_t size; size = full_read(archive_handle->src_fd, buf, count); - if ((size != 0) && (size != count)) { - bb_perror_msg_and_die("short read, read %ld of %ld", (long)size, (long)count); + if (size != 0 && size != count) { + bb_error_msg_and_die("short read: %u of %u", + (unsigned)size, (unsigned)count); } - return(size); + return size; } diff --git a/include/libbb.h b/include/libbb.h index 3fb477b33..f574f9b5f 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -60,7 +60,7 @@ #define PATH_MAX 256 #endif -/* Not (yet) used, but tested to work correctly +/* Tested to work correctly (IIRC :]) */ #define MAXINT(T) (T)( \ ((T)-1) > 0 \ ? (T)-1 \ @@ -72,7 +72,6 @@ ? (T)0 \ : ((T)1 << (sizeof(T)*8-1)) \ ) -*/ /* Large file support */ /* Note that CONFIG_LFS forces bbox to be built with all common ops diff --git a/modutils/insmod.c b/modutils/insmod.c index ff96736af..11ba26344 100644 --- a/modutils/insmod.c +++ b/modutils/insmod.c @@ -4263,38 +4263,32 @@ static const char *moderror(int err) } } -int insmod_ng_main( int argc, char **argv) +int insmod_ng_main(int argc, char **argv) { - int i; - int fd; - long int ret; - struct stat st; - unsigned long len; + long ret; + size_t len; void *map; - char *filename, *options = xstrdup(""); + char *filename, *options; - filename = argv[1]; - if (!filename) { + filename = *++argv; + if (!filename) bb_show_usage(); - return -1; - } /* Rest is options */ - for (i = 2; i < argc; i++) { - options = xrealloc(options, strlen(options) + 2 + strlen(argv[i]) + 2); + options = xstrdup(""); + while (*++argv) { + int optlen = strlen(options); + options = xrealloc(options, optlen + 2 + strlen(*argv) + 2); /* Spaces handled by "" pairs, but no way of escaping quotes */ - if (strchr(argv[i], ' ')) { - strcat(options, "\""); - strcat(options, argv[i]); - strcat(options, "\""); - } else { - strcat(options, argv[i]); - } - strcat(options, " "); + sprintf(options + optlen, (strchr(*argv,' ') ? "\"%s\" " : "%s "), *argv); } +#if 0 + /* Any special reason why mmap? It isn't performace critical... */ + int fd; + struct stat st; + unsigned long len; fd = xopen(filename, O_RDONLY); - fstat(fd, &st); len = st.st_size; map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); @@ -4302,6 +4296,16 @@ int insmod_ng_main( int argc, char **argv) bb_perror_msg_and_die("cannot mmap '%s'", filename); } + /* map == NULL on Blackfin, probably on other MMU-less systems too. Workaround. */ + if (map == NULL) { + map = xmalloc(len); + xread(fd, map, len); + } +#else + len = MAXINT(ssize_t); + map = xmalloc_open_read_close(filename, &len); +#endif + ret = syscall(__NR_init_module, map, len, options); if (ret != 0) { bb_perror_msg_and_die("cannot insert '%s': %s (%li)", |