pkg: use a blob buffer in pkg_t to store variable fields
[oweals/opkg-lede.git] / libopkg / pkg_extract.c
index d9fbdd5f6d7b69479483885e307b192a2549596d..62595214d474a38343b33d4aeee67f9f599dbf6d 100644 (file)
    General Public License for more details.
 */
 
-#include "includes.h"
-#include <errno.h>
+#include <stdio.h>
 
 #include "pkg_extract.h"
-
 #include "libbb/libbb.h"
 #include "file_util.h"
 #include "sprintf_alloc.h"
 
-/* assuage libb functions */
-const char *applet_name = "opkg";
+int pkg_extract_control_file_to_stream(pkg_t * pkg, FILE * stream)
+{
+       int err;
+       deb_extract(pkg_get_string(pkg, PKG_LOCAL_FILENAME), stream,
+                   extract_control_tar_gz
+                   | extract_to_stream, NULL, "control", &err);
+       return err;
+}
 
-int pkg_extract_control_file_to_stream(pkg_t *pkg, FILE *stream)
+int
+pkg_extract_control_files_to_dir_with_prefix(pkg_t * pkg, const char *dir,
+                                            const char *prefix)
 {
-    deb_extract(pkg->local_filename, stream,
-                              extract_control_tar_gz
-                              | extract_to_stdout, /* to stream actually */
-                              NULL, "./control");
+       int err;
+       char *dir_with_prefix;
 
-    return 0;
+       sprintf_alloc(&dir_with_prefix, "%s/%s", dir, prefix);
+
+       deb_extract(pkg_get_string(pkg, PKG_LOCAL_FILENAME), stderr,
+                   extract_control_tar_gz
+                   | extract_all_to_fs | extract_preserve_date
+                   | extract_unconditional, dir_with_prefix, NULL, &err);
+
+       free(dir_with_prefix);
+       return err;
 }
 
-int pkg_extract_control_files_to_dir(pkg_t *pkg, const char *dir)
+int pkg_extract_control_files_to_dir(pkg_t * pkg, const char *dir)
 {
-    return pkg_extract_control_files_to_dir_with_prefix(pkg, dir, "");
+       return pkg_extract_control_files_to_dir_with_prefix(pkg, dir, "");
 }
 
-int pkg_extract_control_files_to_dir_with_prefix(pkg_t *pkg,
-                                                const char *dir,
-                                                const char *prefix)
+int pkg_extract_data_files_to_dir(pkg_t * pkg, const char *dir)
 {
-    char *dir_with_prefix;
-    char *buffer = NULL;
+       int err;
+
+       deb_extract(pkg_get_string(pkg, PKG_LOCAL_FILENAME), stderr,
+                   extract_data_tar_gz
+                   | extract_all_to_fs | extract_preserve_date
+                   | extract_unconditional, dir, NULL, &err);
 
-    sprintf_alloc(&dir_with_prefix, "%s/%s", dir, prefix);
+       return err;
+}
 
-    buffer = deb_extract(pkg->local_filename, stderr,
-               extract_control_tar_gz
-                | extract_all_to_fs| extract_preserve_date
-               | extract_unconditional,
-               dir_with_prefix, NULL);
+int pkg_extract_data_file_names_to_stream(pkg_t * pkg, FILE * stream)
+{
+       int err;
 
-    free(dir_with_prefix);
+       /* XXX: DPKG_INCOMPATIBILITY: deb_extract will extract all of the
+          data file names with a '.' as the first character. I've taught
+          opkg how to cope with the presence or absence of the '.', but
+          this may trip up dpkg.
 
-    /* BUG: How do we know if deb_extract worked or not? This is a
-       defect in the current deb_extract from what I can tell. */
+          For all I know, this could actually be a bug in opkg-build. So,
+          I'll have to try installing some .debs and comparing the *.list
+          files.
 
-    if (buffer) {
-        free(buffer);
-    }
-    return 0;
-}
+          If we wanted to, we could workaround the deb_extract behavior
+          right here, by writing to a tmpfile, then munging things as we
+          wrote to the actual stream. */
 
-int pkg_extract_data_files_to_dir(pkg_t *pkg, const char *dir)
-{
-    char *buffer = NULL;
-    buffer = deb_extract(pkg->local_filename, stderr,
-               extract_data_tar_gz
-                | extract_all_to_fs| extract_preserve_date
-               | extract_unconditional,
-               dir, NULL);
-
-    /* BUG: How do we know if deb_extract worked or not? This is a
-       defect in the current deb_extract from what I can tell. */
-
-    if (buffer) {
-        free(buffer);
-    }
-    return 0;
-}
+       deb_extract(pkg_get_string(pkg, PKG_LOCAL_FILENAME), stream,
+                   extract_quiet | extract_data_tar_gz | extract_list,
+                   NULL, NULL, &err);
 
-int pkg_extract_data_file_names_to_stream(pkg_t *pkg, FILE *file)
-{
-    char *buffer = NULL;
-    /* XXX: DPKG_INCOMPATIBILITY: deb_extract will extract all of the
-       data file names with a '.' as the first character. I've taught
-       opkg how to cope with the presence or absence of the '.', but
-       this may trip up dpkg.
-
-       For all I know, this could actually be a bug in opkg-build. So,
-       I'll have to try installing some .debs and comparing the *.list
-       files.
-
-       If we wanted to, we could workaround the deb_extract behavior
-       right here, by writing to a tmpfile, then munging things as we
-       wrote to the actual stream. */
-    buffer = deb_extract(pkg->local_filename, file,
-                extract_quiet | extract_data_tar_gz | extract_list,
-                NULL, NULL);
-
-    /* BUG: How do we know if deb_extract worked or not? This is a
-       defect in the current deb_extract from what I can tell. */
-    if (buffer) {
-        free(buffer);
-    }
-    return 0;
+       return err;
 }