summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko2006-11-21 11:58:14 +0000
committerDenis Vlasenko2006-11-21 11:58:14 +0000
commit9229794ab33fa510a5896784958b90f87bef6876 (patch)
treecbf063d72178aac42b71fe233dc20e5bc226463e
parenta8381948da79b06071c17853a9a2a59947742c8d (diff)
downloadbusybox-9229794ab33fa510a5896784958b90f87bef6876.zip
busybox-9229794ab33fa510a5896784958b90f87bef6876.tar.gz
insmod_ng_main: -80 bytes. Stopp mmapping, use xmalloc_open_read_close().
-rw-r--r--archival/libunarchive/archive_xread_all_eof.c13
-rw-r--r--include/libbb.h3
-rw-r--r--modutils/insmod.c48
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 8513ffe..007f68c 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 3fb477b..f574f9b 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 ff96736..11ba263 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)",