diff options
Diffstat (limited to 'lib/libalpm')
| -rw-r--r-- | lib/libalpm/alpm.h | 2 | ||||
| -rw-r--r-- | lib/libalpm/package.c | 39 | ||||
| -rw-r--r-- | lib/libalpm/package.h | 12 | 
3 files changed, 53 insertions, 0 deletions
| diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 0b80506f..44722c1c 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -45,6 +45,7 @@ extern "C" {  typedef struct __pmdb_t pmdb_t;  typedef struct __pmpkg_t pmpkg_t; +typedef struct __pmpgpsig_t pmpgpsig_t;  typedef struct __pmdelta_t pmdelta_t;  typedef struct __pmgrp_t pmgrp_t;  typedef struct __pmtrans_t pmtrans_t; @@ -215,6 +216,7 @@ time_t alpm_pkg_get_builddate(pmpkg_t *pkg);  time_t alpm_pkg_get_installdate(pmpkg_t *pkg);  const char *alpm_pkg_get_packager(pmpkg_t *pkg);  const char *alpm_pkg_get_md5sum(pmpkg_t *pkg); +const pmpgpsig_t *alpm_pkg_get_pgpsig(pmpkg_t *pkg);  const char *alpm_pkg_get_arch(pmpkg_t *pkg);  off_t alpm_pkg_get_size(pmpkg_t *pkg);  off_t alpm_pkg_get_isize(pmpkg_t *pkg); diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 445653ec..257b2aeb 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -40,6 +40,7 @@  #include "delta.h"  #include "handle.h"  #include "deps.h" +#include "base64.h"  /** \addtogroup alpm_packages Package Functions   * @brief Functions to manipulate libalpm packages @@ -201,6 +202,42 @@ const char SYMEXPORT *alpm_pkg_get_md5sum(pmpkg_t *pkg)  	return pkg->ops->get_md5sum(pkg);  } +static int decode_pgpsig(pmpkg_t *pkg) { +	int len = strlen(pkg->pgpsig.encdata); +	const unsigned char *usline = (const unsigned char*)pkg->pgpsig.encdata; +	int destlen = 0; +	/* get the necessary size for the buffer by passing 0 */ +	int ret = base64_decode(NULL, &destlen, usline, len); +	/* alloc our memory and repeat the call to decode */ +	MALLOC(pkg->pgpsig.rawdata, (size_t)destlen, goto error); +	ret = base64_decode(pkg->pgpsig.rawdata, &destlen, usline, len); +	pkg->pgpsig.rawlen = destlen; +	if(ret != 0) { +		goto error; +	} + +	FREE(pkg->pgpsig.encdata); +	return 0; + +error: +	FREE(pkg->pgpsig.rawdata); +	pkg->pgpsig.rawlen = 0; +	return 1; +} + +const pmpgpsig_t SYMEXPORT *alpm_pkg_get_pgpsig(pmpkg_t *pkg) +{ +	ALPM_LOG_FUNC; + +	/* Sanity checks */ +	ASSERT(pkg != NULL, RET_ERR(PM_ERR_WRONG_ARGS, NULL)); + +	if(pkg->pgpsig.rawdata == NULL && pkg->pgpsig.encdata != NULL) { +		decode_pgpsig(pkg); +	} +	return &(pkg->pgpsig); +} +  const char SYMEXPORT *alpm_pkg_get_arch(pmpkg_t *pkg)  {  	return pkg->ops->get_arch(pkg); @@ -463,6 +500,8 @@ void _alpm_pkg_free(pmpkg_t *pkg)  	FREE(pkg->url);  	FREE(pkg->packager);  	FREE(pkg->md5sum); +	FREE(pkg->pgpsig.encdata); +	FREE(pkg->pgpsig.rawdata);  	FREE(pkg->arch);  	FREELIST(pkg->licenses);  	FREELIST(pkg->replaces); diff --git a/lib/libalpm/package.h b/lib/libalpm/package.h index b161d5f1..25ed5cf4 100644 --- a/lib/libalpm/package.h +++ b/lib/libalpm/package.h @@ -87,6 +87,16 @@ struct pkg_operations {   */  extern struct pkg_operations default_pkg_ops; +struct __pmpgpsig_t { +	/* we will either store the encoded data or the raw data- +	 * this way we can decode on an as-needed basis since most +	 * operations won't require the overhead of base64 decodes +	 * on all packages in a sync repository. */ +	char *encdata; +	size_t rawlen; +	unsigned char *rawdata; +}; +  struct __pmpkg_t {  	unsigned long name_hash;  	char *filename; @@ -98,6 +108,8 @@ struct __pmpkg_t {  	char *md5sum;  	char *arch; +	pmpgpsig_t pgpsig; +  	time_t builddate;  	time_t installdate; | 
