xbps-query(8: added --cat=FILE mode support.
- This mode prints to stdout the matching FILE stored in a binary package. - ABI break: renamed xbps_get_pkg_plist_from_binpkg() xbps_binpkg_get_plist(). - Added xbps_binpkg_get_file() as a generic way to get pkg file contents. - Removed useless comments from xbps_api_impl.h.
This commit is contained in:
@@ -31,10 +31,9 @@
|
||||
|
||||
#include "xbps_api_impl.h"
|
||||
|
||||
xbps_dictionary_t HIDDEN
|
||||
xbps_archive_get_dictionary(struct archive *ar, struct archive_entry *entry)
|
||||
char HIDDEN *
|
||||
xbps_archive_get_file(struct archive *ar, struct archive_entry *entry)
|
||||
{
|
||||
xbps_dictionary_t d = NULL;
|
||||
size_t buflen;
|
||||
ssize_t nbytes = -1;
|
||||
char *buf;
|
||||
@@ -43,7 +42,7 @@ xbps_archive_get_dictionary(struct archive *ar, struct archive_entry *entry)
|
||||
assert(entry != NULL);
|
||||
|
||||
buflen = (size_t)archive_entry_size(entry);
|
||||
buf = malloc(buflen);
|
||||
buf = malloc(buflen+1);
|
||||
if (buf == NULL)
|
||||
return NULL;
|
||||
|
||||
@@ -52,14 +51,23 @@ xbps_archive_get_dictionary(struct archive *ar, struct archive_entry *entry)
|
||||
free(buf);
|
||||
return NULL;
|
||||
}
|
||||
buf[buflen] = '\0';
|
||||
return buf;
|
||||
}
|
||||
|
||||
xbps_dictionary_t HIDDEN
|
||||
xbps_archive_get_dictionary(struct archive *ar, struct archive_entry *entry)
|
||||
{
|
||||
xbps_dictionary_t d = NULL;
|
||||
char *buf;
|
||||
|
||||
if ((buf = xbps_archive_get_file(ar, entry)) == NULL)
|
||||
return NULL;
|
||||
|
||||
/* If blob is already a dictionary we are done */
|
||||
d = xbps_dictionary_internalize(buf);
|
||||
if (xbps_object_type(d) == XBPS_TYPE_DICTIONARY) {
|
||||
free(buf);
|
||||
return d;
|
||||
}
|
||||
return NULL;
|
||||
free(buf);
|
||||
return d;
|
||||
}
|
||||
|
||||
int
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*-
|
||||
* Copyright (c) 2009-2013 Juan Romero Pardines.
|
||||
* Copyright (c) 2009-2014 Juan Romero Pardines.
|
||||
* Copyright (c) 2008, 2009 Joerg Sonnenberger <joerg (at) NetBSD.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
@@ -139,51 +139,45 @@ open_archive(const char *url)
|
||||
return a;
|
||||
}
|
||||
|
||||
xbps_dictionary_t
|
||||
xbps_get_pkg_plist_from_binpkg(const char *fname, const char *plistf)
|
||||
char *
|
||||
xbps_binpkg_get_file(const char *url, const char *fname)
|
||||
{
|
||||
xbps_dictionary_t plistd = NULL;
|
||||
struct archive *a;
|
||||
struct archive_entry *entry;
|
||||
const char *comptype;
|
||||
int i = 0;
|
||||
char *buf = NULL;
|
||||
|
||||
assert(fname != NULL);
|
||||
assert(plistf != NULL);
|
||||
assert(url);
|
||||
assert(fname);
|
||||
|
||||
if ((a = open_archive(fname)) == NULL)
|
||||
if ((a = open_archive(url)) == NULL)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Save compression type string for future use.
|
||||
*/
|
||||
comptype = archive_compression_name(a);
|
||||
|
||||
while ((archive_read_next_header(a, &entry)) == ARCHIVE_OK) {
|
||||
if (strcmp(archive_entry_pathname(entry), plistf)) {
|
||||
archive_read_data_skip(a);
|
||||
if (i >= 3) {
|
||||
/*
|
||||
* Archive does not contain required
|
||||
* plist file, discard it completely.
|
||||
*/
|
||||
errno = ENOENT;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
plistd = xbps_archive_get_dictionary(a, entry);
|
||||
if (plistd == NULL) {
|
||||
errno = EINVAL;
|
||||
const char *bfile;
|
||||
|
||||
bfile = archive_entry_pathname(entry);
|
||||
bfile++; /* skip first dot */
|
||||
if (strcmp(bfile, fname) == 0) {
|
||||
buf = xbps_archive_get_file(a, entry);
|
||||
break;
|
||||
}
|
||||
xbps_dictionary_set_cstring_nocopy(plistd,
|
||||
"archive-compression-type", comptype);
|
||||
|
||||
break;
|
||||
archive_read_data_skip(a);
|
||||
}
|
||||
archive_read_finish(a);
|
||||
|
||||
return plistd;
|
||||
return buf;
|
||||
}
|
||||
|
||||
xbps_dictionary_t
|
||||
xbps_binpkg_get_plist(const char *url, const char *plistf)
|
||||
{
|
||||
xbps_dictionary_t d;
|
||||
char *buf;
|
||||
|
||||
if ((buf = xbps_binpkg_get_file(url, plistf)) == NULL)
|
||||
return NULL;
|
||||
|
||||
d = xbps_dictionary_internalize(buf);
|
||||
free(buf);
|
||||
return d;
|
||||
}
|
||||
|
@@ -277,7 +277,7 @@ xbps_repo_get_pkg_plist(struct xbps_handle *xhp, xbps_dictionary_t pkgd,
|
||||
if (url == NULL)
|
||||
return NULL;
|
||||
|
||||
bpkgd = xbps_get_pkg_plist_from_binpkg(url, plist);
|
||||
bpkgd = xbps_binpkg_get_plist(url, plist);
|
||||
free(url);
|
||||
return bpkgd;
|
||||
}
|
||||
|
@@ -315,7 +315,7 @@ xbps_rpool_get_pkg_plist(struct xbps_handle *xhp,
|
||||
errno = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
plistd = xbps_get_pkg_plist_from_binpkg(url, plistf);
|
||||
plistd = xbps_binpkg_get_plist(url, plistf);
|
||||
free(url);
|
||||
|
||||
out:
|
||||
|
Reference in New Issue
Block a user