X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=blobdiff_plain;f=libopkg%2Fpkg_extract.c;h=d8b06a6c7827f335bd35f41724086cc5fc57f774;hp=eae7746e176a3a00d22baf277bd1d4b0eb245ea4;hb=677c7152744313ef9b1195862dbf1761b5e3416d;hpb=5f550c85c4d2308a15f49f4d2d975b0614867412 diff --git a/libopkg/pkg_extract.c b/libopkg/pkg_extract.c index eae7746..d8b06a6 100644 --- a/libopkg/pkg_extract.c +++ b/libopkg/pkg_extract.c @@ -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 = 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; + 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; }