int pkg_extract_control_files_to_dir_with_prefix(pkg_t * pkg, const char *dir, const char *prefix) { int r = -1; char *dir_with_prefix; struct opkg_ar *ar; sprintf_alloc(&dir_with_prefix, "%s/%s", dir, prefix); ar = ar_open_pkg_control_archive(pkg->local_filename); if (!ar) { opkg_msg(ERROR, "Failed to extract control.tar.gz from package '%s'.\n", pkg->local_filename); goto cleanup; } r = ar_extract_all(ar, dir_with_prefix); if (r < 0) opkg_msg(ERROR, "Failed to extract all control files from package '%s'.\n", pkg->local_filename); cleanup: free(dir_with_prefix); if (ar) ar_close(ar); return r; }
/* * Process the given archive and extract objects for inclusion into * the link. * * entry: * name - Name of archive * fd - Open file descriptor for archive * adp - Archive descriptor * ofl - output descriptor * * exit: * Returns FALSE on fatal error, TRUE otherwise. */ Boolean ld_process_archive(const char *name, int fd, Ar_desc *adp, Ofl_desc *ofl) { Boolean found = FALSE; Rej_desc rej = { 0 }; /* * If a fatal error condition has been set there's really no point in * processing the archive further. Having got to this point we have at * least established that the archive exists (thus verifying that the * command line options that got us to this archive are correct). Very * large archives can take a significant time to process, therefore * continuing on from here may significantly delay the fatal error * message the user is already set to receive. */ if (ofl->ofl_flags & FLG_OF_FATAL) return (TRUE); /* * If this archive was processed with -z allextract, then all members * have already been extracted. */ if (adp->ad_elf == NULL) return (TRUE); if (ofl->ofl_flags1 & FLG_OF1_ALLEXRT) { if (!ar_extract_all(name, fd, adp, ofl, &found, &rej)) return (FALSE); } else { if (!ar_extract_bysym(name, fd, adp, ofl, &found, &rej)) return (FALSE); } /* * If no objects have been found in the archive test for any rejections * and if one had occurred issue a warning - its possible a user has * pointed at an archive containing the wrong class of elf members. */ if ((found == 0) && rej.rej_type) { Conv_reject_desc_buf_t rej_buf; ld_eprintf(ofl, ERR_WARNING, MSG_INTL(reject[rej.rej_type]), rej.rej_name ? rej.rej_name : MSG_INTL(MSG_STR_UNKNOWN), conv_reject_desc(&rej, &rej_buf, ld_targ.t_m.m_mach)); } return (TRUE); }
int pkg_extract_data_files_to_dir(pkg_t * pkg, const char *dir) { int r; struct opkg_ar *ar; ar = ar_open_pkg_data_archive(pkg->local_filename); if (!ar) { opkg_msg(ERROR, "Failed to extract data.tar.gz from package '%s'.\n", pkg->local_filename); return -1; } r = ar_extract_all(ar, dir); if (r < 0) opkg_msg(ERROR, "Failed to extract data files from package '%s'.\n", pkg->local_filename); ar_close(ar); return r; }