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:
Juan RP
2014-11-17 15:45:46 +01:00
parent 3afb9d709d
commit a6516505e9
13 changed files with 144 additions and 205 deletions

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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: