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_stdout, /* to stream actually */
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;
}
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,
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,
/* 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 = 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);
- }
- }
- }
- 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
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;
}