example/solv: support all compression types
authorMichael Schroeder <mls@suse.de>
Wed, 24 Oct 2012 14:39:14 +0000 (16:39 +0200)
committerMichael Schroeder <mls@suse.de>
Wed, 24 Oct 2012 14:39:14 +0000 (16:39 +0200)
examples/solv.c
ext/libsolvext.ver
ext/solv_xfopen.c
ext/solv_xfopen.h

index 55d7313..5723f54 100644 (file)
@@ -775,13 +775,13 @@ findmirrorlisturl(FILE *fp)
 static inline int
 iscompressed(const char *name)
 {
-  int l = strlen(name);
-  return l > 3 && !strcmp(name + l - 3, ".gz") ? 1 : 0;
+  return solv_xfopen_iscompressed(name) != 0;
 }
 
 FILE *
 curlfopen(struct repoinfo *cinfo, const char *file, int uncompress, const unsigned char *chksum, Id chksumtype, int *badchecksump)
 {
+  FILE *fp;
   pid_t pid;
   int fd, l;
   int status;
@@ -794,8 +794,8 @@ curlfopen(struct repoinfo *cinfo, const char *file, int uncompress, const unsign
         return 0;
       if (file != cinfo->metalink && file != cinfo->mirrorlist)
        {
-         FILE *fp = curlfopen(cinfo, cinfo->metalink ? cinfo->metalink : cinfo->mirrorlist, 0, 0, 0, 0);
          unsigned char mlchksum[32];
+         fp = curlfopen(cinfo, cinfo->metalink ? cinfo->metalink : cinfo->mirrorlist, 0, 0, 0, 0);
          Id mlchksumtype = 0;
          if (!fp)
            return 0;
@@ -874,10 +874,24 @@ curlfopen(struct repoinfo *cinfo, const char *file, int uncompress, const unsign
       close(fd);
       return 0;
     }
-  if (uncompress)
-    return solv_xfopen_fd(".gz", fd, "r");
   fcntl(fd, F_SETFD, FD_CLOEXEC);
-  return fdopen(fd, "r");
+  if (uncompress)
+    {
+      if (solv_xfopen_iscompressed(file) < 0)
+       {
+         printf("%s: unsupported compression\n", file);
+         if (badchecksump)
+           *badchecksump = 1;
+         close(fd);
+         return 0;
+       }
+      fp = solv_xfopen_fd(file, fd, "r");
+    }
+  else
+    fp = fdopen(fd, "r");
+  if (!fp)
+    close(fd);
+  return fp;
 }
 
 #ifndef DEBIAN
index a8998a2..272cac9 100644 (file)
@@ -34,7 +34,9 @@ SOLV_1.0 {
                rpm_iterate_filelist;
                rpm_query;
                solv_xfopen;
+               solv_xfopen_buf;
                solv_xfopen_fd;
+               solv_xfopen_iscompressed;
                testcase_add_testtags;
                testcase_job2str;
                testcase_solvid2str;
index 429086a..6c6441c 100644 (file)
@@ -325,10 +325,18 @@ solv_xfopen(const char *fn, const char *mode)
     return myxzfopen(fn, mode);
   if (suf && !strcmp(suf, ".lzma"))
     return mylzfopen(fn, mode);
+#else
+  if (suf && !strcmp(suf, ".xz"))
+    return 0;
+  if (suf && !strcmp(suf, ".lzma"))
+    return 0;
 #endif
 #ifdef ENABLE_BZIP2_COMPRESSION
   if (suf && !strcmp(suf, ".bz2"))
     return mybzfopen(fn, mode);
+#else
+  if (suf && !strcmp(suf, ".bz2"))
+    return 0;
 #endif
   return fopen(fn, mode);
 }
@@ -363,14 +371,45 @@ solv_xfopen_fd(const char *fn, int fd, const char *mode)
     return myxzfdopen(fd, simplemode);
   if (suf && !strcmp(suf, ".lzma"))
     return mylzfdopen(fd, simplemode);
+#else
+  if (suf && !strcmp(suf, ".xz"))
+    return 0;
+  if (suf && !strcmp(suf, ".lzma"))
+    return 0;
 #endif
 #ifdef ENABLE_BZIP2_COMPRESSION
   if (suf && !strcmp(suf, ".bz2"))
     return mybzfdopen(fd, simplemode);
+#else
+  if (suf && !strcmp(suf, ".bz2"))
+    return 0;
 #endif
   return fdopen(fd, mode);
 }
 
+int
+solv_xfopen_iscompressed(const char *fn)
+{
+  const char *suf = fn ? strrchr(fn, '.') : 0;
+  if (!suf)
+    return 0;
+  if (!strcmp(suf, ".gz"))
+    return 1;
+  if (!strcmp(suf, ".xz") || !strcmp(suf, ".lzma"))
+#ifdef ENABLE_LZMA_COMPRESSION
+    return 1;
+#else
+    return -1;
+#endif
+  if (!strcmp(suf, ".bz2"))
+#ifdef ENABLE_BZIP2_COMPRESSION
+    return 1;
+#else
+    return -1;
+#endif
+  return 0;
+}
+
 struct bufcookie {
   char **bufp;
   size_t *buflp;
index 296364e..aa8740e 100644 (file)
@@ -11,5 +11,6 @@
 extern FILE *solv_xfopen(const char *fn, const char *mode);
 extern FILE *solv_xfopen_fd(const char *fn, int fd, const char *mode);
 extern FILE *solv_xfopen_buf(const char *fn, char **bufp, size_t *buflp, const char *mode);
+extern int   solv_xfopen_iscompressed(const char *fn);
 
 #endif