Signed-off-by: Alexey Gladkov <[email protected]>
---
 zlibsupport.c |   61 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 55 insertions(+), 6 deletions(-)

diff --git a/zlibsupport.c b/zlibsupport.c
index 8936c7f..bff371a 100644
--- a/zlibsupport.c
+++ b/zlibsupport.c
@@ -43,7 +43,7 @@ static int grab_contents(gzFile *gzfd, struct grab_data 
*fdata)
 }
 
 /* gzopen handles uncompressed files transparently. */
-int grab_file(const char *filename, struct grab_data *fdata)
+static int gzip_grab_file(const char *filename, struct grab_data *fdata)
 {
        gzFile gzfd;
 
@@ -63,13 +63,13 @@ int grab_file(const char *filename, struct grab_data *fdata)
        return 0;
 }
 
-void release_file(struct grab_data *fdata)
+static void gzip_release_file(struct grab_data *fdata)
 {
        free(fdata->data);
 }
-#else /* ... !CONFIG_USE_ZLIB */
+#endif
 
-static void *grab_fd(int fd, struct grab_data *fdata)
+static int grab_fd(int fd, struct grab_data *fdata)
 {
        struct stat st;
        int ret;
@@ -84,7 +84,7 @@ static void *grab_fd(int fd, struct grab_data *fdata)
        return 0;
 }
 
-int grab_file(const char *filename, struct grab_data *fdata)
+static int plain_grab_file(const char *filename, struct grab_data *fdata)
 {
        int fd;
 
@@ -98,8 +98,57 @@ int grab_file(const char *filename, struct grab_data *fdata)
        return 0;
 }
 
-void release_file(struct grab_data *fdata)
+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");
+}
-- 
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