Add error checking to deb_extract(), unarchive(), extract_archive(). et al.
[oweals/opkg-lede.git] / libopkg / pkg_extract.c
index d8b06a6c7827f335bd35f41724086cc5fc57f774..c4d74a320f73cd68dec5a8d968ab7431cc9a2041 100644 (file)
 /* 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)
 {
-    deb_extract(pkg->local_filename, stream,
-                              extract_control_tar_gz
-                              | extract_to_stream,
-                              NULL, "./control");
+       int err;
+       deb_extract(pkg->local_filename, stream,
+                       extract_control_tar_gz
+                       | extract_to_stream,
+                       NULL, "./control", &err);
 
-    return 0;
+       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;
-    char *buffer = NULL;
+       int err;
+       char *dir_with_prefix;
 
-    sprintf_alloc(&dir_with_prefix, "%s/%s", dir, prefix);
+       sprintf_alloc(&dir_with_prefix, "%s/%s", dir, prefix);
 
-    buffer = deb_extract(pkg->local_filename, stderr,
-               extract_control_tar_gz
-                | extract_all_to_fs| extract_preserve_date
-               | extract_unconditional,
-               dir_with_prefix, NULL);
+       deb_extract(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);
-
-    /* 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. */
+       free(dir_with_prefix);
+       return err;
+}
 
-    if (buffer) {
-        free(buffer);
-    }
-    return 0;
+int
+pkg_extract_control_files_to_dir(pkg_t *pkg, const char *dir)
+{
+       return pkg_extract_control_files_to_dir_with_prefix(pkg, dir, "");
 }
 
-int pkg_extract_data_files_to_dir(pkg_t *pkg, const char *dir)
+
+int
+pkg_extract_data_files_to_dir(pkg_t *pkg, const char *dir)
 {
-    char *buffer = NULL;
-    buffer = deb_extract(pkg->local_filename, stderr,
+       int err;
+
+       deb_extract(pkg->local_filename, stderr,
                extract_data_tar_gz
-                | extract_all_to_fs| extract_preserve_date
+               | 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. */
+               dir, NULL, &err);
 
-    if (buffer) {
-        free(buffer);
-    }
-    return 0;
+       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)
 {
-    char *buffer = NULL;
+       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
@@ -101,14 +96,10 @@ 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. */
-    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;
+
+       deb_extract(pkg->local_filename, stream,
+               extract_quiet | extract_data_tar_gz | extract_list,
+               NULL, NULL, &err);
+
+       return err;
 }