Name it after what it does: s/extract_to_stdout/extract_to_stream/
[oweals/opkg-lede.git] / libopkg / pkg_extract.c
index f97218234088a676b938ba44c30da730409d6315..d8b06a6c7827f335bd35f41724086cc5fc57f774 100644 (file)
@@ -29,17 +29,10 @@ const char *applet_name = "opkg";
 
 int pkg_extract_control_file_to_stream(pkg_t *pkg, FILE *stream)
 {
-    char *buffer = deb_extract(pkg->local_filename, stderr,
+    deb_extract(pkg->local_filename, stream,
                               extract_control_tar_gz
-                              | extract_one_to_buffer,
+                              | extract_to_stream,
                               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;
 }
@@ -54,10 +47,11 @@ int pkg_extract_control_files_to_dir_with_prefix(pkg_t *pkg,
                                                 const char *prefix)
 {
     char *dir_with_prefix;
+    char *buffer = NULL;
 
     sprintf_alloc(&dir_with_prefix, "%s/%s", dir, prefix);
 
-    deb_extract(pkg->local_filename, stderr,
+    buffer = deb_extract(pkg->local_filename, stderr,
                extract_control_tar_gz
                 | extract_all_to_fs| extract_preserve_date
                | extract_unconditional,
@@ -65,16 +59,19 @@ int pkg_extract_control_files_to_dir_with_prefix(pkg_t *pkg,
 
     free(dir_with_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.
+    /* 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. */
 
-       Once this is fixed, audit all calls to deb_extract. */
+    if (buffer) {
+        free(buffer);
+    }
     return 0;
 }
 
 int pkg_extract_data_files_to_dir(pkg_t *pkg, const char *dir)
 {
-    deb_extract(pkg->local_filename, stderr,
+    char *buffer = NULL;
+    buffer = deb_extract(pkg->local_filename, stderr,
                extract_data_tar_gz
                 | extract_all_to_fs| extract_preserve_date
                | extract_unconditional,
@@ -82,72 +79,16 @@ int pkg_extract_data_files_to_dir(pkg_t *pkg, const char *dir)
 
     /* 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 pkg_extract_data_file_names_to_file(pkg_t *pkg, const char *file_name)
-{
-     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);
-              }
-              free(line);
-              line=NULL;
-         }
-     }
-     fclose(tmp);
-     fclose(file);
-
-     return err;
+    if (buffer) {
+        free(buffer);
+    }
+    return 0;
 }
 
 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
@@ -160,11 +101,14 @@ int pkg_extract_data_file_names_to_stream(pkg_t *pkg, FILE *file)
        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,
+    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;
 }