//int is_datafile;
};
+/*
+ Returns one if the digest is not all zeros.
+*/
+#define pakfire_file_has_digest(digest) __pakfire_file_has_digest(digest, sizeof(digest))
+
+static int __pakfire_file_has_digest(const unsigned char* digest, const size_t length) {
+ for (unsigned int i = 0; i < length; i++) {
+ if (digest[i])
+ return 1;
+ }
+
+ return 0;
+}
+
PAKFIRE_EXPORT int pakfire_file_create(struct pakfire_file** file, struct pakfire* pakfire) {
struct pakfire_file* f = calloc(1, sizeof(*f));
if (!f)
return r;
}
-static const struct pakfire_libarchive_digest {
- enum pakfire_digests pakfire;
- int libarchive;
-} pakfire_libarchive_digests[] = {
- { PAKFIRE_DIGEST_SHA512, ARCHIVE_ENTRY_DIGEST_SHA512 },
- { PAKFIRE_DIGEST_SHA256, ARCHIVE_ENTRY_DIGEST_SHA256 },
- { 0, 0 },
-};
-
int pakfire_file_copy_archive_entry(struct pakfire_file* file, struct archive_entry* entry) {
+ const char* attr = NULL;
+ const void* value = NULL;
+ size_t size = 0;
int r = 0;
// Set abspath
pakfire_file_set_ctime(file, archive_entry_ctime(entry));
pakfire_file_set_mtime(file, archive_entry_mtime(entry));
- // Copy digest
- for (const struct pakfire_libarchive_digest* type = pakfire_libarchive_digests;
- type->pakfire; type++) {
- const unsigned char* digest = archive_entry_digest(entry, type->libarchive);
- if (digest) {
- r = pakfire_file_set_digest(file, type->pakfire, digest);
+ // Read any extended attributes
+ while (archive_entry_xattr_next(entry, &attr, &value, &size) == ARCHIVE_OK) {
+ // Digest: SHA-512
+ if (strcmp(attr, "PAKFIRE.digests.sha512") == 0) {
+ r = pakfire_file_set_digest(file, PAKFIRE_DIGEST_SHA512, value, size);
+ if (r)
+ goto ERROR;
+
+ // Digest: SHA-256
+ } else if (strcmp(attr, "PAKFIRE.digests.sha256") == 0) {
+ r = pakfire_file_set_digest(file, PAKFIRE_DIGEST_SHA256, value, size);
if (r)
- return r;
+ goto ERROR;
+
+ } else {
+ DEBUG(file->pakfire, "Received an unknown extended attribute: %s\n", attr);
}
}
+ERROR:
return r;
}
archive_entry_set_ctime(entry, pakfire_file_get_ctime(file), 0);
archive_entry_set_mtime(entry, pakfire_file_get_mtime(file), 0);
- // XXX copy digest
+ // Copy digests
+
+ // SHA-512
+ if (pakfire_file_has_digest(file->digests.sha512))
+ archive_entry_xattr_add_entry(entry, "PAKFIRE.digests.sha512",
+ file->digests.sha512, sizeof(file->digests.sha512));
+
+ // SHA-256
+ if (pakfire_file_has_digest(file->digests.sha256))
+ archive_entry_xattr_add_entry(entry, "PAKFIRE.digests.sha256",
+ file->digests.sha256, sizeof(file->digests.sha256));
return entry;
}
file->st.st_mtime = time;
}
-/*
- Returns one if the digest is not all zeros.
-*/
-#define pakfire_file_has_digest(digest) __pakfire_file_has_digest(digest, sizeof(digest))
-
-static int __pakfire_file_has_digest(const unsigned char* digest, const size_t length) {
- for (unsigned int i = 0; i < length; i++) {
- if (digest[i])
- return 1;
- }
-
- return 0;
-}
-
PAKFIRE_EXPORT const unsigned char* pakfire_file_get_digest(
struct pakfire_file* file, const enum pakfire_digests type, size_t* length) {
}
PAKFIRE_EXPORT int pakfire_file_set_digest(struct pakfire_file* file,
- const enum pakfire_digests type, const unsigned char* digest) {
+ const enum pakfire_digests type, const unsigned char* digest, const size_t length) {
if (!digest) {
errno = EINVAL;
return 1;
}
+ // Check buffer length
+ if (pakfire_digest_length(type) != length) {
+ ERROR(file->pakfire, "Digest has an incorrect length of %zu byte(s)\n", length);
+ errno = ENOMSG;
+ return 1;
+ }
+
+ // Store the digest
switch (type) {
case PAKFIRE_DIGEST_SHA512:
memcpy(file->digests.sha512, digest, sizeof(file->digests.sha512));