summaryrefslogtreecommitdiff
path: root/lib/libalpm/package.c
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2008-06-02 15:16:00 -0500
committerDan McGee <dan@archlinux.org>2011-03-23 02:22:00 -0500
commit60159c2e77a499067e0b294fc9c6c182f225bee2 (patch)
tree453ff6d5b229d4952634a989fbcca388621adbd5 /lib/libalpm/package.c
parent9f2a3023f8088800efd3a0abeb32ed5117be4442 (diff)
downloadpacman-60159c2e77a499067e0b294fc9c6c182f225bee2.tar.xz
Allow PGP signature to be read from sync database
Add a new field to the package struct to hold PGP information and instruct db_read to pick it up from the database. It is currently unused internally but this is the first step. Due to the fact that we store the PGP sig as binary data, we need to store both the data and the length so we have a small utility struct to assist us. Signed-off-by: Dan McGee <dan@archlinux.org> Signed-off-by: Allan McRae <allan@archlinux.org>
Diffstat (limited to 'lib/libalpm/package.c')
-rw-r--r--lib/libalpm/package.c39
1 files changed, 39 insertions, 0 deletions
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);