pkg: use a blob buffer in pkg_t to store variable fields
[oweals/opkg-lede.git] / libopkg / pkg_extract.c
index 78c252b9b21dda3e95a28f8535b91bace2426b85..62595214d474a38343b33d4aeee67f9f599dbf6d 100644 (file)
@@ -1,4 +1,4 @@
-/* pkg_extract.c - the itsy package management system
+/* pkg_extract.c - the opkg package management system
 
    Carl D. Worth
 
    General Public License for more details.
 */
 
-#include "opkg.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 pkg_extract_control_file_to_stream(pkg_t * pkg, FILE * stream)
 {
-    char *buffer = deb_extract(pkg->local_filename, stderr,
-                              extract_control_tar_gz
-                              | extract_one_to_buffer,
-                              NULL, "./control");
-    if (buffer == NULL) {
-       return EINVAL;
-    }
-
-    /* XXX: QUESTION: Is there a way to do this directly with deb_extract now? */
-    fputs(buffer, stream);
-    free(buffer);
-
-    return 0;
+       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_files_to_dir(pkg_t *pkg, const char *dir)
+int
+pkg_extract_control_files_to_dir_with_prefix(pkg_t * pkg, const char *dir,
+                                            const char *prefix)
 {
-    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)
-{
-    char *dir_with_prefix;
-
-    sprintf_alloc(&dir_with_prefix, "%s/%s", dir, prefix);
-
-    deb_extract(pkg->local_filename, stderr,
-               extract_control_tar_gz
-                | extract_all_to_fs| extract_preserve_date
-               | extract_unconditional,
-               dir_with_prefix, NULL);
+       int err;
+       char *dir_with_prefix;
 
-    free(dir_with_prefix);
+       sprintf_alloc(&dir_with_prefix, "%s/%s", dir, prefix);
 
-    /* XXX: 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.
+       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);
 
-       Once this is fixed, audit all calls to deb_extract. */
-    return 0;
+       free(dir_with_prefix);
+       return err;
 }
 
-int pkg_extract_data_files_to_dir(pkg_t *pkg, const char *dir)
+int pkg_extract_control_files_to_dir(pkg_t * pkg, const char *dir)
 {
-    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. */
-    return 0;
+       return pkg_extract_control_files_to_dir_with_prefix(pkg, dir, "");
 }
 
-int pkg_extract_data_file_names_to_file(pkg_t *pkg, const char *file_name)
+int pkg_extract_data_files_to_dir(pkg_t * pkg, const char *dir)
 {
-     int err=0;
-     char *line, *data_file;
-     FILE *file;
-     FILE *tmp;
-
-     file = fopen(file_name, "w");
-     if (file == NULL) {
-         fprintf(stderr, "%s: ERROR: Failed to open %s for writing.\n",
-                 __FUNCTION__, file_name);
-         return EINVAL;
-     }
-
-     tmp = tmpfile();
-     if (pkg->installed_files) {
-         str_list_elt_t *elt;
-         for (elt = pkg->installed_files->head; elt; elt = elt->next) {
-              fprintf(file, "%s\n", elt->data);
-         }
-     } else {
-         err = pkg_extract_data_file_names_to_stream(pkg, tmp);
-         if (err) {
-              fclose(file);
-              fclose(tmp);
-              return err;
-         }
-
-         /* Fixup data file names by removing the initial '.' */
-         rewind(tmp);
-         while (1) {
-              line = file_read_line_alloc(tmp);
-              if (line == NULL) {
-                   break;
-              }
-
-              data_file = line;
-              if (*data_file == '.') {
-                   data_file++;
-              }
-
-              if (*data_file != '/') {
-                   fputs("/", file);
-              }
-
-              /* I have no idea why, but this is what dpkg does */
-              if (strcmp(data_file, "/\n") == 0) {
-                   fputs("/.\n", file);
-              } else {
-                   fputs(data_file, file);
-              }
-         }
-     }
-     fclose(tmp);
-     fclose(file);
-
-     return err;
+       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);
+
+       return err;
 }
 
-int pkg_extract_data_file_names_to_stream(pkg_t *pkg, FILE *file)
+int pkg_extract_data_file_names_to_stream(pkg_t * pkg, FILE * stream)
 {
-    /* 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. */
-     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. */
-    return 0;
+       int err;
+
+       /* 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. */
+
+       deb_extract(pkg_get_string(pkg, PKG_LOCAL_FILENAME), stream,
+                   extract_quiet | extract_data_tar_gz | extract_list,
+                   NULL, NULL, &err);
+
+       return err;
 }