X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libopkg%2Fpkg_extract.c;h=62595214d474a38343b33d4aeee67f9f599dbf6d;hb=54cc7e3bd1f79569022aa9fc3d0e748c81e3bcd8;hp=f97218234088a676b938ba44c30da730409d6315;hpb=5b68464bd8b8405fae90c1d96cdd7367a506bd5c;p=oweals%2Fopkg-lede.git diff --git a/libopkg/pkg_extract.c b/libopkg/pkg_extract.c index f972182..6259521 100644 --- a/libopkg/pkg_extract.c +++ b/libopkg/pkg_extract.c @@ -15,156 +15,77 @@ General Public License for more details. */ -#include "includes.h" -#include +#include #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); - } - free(line); - line=NULL; - } - } - 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; }