insmod_ng_main: -80 bytes. Stopp mmapping, use xmalloc_open_read_close().
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 21 Nov 2006 11:58:14 +0000 (11:58 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 21 Nov 2006 11:58:14 +0000 (11:58 -0000)
archival/libunarchive/archive_xread_all_eof.c
include/libbb.h
modutils/insmod.c

index 8513ffecbe84067483ae9012e99df95072e29ac9..007f68c6d9b6b5e1281068498aedad71024d2d7f 100644 (file)
@@ -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;
 }
index 3fb477b33d058589a3cb96d8514cf760a0ec267e..f574f9b5fb465f081556db226aa77ea68aaa2401 100644 (file)
@@ -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
index ff96736afc347156a5ab375f865a9bc1224767cf..11ba26344410a373c145d233f845b76aef789520 100644 (file)
@@ -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)",