manifest: add file support as well as apkdb support
parent
46c2693468
commit
18f7aa9e44
|
@ -11,6 +11,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "apk_defines.h"
|
#include "apk_defines.h"
|
||||||
#include "apk_applet.h"
|
#include "apk_applet.h"
|
||||||
#include "apk_database.h"
|
#include "apk_database.h"
|
||||||
|
@ -23,6 +25,11 @@ static char *csum_types[APK_CHECKSUM_SHA1 + 1] = {
|
||||||
[APK_CHECKSUM_SHA1] = "sha1",
|
[APK_CHECKSUM_SHA1] = "sha1",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct manifest_file_ctx {
|
||||||
|
const char *file;
|
||||||
|
struct apk_sign_ctx *sctx;
|
||||||
|
};
|
||||||
|
|
||||||
static void process_package(struct apk_database *db, struct apk_package *pkg)
|
static void process_package(struct apk_database *db, struct apk_package *pkg)
|
||||||
{
|
{
|
||||||
struct apk_installed_package *ipkg = pkg->ipkg;
|
struct apk_installed_package *ipkg = pkg->ipkg;
|
||||||
|
@ -51,12 +58,60 @@ static void process_package(struct apk_database *db, struct apk_package *pkg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int read_file_entry(void *ctx, const struct apk_file_info *ae,
|
||||||
|
struct apk_istream *is)
|
||||||
|
{
|
||||||
|
struct manifest_file_ctx *mctx = ctx;
|
||||||
|
char csum_buf[(APK_CHECKSUM_SHA1 * 2) + 1];
|
||||||
|
apk_blob_t csum_blob = APK_BLOB_BUF(csum_buf);
|
||||||
|
|
||||||
|
if (ae->name[0] == '.') {
|
||||||
|
if (!strncmp(ae->name, ".PKGINFO", 8) || !strncmp(ae->name, ".SIGN.", 6))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ae->mode & S_IFMT) != S_IFREG)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
memset(csum_buf, '\0', sizeof(csum_buf));
|
||||||
|
apk_blob_push_hexdump(&csum_blob, APK_BLOB_CSUM(ae->csum));
|
||||||
|
|
||||||
|
if (apk_verbosity > 1)
|
||||||
|
printf("%s: ", mctx->file);
|
||||||
|
|
||||||
|
printf("%s:%s %s\n", csum_types[ae->csum.type], csum_buf, ae->name);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void process_file(struct apk_database *db, const char *match)
|
||||||
|
{
|
||||||
|
struct apk_sign_ctx sctx;
|
||||||
|
struct apk_istream *is;
|
||||||
|
struct manifest_file_ctx ctx = {match, &sctx};
|
||||||
|
|
||||||
|
apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY, NULL, db->keys_fd);
|
||||||
|
is = apk_bstream_gunzip_mpart(apk_bstream_from_file(AT_FDCWD, match),
|
||||||
|
apk_sign_ctx_mpart_cb, &sctx);
|
||||||
|
|
||||||
|
if (IS_ERR_OR_NULL(is)) {
|
||||||
|
apk_error("%s: %s", match, strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void) apk_tar_parse(is, read_file_entry, &ctx, FALSE, &db->id_cache);
|
||||||
|
is->close(is);
|
||||||
|
}
|
||||||
|
|
||||||
static void process_match(struct apk_database *db, const char *match, struct apk_name *name, void *ctx)
|
static void process_match(struct apk_database *db, const char *match, struct apk_name *name, void *ctx)
|
||||||
{
|
{
|
||||||
struct apk_provider *p;
|
struct apk_provider *p;
|
||||||
|
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
|
{
|
||||||
|
process_file(db, match);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
foreach_array_item(p, name->providers)
|
foreach_array_item(p, name->providers)
|
||||||
process_package(db, p->pkg);
|
process_package(db, p->pkg);
|
||||||
|
|
Loading…
Reference in New Issue