X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=blobdiff_plain;f=libopkg%2Fpkg_extract.c;h=62595214d474a38343b33d4aeee67f9f599dbf6d;hp=0aae4ad578d6b3bb6ca4dd6b532d688c394f42ce;hb=2035cbf3a489fd762c4077478602d2022cb537f6;hpb=483c4d7573439e71d0bdfe5a9192b3ffc06d35c1 diff --git a/libopkg/pkg_extract.c b/libopkg/pkg_extract.c index 0aae4ad..6259521 100644 --- a/libopkg/pkg_extract.c +++ b/libopkg/pkg_extract.c @@ -15,164 +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; - } - - 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 err; + char *dir_with_prefix; -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; + sprintf_alloc(&dir_with_prefix, "%s/%s", dir, prefix); - sprintf_alloc(&dir_with_prefix, "%s/%s", dir, prefix); + 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); - buffer = 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); - - if (buffer == NULL) { - return EINVAL; - } - free(buffer); - 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) { - char *buffer = NULL; - buffer = deb_extract(pkg->local_filename, stderr, - extract_data_tar_gz - | extract_all_to_fs| extract_preserve_date - | extract_unconditional, - dir, NULL); - - if (buffer == NULL) { - return EINVAL; - } - free(buffer); - 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 = str_list_first(pkg->installed_files); elt; elt = str_list_next(pkg->installed_files, elt)) { - fprintf(file, "%s\n", (char *)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) { - 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 - 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. */ - 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 == NULL) { - return EINVAL; - } - free(buffer); - 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; }