X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=libopkg%2Fpkg_extract.c;h=fffb993b8e013e7c0ea554f164d81fb9484d0397;hb=2fdb3fc0b67757afd6fe7a244b6e14d2a546af0e;hp=f97218234088a676b938ba44c30da730409d6315;hpb=5b68464bd8b8405fae90c1d96cdd7367a506bd5c;p=project%2Fopkg-lede.git diff --git a/libopkg/pkg_extract.c b/libopkg/pkg_extract.c index f972182..fffb993 100644 --- a/libopkg/pkg_extract.c +++ b/libopkg/pkg_extract.c @@ -24,130 +24,63 @@ #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->local_filename, stream, + extract_control_tar_gz + | extract_to_stream, + NULL, "./control", &err); -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 err; } -int pkg_extract_control_files_to_dir_with_prefix(pkg_t *pkg, - const char *dir, - const char *prefix) +int +pkg_extract_control_files_to_dir_with_prefix(pkg_t *pkg, const char *dir, + const char *prefix) { - char *dir_with_prefix; + int err; + char *dir_with_prefix; - sprintf_alloc(&dir_with_prefix, "%s/%s", dir, 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); - - free(dir_with_prefix); + deb_extract(pkg->local_filename, stderr, + extract_control_tar_gz + | extract_all_to_fs| extract_preserve_date + | extract_unconditional, + dir_with_prefix, NULL, &err); - /* 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. + free(dir_with_prefix); + return err; +} - Once this is fixed, audit all calls to deb_extract. */ - 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) { - 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); + dir, NULL, &err); - /* 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 err; } -int pkg_extract_data_file_names_to_file(pkg_t *pkg, const char *file_name) +int +pkg_extract_data_file_names_to_stream(pkg_t *pkg, FILE *stream) { - 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; -int pkg_extract_data_file_names_to_stream(pkg_t *pkg, FILE *file) -{ /* 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 +93,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. */ - 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; + deb_extract(pkg->local_filename, stream, + extract_quiet | extract_data_tar_gz | extract_list, + NULL, NULL, &err); + + return err; }