Signed-off-by: Alexey Gladkov <[email protected]>
---
 Makefile.am      |   15 ++++--
 configure.ac     |    5 ++
 depmod.c         |    2 +-
 elfops.c         |    2 +-
 elfops.h         |    2 +-
 grabfile.c       |   63 ++++++++++++++++++++++
 grabfile.h       |   23 ++++++++
 grabfile_plain.c |   52 ++++++++++++++++++
 grabfile_plain.h |    9 +++
 grabfile_zlib.c  |   67 +++++++++++++++++++++++
 grabfile_zlib.h  |    9 +++
 modinfo.c        |    2 +-
 modprobe.c       |    2 +-
 zlibsupport.c    |  154 ------------------------------------------------------
 zlibsupport.h    |   23 --------
 15 files changed, 243 insertions(+), 187 deletions(-)
 create mode 100644 grabfile.c
 create mode 100644 grabfile.h
 create mode 100644 grabfile_plain.c
 create mode 100644 grabfile_plain.h
 create mode 100644 grabfile_zlib.c
 create mode 100644 grabfile_zlib.h
 delete mode 100644 zlibsupport.c
 delete mode 100644 zlibsupport.h

diff --git a/Makefile.am b/Makefile.am
index 3e699e5..114d670 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,13 +1,18 @@
 ACLOCAL_AMFLAGS = -I m4
 
+grabfile_SOURCES = grabfile.c grabfile.h grabfile_plain.c grabfile_plain.h
+
+if WITH_ZLIB
+grabfile_SOURCES += grabfile_zlib.c grabfile_zlib.h
+endif
+
 insmod_SOURCES = insmod.c testing.h
 lsmod_SOURCES = lsmod.c testing.h
-modprobe_SOURCES = modprobe.c zlibsupport.c zlibsupport.h testing.h
+modprobe_SOURCES = modprobe.c testing.h $(grabfile_SOURCES)
 rmmod_SOURCES = rmmod.c testing.h
-depmod_SOURCES = depmod.c zlibsupport.c tables.c \
-       zlibsupport.h tables.h testing.h
-modinfo_SOURCES = modinfo.c zlibsupport.c zlibsupport.h testing.h
-modindex_SOURCES = modindex.c zlibsupport.c zlibsupport.h testing.h
+depmod_SOURCES = depmod.c tables.c tables.h testing.h $(grabfile_SOURCES)
+modinfo_SOURCES = modinfo.c testing.h $(grabfile_SOURCES)
+modindex_SOURCES = modindex.c testing.h $(grabfile_SOURCES)
 
 insmod_static_SOURCES = insmod.c
 insmod_static_LDFLAGS = -static
diff --git a/configure.ac b/configure.ac
index b085178..42629fa 100644
--- a/configure.ac
+++ b/configure.ac
@@ -8,11 +8,14 @@ AX_ENABLE_BUILDDIR([build])
 # non-Linux systems and it's reasonable to expect GNU-compatibility here.
 AM_INIT_AUTOMAKE([-Wno-portability])
 
+WITH_ZLIB=no
+
 # If zlib is required, libz must be linked static, modprobe is in
 # /sbin, libz is in /usr/lib and may not be available when it is run.
 AC_ARG_ENABLE(zlib,
 [  --enable-zlib               Handle gzipped modules],
 [if test "$enableval" = "yes"; then
+  WITH_ZLIB=yes
   AC_DEFINE(CONFIG_USE_ZLIB)
   zlib_flags="-Wl,-Bstatic -lz -Wl,-Bdynamic"
 fi])
@@ -22,9 +25,11 @@ AC_ARG_ENABLE(zlib-dynamic,
                                dynamically. Note that libz must be installed
                                in /lib for this to work.],
 [if test "$enableval" = "yes"; then
+  WITH_ZLIB=yes
   AC_DEFINE(CONFIG_USE_ZLIB)
   zlib_flags="-lz"
 fi])
+AM_CONDITIONAL(WITH_ZLIB, test "$WITH_ZLIB" = "yes")
 
 AC_PROG_CC
 AC_PROG_RANLIB
diff --git a/depmod.c b/depmod.c
index a1d2f8c..3b5592e 100644
--- a/depmod.c
+++ b/depmod.c
@@ -38,7 +38,7 @@
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
 
 #include "util.h"
-#include "zlibsupport.h"
+#include "grabfile.h"
 #include "depmod.h"
 #include "logging.h"
 #include "index.h"
diff --git a/elfops.c b/elfops.c
index 3468265..5177a9b 100644
--- a/elfops.c
+++ b/elfops.c
@@ -11,7 +11,7 @@
 #include "logging.h"
 #include "elfops.h"
 #include "tables.h"
-#include "zlibsupport.h"
+#include "grabfile.h"
 
 #include "testing.h"
 
diff --git a/elfops.h b/elfops.h
index fd4b014..7594931 100644
--- a/elfops.h
+++ b/elfops.h
@@ -3,7 +3,7 @@
 #include <stdio.h>
 #include <stdint.h>
 #include "logging.h"
-#include "zlibsupport.h"
+#include "grabfile.h"
 
 /* All the icky stuff to do with manipulating 64 and 32-bit modules
    belongs here. */
diff --git a/grabfile.c b/grabfile.c
new file mode 100644
index 0000000..d5a09ad
--- /dev/null
+++ b/grabfile.c
@@ -0,0 +1,63 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "logging.h"
+
+#include "grabfile.h"
+#include "grabfile_plain.h"
+
+#ifdef CONFIG_USE_ZLIB
+#include "grabfile_zlib.h"
+#endif
+
+static int compress_type(const char *filename)
+{
+       int fd;
+       unsigned char buf[6];
+
+       if ((fd = open(filename, O_RDONLY)) == -1)
+               return -1;
+
+       if (read(fd, buf, sizeof(buf)) == -1) {
+               close(fd);
+               return -1;
+       }
+
+       close(fd);
+
+       if (buf[0] == 0x1F && buf[1] == 0x8B)
+               return GZIP_FILE;
+
+       return PLAIN_FILE;
+}
+
+int grab_file(const char *filename, struct grab_data *fdata)
+{
+       switch (compress_type(filename)) {
+#ifdef CONFIG_USE_ZLIB
+               case GZIP_FILE:
+                       return gzip_grab_file(filename, fdata);
+#endif
+               case PLAIN_FILE:
+                       return plain_grab_file(filename, fdata);
+       }
+       fatal("Unknown compression type\n");
+       return -1;
+}
+
+void release_file(struct grab_data *fdata)
+{
+       switch (fdata->type) {
+#ifdef CONFIG_USE_ZLIB
+               case GZIP_FILE:
+                       gzip_release_file(fdata);
+                       return;
+#endif
+               case PLAIN_FILE:
+                       plain_release_file(fdata);
+                       return;
+       }
+       fatal("Unknown compression type\n");
+}
diff --git a/grabfile.h b/grabfile.h
new file mode 100644
index 0000000..99565db
--- /dev/null
+++ b/grabfile.h
@@ -0,0 +1,23 @@
+#ifndef _GRAB_FILE_H
+#define _GRAB_FILE_H
+
+enum file_type
+{
+       PLAIN_FILE,
+       GZIP_FILE
+};
+
+struct grab_data
+{
+       enum file_type type;
+       unsigned long size;
+       void *data;
+};
+
+/* Grab file.  Decompresses if that is supported.  Returns NULL on error. */
+extern int grab_file(const char *filename, struct grab_data *fdata);
+
+/* Free it up. */
+extern void release_file(struct grab_data *fdata);
+
+#endif /* _GRAB_FILE_H */
diff --git a/grabfile_plain.c b/grabfile_plain.c
new file mode 100644
index 0000000..8176c8a
--- /dev/null
+++ b/grabfile_plain.c
@@ -0,0 +1,52 @@
+/* Support for compressed modules.  Willy Tarreau <[email protected]>
+ * did the support for modutils, Andrey Borzenkov <[email protected]>
+ * ported it to module-init-tools, and I said it was too ugly to live
+ * and rewrote it 8).
+ *
+ * (C) 2003 Rusty Russell, IBM Corporation.
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+#include "grabfile_plain.h"
+#include "logging.h"
+#include "testing.h"
+
+static int grab_fd(int fd, struct grab_data *fdata)
+{
+       struct stat st;
+       int ret;
+
+       ret = fstat(fd, &st);
+       if (ret < 0)
+               return -1;
+       fdata->size = st.st_size;
+       fdata->data = mmap(0, fdata->size, PROT_READ|PROT_WRITE, MAP_PRIVATE, 
fd, 0);
+       if (fdata->data == MAP_FAILED)
+               fdata->data = NULL;
+       return 0;
+}
+
+int plain_grab_file(const char *filename, struct grab_data *fdata)
+{
+       int fd;
+
+       fd = open(filename, O_RDONLY, 0);
+       if (fd < 0)
+               return -1;
+       if (grab_fd(fd, fdata) < 0)
+               return -1;
+       fdata->type = PLAIN_FILE;
+       close(fd);
+       return 0;
+}
+
+void plain_release_file(struct grab_data *fdata)
+{
+       munmap(fdata->data, fdata->size);
+}
diff --git a/grabfile_plain.h b/grabfile_plain.h
new file mode 100644
index 0000000..0b76205
--- /dev/null
+++ b/grabfile_plain.h
@@ -0,0 +1,9 @@
+#ifndef _GRABFILE_PLAIN_H
+#define _GRABFILE_PLAIN_H
+
+#include "grabfile.h"
+
+extern int plain_grab_file(const char *filename, struct grab_data *fdata);
+extern void plain_release_file(struct grab_data *fdata);
+
+#endif /* _GRABFILE_PLAIN_H */
diff --git a/grabfile_zlib.c b/grabfile_zlib.c
new file mode 100644
index 0000000..4ad2a97
--- /dev/null
+++ b/grabfile_zlib.c
@@ -0,0 +1,67 @@
+/* Support for compressed modules.  Willy Tarreau <[email protected]>
+ * did the support for modutils, Andrey Borzenkov <[email protected]>
+ * ported it to module-init-tools, and I said it was too ugly to live
+ * and rewrote it 8).
+ *
+ * (C) 2003 Rusty Russell, IBM Corporation.
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+#include "grabfile_zlib.h"
+#include "logging.h"
+#include "testing.h"
+
+#include <zlib.h>
+
+static int grab_contents(gzFile *gzfd, struct grab_data *fdata)
+{
+       unsigned int max = 16384;
+       int ret;
+
+       fdata->data = NOFAIL(malloc(max));
+       fdata->size = 0;
+
+       while ((ret = gzread(gzfd, fdata->data + fdata->size, max - 
fdata->size)) > 0) {
+               fdata->size += ret;
+               if (fdata->size == max)
+                       fdata->data = NOFAIL(realloc(fdata->data, max *= 2));
+       }
+       if (ret < 0) {
+               free(fdata->data);
+               fdata->data = NULL;
+               return -1;
+       }
+
+       return 0;
+}
+
+int gzip_grab_file(const char *filename, struct grab_data *fdata)
+{
+       gzFile gzfd;
+
+       errno = 0;
+       gzfd = gzopen(filename, "rb");
+       if (!gzfd) {
+               if (errno == ENOMEM)
+                       fatal("Memory allocation failure in gzopen\n");
+               return -1;
+       }
+       if (grab_contents(gzfd, fdata) < 0) {
+               gzclose(gzfd);
+               return -1;
+       }
+       fdata->type = GZIP_FILE;
+       gzclose(gzfd);
+       return 0;
+}
+
+void gzip_release_file(struct grab_data *fdata)
+{
+       free(fdata->data);
+}
diff --git a/grabfile_zlib.h b/grabfile_zlib.h
new file mode 100644
index 0000000..1580c5a
--- /dev/null
+++ b/grabfile_zlib.h
@@ -0,0 +1,9 @@
+#ifndef _GRABFILE_ZLIB_H
+#define _GRABFILE_ZLIB_H
+
+#include "grabfile.h"
+
+extern int gzip_grab_file(const char *filename, struct grab_data *fdata);
+extern void gzip_release_file(struct grab_data *fdata);
+
+#endif /* _GRABFILE_ZLIB_H */
diff --git a/modinfo.c b/modinfo.c
index 9ae40f2..edc9f24 100644
--- a/modinfo.c
+++ b/modinfo.c
@@ -16,7 +16,7 @@
 #include "util.h"
 #include "logging.h"
 #include "elfops.h"
-#include "zlibsupport.h"
+#include "grabfile.h"
 #include "testing.h"
 
 #ifndef MODULE_DIR
diff --git a/modprobe.c b/modprobe.c
index edf60d6..c42d3a0 100644
--- a/modprobe.c
+++ b/modprobe.c
@@ -44,7 +44,7 @@
 
 #include "util.h"
 #include "elfops.h"
-#include "zlibsupport.h"
+#include "grabfile.h"
 #include "logging.h"
 #include "index.h"
 #include "list.h"
diff --git a/zlibsupport.c b/zlibsupport.c
deleted file mode 100644
index bff371a..0000000
--- a/zlibsupport.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* Support for compressed modules.  Willy Tarreau <[email protected]>
- * did the support for modutils, Andrey Borzenkov <[email protected]>
- * ported it to module-init-tools, and I said it was too ugly to live
- * and rewrote it 8).
- *
- * (C) 2003 Rusty Russell, IBM Corporation.
- */
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/mman.h>
-
-#include "zlibsupport.h"
-#include "logging.h"
-#include "testing.h"
-
-#ifdef CONFIG_USE_ZLIB
-#include <zlib.h>
-
-static int grab_contents(gzFile *gzfd, struct grab_data *fdata)
-{
-       unsigned int max = 16384;
-       int ret;
-
-       fdata->data = NOFAIL(malloc(max));
-       fdata->size = 0;
-
-       while ((ret = gzread(gzfd, fdata->data + fdata->size, max - 
fdata->size)) > 0) {
-               fdata->size += ret;
-               if (fdata->size == max)
-                       fdata->data = NOFAIL(realloc(fdata->data, max *= 2));
-       }
-       if (ret < 0) {
-               free(fdata->data);
-               fdata->data = NULL;
-               return -1;
-       }
-
-       return 0;
-}
-
-/* gzopen handles uncompressed files transparently. */
-static int gzip_grab_file(const char *filename, struct grab_data *fdata)
-{
-       gzFile gzfd;
-
-       errno = 0;
-       gzfd = gzopen(filename, "rb");
-       if (!gzfd) {
-               if (errno == ENOMEM)
-                       fatal("Memory allocation failure in gzopen\n");
-               return -1;
-       }
-       if (grab_contents(gzfd, fdata) < 0) {
-               gzclose(gzfd);
-               return -1;
-       }
-       fdata->type = GZIP_FILE;
-       gzclose(gzfd);
-       return 0;
-}
-
-static void gzip_release_file(struct grab_data *fdata)
-{
-       free(fdata->data);
-}
-#endif
-
-static int grab_fd(int fd, struct grab_data *fdata)
-{
-       struct stat st;
-       int ret;
-
-       ret = fstat(fd, &st);
-       if (ret < 0)
-               return -1;
-       fdata->size = st.st_size;
-       fdata->data = mmap(0, fdata->size, PROT_READ|PROT_WRITE, MAP_PRIVATE, 
fd, 0);
-       if (fdata->data == MAP_FAILED)
-               fdata->data = NULL;
-       return 0;
-}
-
-static int plain_grab_file(const char *filename, struct grab_data *fdata)
-{
-       int fd;
-
-       fd = open(filename, O_RDONLY, 0);
-       if (fd < 0)
-               return -1;
-       if (grab_fd(fd, fdata) < 0)
-               return -1;
-       fdata->type = PLAIN_FILE;
-       close(fd);
-       return 0;
-}
-
-static void plain_release_file(struct grab_data *fdata)
-{
-       munmap(fdata->data, fdata->size);
-}
-
-static int compress_type(const char *filename)
-{
-       int fd;
-       unsigned char buf[6];
-
-       if ((fd = open(filename, O_RDONLY)) == -1)
-               return -1;
-
-       if (read(fd, buf, sizeof(buf)) == -1) {
-               close(fd);
-               return -1;
-       }
-
-       close(fd);
-
-       if (buf[0] == 0x1F && buf[1] == 0x8B)
-               return GZIP_FILE;
-
-       return PLAIN_FILE;
-}
-
-int grab_file(const char *filename, struct grab_data *fdata)
-{
-       switch (compress_type(filename)) {
-#ifdef CONFIG_USE_ZLIB
-               case GZIP_FILE:
-                       return gzip_grab_file(filename, fdata);
-#endif
-               case PLAIN_FILE:
-                       return plain_grab_file(filename, fdata);
-       }
-       fatal("Unknown compression type\n");
-       return -1;
-}
-
-void release_file(struct grab_data *fdata)
-{
-       switch (fdata->type) {
-#ifdef CONFIG_USE_ZLIB
-               case GZIP_FILE:
-                       gzip_release_file(fdata);
-                       return;
-#endif
-               case PLAIN_FILE:
-                       plain_release_file(fdata);
-                       return;
-       }
-       fatal("Unknown compression type\n");
-}
diff --git a/zlibsupport.h b/zlibsupport.h
deleted file mode 100644
index 3eb4c2d..0000000
--- a/zlibsupport.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef _ZLIB_SUPPORT_H
-#define _ZLIB_SUPPORT_H
-
-enum file_type
-{
-       PLAIN_FILE,
-       GZIP_FILE
-};
-
-struct grab_data
-{
-       enum file_type type;
-       unsigned long size;
-       void *data;
-};
-
-/* Grab file.  Decompresses if that is supported.  Returns NULL on error. */
-extern int grab_file(const char *filename, struct grab_data *fdata);
-
-/* Free it up. */
-extern void release_file(struct grab_data *fdata);
-
-#endif /* _ZLIB_SUPPORT_H */
-- 
1.7.3.5

--
To unsubscribe from this list: send the line "unsubscribe linux-modules" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to