Minor refactor and formatting changes

This commit is contained in:
Nathan Fisher 2024-02-11 01:09:21 -05:00
parent a988a7877e
commit f4e9b80737
28 changed files with 291 additions and 291 deletions

134
haggis.c
View file

@ -85,10 +85,10 @@ void haggis_device_init(dev_t rdev, haggis_device *dev) {
dev->minor.val = (uint32_t)minor(rdev); dev->minor.val = (uint32_t)minor(rdev);
} }
int haggis_store_device(FILE *stream, haggis_device *dev) { int haggis_store_device(haggis_device *self, FILE *stream) {
if (fwrite(dev->major.bytes, 1, 4, stream) != 4) if (fwrite(self->major.bytes, 1, 4, stream) != 4)
return 1; return 1;
if (fwrite(dev->minor.bytes, 1, 4, stream) != 4) if (fwrite(self->minor.bytes, 1, 4, stream) != 4)
return 1; return 1;
return 0; return 0;
} }
@ -109,21 +109,21 @@ int haggis_store_cksum(FILE *stream, haggis_checksum *cksum) {
flag = 0; flag = 0;
if (fwrite(&flag, 1, 1, stream) != 1) if (fwrite(&flag, 1, 1, stream) != 1)
return 1; return 1;
if (fwrite(cksum->sum.md5, 1, 16, stream) != 16) if (fwrite(cksum->md5, 1, 16, stream) != 16)
return 1; return 1;
break; break;
case sha1: case sha1:
flag = 1; flag = 1;
if (fwrite(&flag, 1, 1, stream) != 1) if (fwrite(&flag, 1, 1, stream) != 1)
return 1; return 1;
if (fwrite(cksum->sum.sha1, 1, 20, stream) != 20) if (fwrite(cksum->sha1, 1, 20, stream) != 20)
return 1; return 1;
break; break;
case sha256: case sha256:
flag = 2; flag = 2;
if (fwrite(&flag, 1, 1, stream) != 1) if (fwrite(&flag, 1, 1, stream) != 1)
return 1; return 1;
if (fwrite(cksum->sum.sha256, 1, 32, stream) != 32) if (fwrite(cksum->sha256, 1, 32, stream) != 32)
return 1; return 1;
break; break;
case skip: case skip:
@ -143,17 +143,17 @@ int haggis_load_cksum(FILE *stream, haggis_checksum *cksum) {
switch (flag) { switch (flag) {
case md5: case md5:
cksum->tag = 0; cksum->tag = 0;
if (fread(&cksum->sum.md5, 1, 16, stream) != 16) if (fread(&cksum->md5, 1, 16, stream) != 16)
return 1; return 1;
break; break;
case sha1: case sha1:
cksum->tag = 1; cksum->tag = 1;
if (fread(&cksum->sum.sha1, 1, 20, stream) != 20) if (fread(&cksum->sha1, 1, 20, stream) != 20)
return 1; return 1;
break; break;
case sha256: case sha256:
cksum->tag = 2; cksum->tag = 2;
if (fread(&cksum->sum.sha256, 1, 32, stream) != 32) if (fread(&cksum->sha256, 1, 32, stream) != 32)
return 1; return 1;
break; break;
case skip: case skip:
@ -169,7 +169,7 @@ void init_md5(haggis_file *f) {
f->cksum.tag = md5; f->cksum.tag = md5;
MD5Init(&ctx); MD5Init(&ctx);
MD5Update(&ctx, f->data, (size_t)f->len.val); MD5Update(&ctx, f->data, (size_t)f->len.val);
MD5Final(f->cksum.sum.md5, &ctx); MD5Final(f->cksum.md5, &ctx);
} }
int validate_md5(haggis_file *file) { int validate_md5(haggis_file *file) {
@ -179,7 +179,7 @@ int validate_md5(haggis_file *file) {
MD5Init(&ctx); MD5Init(&ctx);
MD5Update(&ctx, file->data, (size_t)file->len.val); MD5Update(&ctx, file->data, (size_t)file->len.val);
MD5Final(digest, &ctx); MD5Final(digest, &ctx);
if (memcmp(file->cksum.sum.md5, digest, sizeof(digest))) if (memcmp(file->cksum.md5, digest, sizeof(digest)))
return 2; return 2;
return 0; return 0;
} }
@ -191,7 +191,7 @@ void init_sha1(haggis_file *f) {
f->cksum.tag = sha1; f->cksum.tag = sha1;
SHA1_Init(&ctx); SHA1_Init(&ctx);
SHA1_Update(&ctx, f->data, (size_t)f->len.val); SHA1_Update(&ctx, f->data, (size_t)f->len.val);
SHA1_Final(f->cksum.sum.sha1, &ctx); SHA1_Final(f->cksum.sha1, &ctx);
} }
int validate_sha1(haggis_file *file) { int validate_sha1(haggis_file *file) {
@ -201,7 +201,7 @@ int validate_sha1(haggis_file *file) {
SHA1_Init(&ctx); SHA1_Init(&ctx);
SHA1_Update(&ctx, file->data, (size_t)file->len.val); SHA1_Update(&ctx, file->data, (size_t)file->len.val);
SHA1_Final(digest, &ctx); SHA1_Final(digest, &ctx);
if (memcmp(file->cksum.sum.sha1, digest, sizeof(digest))) if (memcmp(file->cksum.sha1, digest, sizeof(digest)))
return 2; return 2;
return 0; return 0;
} }
@ -235,7 +235,7 @@ void init_sha256(haggis_file *f) {
f->cksum.tag = sha256; f->cksum.tag = sha256;
SHA256_Init(&ctx); SHA256_Init(&ctx);
SHA256_Update(&ctx, f->data, (size_t)f->len.val); SHA256_Update(&ctx, f->data, (size_t)f->len.val);
SHA256_Final(f->cksum.sum.sha256, &ctx); SHA256_Final(f->cksum.sha256, &ctx);
} }
int validate_sha256(haggis_file *file) { int validate_sha256(haggis_file *file) {
@ -245,7 +245,7 @@ int validate_sha256(haggis_file *file) {
SHA256_Init(&ctx); SHA256_Init(&ctx);
SHA256_Update(&ctx, file->data, (size_t)file->len.val); SHA256_Update(&ctx, file->data, (size_t)file->len.val);
SHA256_Final(digest, &ctx); SHA256_Final(digest, &ctx);
if (memcmp(file->cksum.sum.sha256, digest, sizeof(digest))) if (memcmp(file->cksum.sha256, digest, sizeof(digest)))
return 2; return 2;
return 0; return 0;
} }
@ -407,22 +407,22 @@ int haggis_load_filetype(FILE *stream, haggis_typeflag tag, haggis_filetype *fil
switch (tag) { switch (tag) {
case normal: case normal:
file->tag = 0; file->tag = 0;
return haggis_load_file(stream, &file->f_type.file); return haggis_load_file(stream, &file->file);
case hardlink: case hardlink:
return haggis_load_filename(stream, &file->f_type.target); return haggis_load_filename(stream, &file->target);
file->tag = 1; file->tag = 1;
case softlink: case softlink:
return haggis_load_filename(stream, &file->f_type.target); return haggis_load_filename(stream, &file->target);
file->tag = 2; file->tag = 2;
case directory: case directory:
file->tag = 3; file->tag = 3;
break; break;
case character: case character:
file->tag = 4; file->tag = 4;
return haggis_load_device(stream, &file->f_type.dev); return haggis_load_device(stream, &file->dev);
case block: case block:
file->tag = 5; file->tag = 5;
return haggis_load_device(stream, &file->f_type.dev); return haggis_load_device(stream, &file->dev);
case fifo: case fifo:
file->tag = 6; file->tag = 6;
break; break;
@ -441,19 +441,19 @@ int haggis_store_filetype(FILE *stream, haggis_filetype *filetype) {
flag = 0; flag = 0;
if (fwrite(&flag, 1, 1, stream) != 1) if (fwrite(&flag, 1, 1, stream) != 1)
return 1; return 1;
if (haggis_store_file(stream, &filetype->f_type.file) != 0) if (haggis_store_file(stream, &filetype->file) != 0)
return 1; return 1;
break; break;
case hardlink: case hardlink:
flag = 1; flag = 1;
if (fwrite(&flag, 1, 1, stream) != 1) if (fwrite(&flag, 1, 1, stream) != 1)
return 1; return 1;
return haggis_store_filename(stream, &filetype->f_type.target); return haggis_store_filename(stream, &filetype->target);
case softlink: case softlink:
flag = 2; flag = 2;
if (fwrite(&flag, 1, 1, stream) != 1) if (fwrite(&flag, 1, 1, stream) != 1)
return 1; return 1;
return haggis_store_filename(stream, &filetype->f_type.target); return haggis_store_filename(stream, &filetype->target);
case directory: case directory:
flag = 3; flag = 3;
if (fwrite(&flag, 1, 1, stream) != 1) if (fwrite(&flag, 1, 1, stream) != 1)
@ -463,14 +463,14 @@ int haggis_store_filetype(FILE *stream, haggis_filetype *filetype) {
flag = 4; flag = 4;
if (fwrite(&flag, 1, 1, stream) != 1) if (fwrite(&flag, 1, 1, stream) != 1)
return 1; return 1;
if (haggis_store_device(stream, &filetype->f_type.dev) != 0) if (haggis_store_device(&filetype->dev, stream) != 0)
return 1; return 1;
break; break;
case block: case block:
flag = 5; flag = 5;
if (fwrite(&flag, 1, 1, stream) != 1) if (fwrite(&flag, 1, 1, stream) != 1)
return 1; return 1;
if (haggis_store_device(stream, &filetype->f_type.dev) != 0) if (haggis_store_device(&filetype->dev, stream) != 0)
return 1; return 1;
break; break;
case fifo: case fifo:
@ -504,14 +504,14 @@ void haggis_node_deinit(haggis_node *node) {
if (node->name.name != NULL) haggis_filename_deinit(&node->name); if (node->name.name != NULL) haggis_filename_deinit(&node->name);
switch (node->filetype.tag) { switch (node->filetype.tag) {
case normal: case normal:
if (node->filetype.f_type.file.data != NULL) { if (node->filetype.file.data != NULL) {
free(node->filetype.f_type.file.data); free(node->filetype.file.data);
} }
break; break;
case hardlink: case hardlink:
case softlink: case softlink:
if (node->filetype.f_type.target.name != NULL) { if (node->filetype.target.name != NULL) {
haggis_filename_deinit(&node->filetype.f_type.target); haggis_filename_deinit(&node->filetype.target);
} }
break; break;
case character: case character:
@ -534,7 +534,7 @@ int haggis_init_hardlink_node(
haggis_msg *msg; haggis_msg *msg;
node->filetype.tag = hardlink; node->filetype.tag = hardlink;
haggis_filename_init(target, &node->filetype.f_type.target); haggis_filename_init(target, &node->filetype.target);
body.f_name = strndup(node->name.name, PATH_MAX); body.f_name = strndup(node->name.name, PATH_MAX);
msg = haggis_msg_init(NodeCreated, body); msg = haggis_msg_init(NodeCreated, body);
if (msg == NULL) if (msg == NULL)
@ -563,7 +563,7 @@ int haggis_init_file_node(
} }
} }
node->filetype.tag = normal; node->filetype.tag = normal;
res = haggis_file_init(node->name.name, &node->filetype.f_type.file, a); res = haggis_file_init(node->name.name, &node->filetype.file, a);
if (res != 0) { if (res != 0) {
haggis_node_deinit(node); haggis_node_deinit(node);
return 1; return 1;
@ -591,7 +591,7 @@ int haggis_init_dev_node(
return 0; return 0;
} }
} }
haggis_device_init(st->st_rdev, &node->filetype.f_type.dev); haggis_device_init(st->st_rdev, &node->filetype.dev);
body.f_name = strndup(node->name.name, PATH_MAX); body.f_name = strndup(node->name.name, PATH_MAX);
msg = haggis_msg_init(NodeCreated, body); msg = haggis_msg_init(NodeCreated, body);
haggis_mq_push(mq, msg); haggis_mq_push(mq, msg);
@ -674,7 +674,7 @@ haggis_node* haggis_create_node(
} }
target = malloc(res + 1); target = malloc(res + 1);
memcpy(target, pathbuf, (unsigned long)res); memcpy(target, pathbuf, (unsigned long)res);
haggis_filename_init(target, &node->filetype.f_type.target); haggis_filename_init(target, &node->filetype.target);
body.f_name = strndup(file, PATH_MAX); body.f_name = strndup(file, PATH_MAX);
msg = haggis_msg_init(NodeCreated, body); msg = haggis_msg_init(NodeCreated, body);
haggis_mq_push(mq, msg); haggis_mq_push(mq, msg);
@ -743,8 +743,8 @@ int haggis_extract_dev(haggis_node *node, char *basedir) {
free(path); free(path);
return 2; return 2;
} }
major = (int)node->filetype.f_type.dev.major.val; major = (int)node->filetype.dev.major.val;
minor = (int)node->filetype.f_type.dev.minor.val; minor = (int)node->filetype.dev.minor.val;
dev = makedev(major, minor); dev = makedev(major, minor);
if (node->filetype.tag == block) { if (node->filetype.tag == block) {
mode = (mode_t)node->mode.val | S_IFBLK; mode = (mode_t)node->mode.val | S_IFBLK;
@ -791,7 +791,7 @@ int haggis_extract_symlink(haggis_node *node, char *basedir) {
free(path); free(path);
return 2; return 2;
} }
target = node->filetype.f_type.target.name; target = node->filetype.target.name;
if (access(path, F_OK) == 0) if (access(path, F_OK) == 0)
unlink(path); unlink(path);
ret = symlink(target, path); ret = symlink(target, path);
@ -814,7 +814,7 @@ int haggis_extract_hardlink(haggis_node *node, char *basedir) {
free(path); free(path);
return 2; return 2;
} }
target = get_full_path(&node->filetype.f_type.target, basedir); target = get_full_path(&node->filetype.target, basedir);
if (target == NULL) { if (target == NULL) {
free(path); free(path);
return 1; return 1;
@ -875,8 +875,8 @@ char* haggis_extract_file(haggis_node *node, char *basedir) {
free(path); free(path);
return NULL; return NULL;
} }
len = (size_t)node->filetype.f_type.file.len.val; len = (size_t)node->filetype.file.len.val;
ret = fwrite(node->filetype.f_type.file.data, len, 1, fd); ret = fwrite(node->filetype.file.data, len, 1, fd);
if (ret != len) { if (ret != len) {
free(path); free(path);
fclose(fd); fclose(fd);
@ -887,42 +887,42 @@ char* haggis_extract_file(haggis_node *node, char *basedir) {
return path; return path;
} }
int haggis_extract_node(char *basedir, haggis_node *node, haggis_mq *mq) { int haggis_extract_node(haggis_node *self, char *basedir, haggis_mq *mq) {
haggis_msg *msg; haggis_msg *msg;
char *path, *dir, *fullpath; char *path, *dir, *fullpath;
int ret = 0; int ret = 0;
path = get_full_path(&node->name, basedir); path = get_full_path(&self->name, basedir);
dir = dirname(strndup(path, PATH_MAX)); dir = dirname(strndup(path, PATH_MAX));
mkdir_p(dir); mkdir_p(dir);
switch (node->filetype.tag) { switch (self->filetype.tag) {
case block: case block:
case character: case character:
if (geteuid() == 0) { if (geteuid() == 0) {
ret = haggis_extract_dev(node, basedir); ret = haggis_extract_dev(self, basedir);
} else { } else {
ret = -1; ret = -1;
msg = calloc(1, sizeof(haggis_msg)); msg = calloc(1, sizeof(haggis_msg));
if (msg == NULL) return 2; if (msg == NULL) return 2;
msg->tag = DevNodeSkipped; msg->tag = DevNodeSkipped;
msg->body.f_name = strndup(node->name.name, PATH_MAX); msg->body.f_name = strndup(self->name.name, PATH_MAX);
haggis_mq_push(mq, msg); haggis_mq_push(mq, msg);
} }
break; break;
case fifo: case fifo:
ret = haggis_extract_fifo(node, basedir); ret = haggis_extract_fifo(self, basedir);
break; break;
case softlink: case softlink:
ret = haggis_extract_symlink(node, basedir); ret = haggis_extract_symlink(self, basedir);
break; break;
case hardlink: case hardlink:
ret = haggis_extract_hardlink(node, basedir); ret = haggis_extract_hardlink(self, basedir);
break; break;
case directory: case directory:
ret = haggis_extract_dir(node, basedir); ret = haggis_extract_dir(self, basedir);
break; break;
case normal: case normal:
fullpath = haggis_extract_file(node, basedir); fullpath = haggis_extract_file(self, basedir);
if (fullpath == NULL) { if (fullpath == NULL) {
ret = errno; ret = errno;
} }
@ -932,62 +932,62 @@ int haggis_extract_node(char *basedir, haggis_node *node, haggis_mq *mq) {
} }
if (ret) return ret; if (ret) return ret;
if (geteuid() == 0) { if (geteuid() == 0) {
ret = chown(path, (uid_t)node->uid.val, (gid_t)node->gid.val); ret = chown(path, (uid_t)self->uid.val, (gid_t)self->gid.val);
if (ret != 0) { if (ret != 0) {
free(path); free(path);
return errno; return errno;
} }
} }
ret = chmod(path, (mode_t)node->mode.val); ret = chmod(path, (mode_t)self->mode.val);
if (ret) return ret; if (ret) return ret;
msg = calloc(1, sizeof(haggis_msg)); msg = calloc(1, sizeof(haggis_msg));
if (msg == NULL) if (msg == NULL)
return 2; return 2;
msg->tag = NodeExtracted; msg->tag = NodeExtracted;
msg->body.f_name = strndup(node->name.name, PATH_MAX); msg->body.f_name = strndup(self->name.name, PATH_MAX);
haggis_mq_push(mq, msg); haggis_mq_push(mq, msg);
return ret; return ret;
} }
int haggis_load_node(FILE *stream, haggis_node *node) { int haggis_load_node(haggis_node *self, FILE *stream) {
int res; int res;
u16 mode; u16 mode;
haggis_typeflag tag; haggis_typeflag tag;
mode.val = 0; mode.val = 0;
res = haggis_load_filename(stream, &node->name); res = haggis_load_filename(stream, &self->name);
if (res) if (res)
return res; return res;
res = load_u32(stream, &node->uid); res = load_u32(stream, &self->uid);
if (res != 4) if (res != 4)
return 2; return 2;
res = load_u32(stream, &node->gid); res = load_u32(stream, &self->gid);
if (res != 4) if (res != 4)
return 2; return 2;
res = load_u64(stream, &node->mtime); res = load_u64(stream, &self->mtime);
if (res != 8) if (res != 8)
return 2; return 2;
res = load_u16(stream, &mode); res = load_u16(stream, &mode);
if (res != 2) if (res != 2)
return 2; return 2;
tag = haggis_filetype_from_mode(mode); tag = haggis_filetype_from_mode(mode);
node->mode.bytes[0] = mode.bytes[0] & 037; self->mode.bytes[0] = mode.bytes[0] & 037;
node->mode.bytes[1] = mode.bytes[1]; self->mode.bytes[1] = mode.bytes[1];
res = haggis_load_filetype(stream, tag, &node->filetype); res = haggis_load_filetype(stream, tag, &self->filetype);
if (res) if (res)
return res; return res;
return 0; return 0;
} }
int haggis_store_node(FILE *stream, haggis_node *node) { int haggis_store_node(haggis_node *self, FILE *stream) {
u16 mode; u16 mode;
if (haggis_store_filename(stream, &node->name) != (size_t)(node->name.len.val) + 2) if (haggis_store_filename(stream, &self->name) != (size_t)(self->name.len.val) + 2)
return 2; return 2;
if (store_u32(stream, &node->uid) != 4) return 2; if (store_u32(stream, &self->uid) != 4) return 2;
if (store_u32(stream, &node->gid) != 4) return 2; if (store_u32(stream, &self->gid) != 4) return 2;
if (store_u64(stream, &node->mtime) != 8) return 2; if (store_u64(stream, &self->mtime) != 8) return 2;
mode = haggis_derive_mode(node->mode, &node->filetype); mode = haggis_derive_mode(self->mode, &self->filetype);
if (store_u16(stream, &mode) != 2) return 2; if (store_u16(stream, &mode) != 2) return 2;
return haggis_store_filetype(stream, &node->filetype); return haggis_store_filetype(stream, &self->filetype);
} }

View file

@ -37,11 +37,11 @@
#include "haggis.h" #include "haggis.h"
int load_u16(FILE *stream, u16 *num); int load_u16 (FILE *stream, u16 *num);
int store_u16(FILE *stream, u16 *num); int store_u16(FILE *stream, u16 *num);
int load_u32(FILE *stream, u32 *num); int load_u32 (FILE *stream, u32 *num);
int store_u32(FILE *stream, u32 *num); int store_u32(FILE *stream, u32 *num);
int load_u64(FILE *stream, u64 *num); int load_u64 (FILE *stream, u64 *num);
int store_u64(FILE *stream, u64 *num); int store_u64(FILE *stream, u64 *num);
#endif #endif

View file

@ -42,17 +42,17 @@ typedef uint8_t u8;
typedef union { typedef union {
uint16_t val; uint16_t val;
u8 bytes[2]; u8 bytes[2];
} u16; } u16;
typedef union { typedef union {
uint32_t val; uint32_t val;
u8 bytes[4]; u8 bytes[4];
} u32; } u32;
typedef union { typedef union {
uint64_t val; uint64_t val;
u8 bytes[8]; u8 bytes[8];
} u64; } u64;
typedef struct { typedef struct {
@ -70,20 +70,20 @@ typedef enum {
typedef struct { typedef struct {
haggis_algorithm tag; haggis_algorithm tag;
union { union {
u8 md5[16]; u8 md5[16];
u8 sha1[20]; u8 sha1[20];
u8 sha256[32]; u8 sha256[32];
} sum; };
} haggis_checksum; } haggis_checksum;
typedef struct { typedef struct {
u64 len; u64 len;
haggis_checksum cksum; haggis_checksum cksum;
u8 *data; u8 *data;
} haggis_file; } haggis_file;
typedef struct { typedef struct {
u16 len; u16 len;
char *name; char *name;
} haggis_filename; } haggis_filename;
@ -99,20 +99,20 @@ typedef enum {
} haggis_typeflag; } haggis_typeflag;
typedef struct { typedef struct {
haggis_typeflag tag; haggis_typeflag tag;
union { union {
haggis_file file; haggis_file file;
haggis_filename target; haggis_filename target;
haggis_device dev; haggis_device dev;
} f_type; };
} haggis_filetype; } haggis_filetype;
typedef struct { typedef struct {
haggis_filename name; haggis_filename name;
u32 uid; u32 uid;
u32 gid; u32 gid;
u64 mtime; u64 mtime;
u16 mode; u16 mode;
haggis_filetype filetype; haggis_filetype filetype;
} haggis_node; } haggis_node;
@ -120,18 +120,18 @@ typedef struct {
typedef struct __bucket { typedef struct __bucket {
union { union {
ino_t val; ino_t val;
uint8_t bytes[sizeof(ino_t)]; uint8_t bytes[sizeof(ino_t)];
} key; } key;
uint64_t hash; uint64_t hash;
char * path; char *path;
} haggis_bucket; } haggis_bucket;
typedef struct { typedef struct {
pthread_mutex_t mutex; pthread_mutex_t mutex;
size_t len; size_t len;
size_t capacity; size_t capacity;
haggis_bucket *buckets; haggis_bucket *buckets;
} haggis_linkmap; } haggis_linkmap;
typedef enum { typedef enum {
@ -144,12 +144,12 @@ typedef enum {
typedef union { typedef union {
char *f_name; char *f_name;
int err; int err;
} haggis_message_body; } haggis_message_body;
struct _mq_node { struct _mq_node {
struct _mq_node *prev; struct _mq_node *prev;
struct _mq_node *next; struct _mq_node *next;
haggis_message_type tag; haggis_message_type tag;
haggis_message_body body; haggis_message_body body;
}; };
@ -157,20 +157,21 @@ struct _mq_node {
typedef struct _mq_node haggis_msg; typedef struct _mq_node haggis_msg;
typedef struct { typedef struct {
pthread_cond_t cond; pthread_cond_t cond;
size_t count; size_t count;
pthread_mutex_t mutex; pthread_mutex_t mutex;
haggis_msg *head; haggis_msg *head;
haggis_msg *tail; haggis_msg *tail;
} haggis_mq; } haggis_mq;
haggis_linkmap* haggis_linkmap_init(); haggis_linkmap* haggis_linkmap_init ();
void haggis_linkmap_deinit(haggis_linkmap *map); void haggis_linkmap_deinit (haggis_linkmap *self);
char* haggis_linkmap_get_or_add(haggis_linkmap *map, ino_t inode, char *path); char* haggis_linkmap_get_or_add(haggis_linkmap *self, ino_t inode, char *path);
void haggis_node_deinit(haggis_node *node); void haggis_node_deinit (haggis_node *self);
haggis_node* haggis_create_node(char *file, haggis_algorithm a, haggis_linkmap *map, haggis_mq *mq); haggis_node* haggis_create_node (char *file, haggis_algorithm a, haggis_linkmap *map,
int haggis_extract_node(char *basedir, haggis_node *node, haggis_mq *mq); haggis_mq *mq);
int haggis_load_node(FILE *stream, haggis_node *node); int haggis_extract_node (haggis_node *self, char *basedir, haggis_mq *mq);
int haggis_store_node(FILE *stream, haggis_node *node); int haggis_load_node (haggis_node *self, FILE *stream);
int haggis_store_node (haggis_node *self, FILE *stream);
#endif // !HAGGIS_H #endif // !HAGGIS_H

View file

@ -43,54 +43,54 @@
#include "haggis.h" #include "haggis.h"
#include "mq.h" #include "mq.h"
int haggis_store_header(FILE *stream); int haggis_store_header (FILE *stream);
int haggis_check_header(FILE *stream); int haggis_check_header (FILE *stream);
void haggis_device_init(dev_t rdev, haggis_device *dev); void haggis_device_init (dev_t rdev, haggis_device *dev);
int haggis_store_device(FILE *stream, haggis_device *dev); int haggis_store_device (haggis_device *self, FILE *stream);
int haggis_load_device(FILE *stream, haggis_device *dev); int haggis_load_device (FILE *stream, haggis_device *dev);
int haggis_store_cksum(FILE *stream, haggis_checksum *cksum); int haggis_store_cksum (FILE *stream, haggis_checksum *cksum);
int haggis_load_cksum(FILE *stream, haggis_checksum *cksum); int haggis_load_cksum (FILE *stream, haggis_checksum *cksum);
int validate_md5(haggis_file *file); int validate_md5 (haggis_file *file);
int validate_sha1(haggis_file *file); int validate_sha1 (haggis_file *file);
int validate_sha256(haggis_file *file); int validate_sha256 (haggis_file *file);
int haggis_validate_cksum(haggis_file *file); int haggis_validate_cksum (haggis_file *file);
int haggis_file_init(char *path, haggis_file *hf, haggis_algorithm a); int haggis_file_init (char *path, haggis_file *hf, haggis_algorithm a);
int haggis_store_file(FILE *stream, haggis_file *file); int haggis_store_file (FILE *stream, haggis_file *file);
int haggis_load_file(FILE *stream, haggis_file *f); int haggis_load_file (FILE *stream, haggis_file *f);
void haggis_filename_init(char *target, haggis_filename *fname); void haggis_filename_init (char *target, haggis_filename *fname);
void haggis_filename_deinit(haggis_filename *fname); void haggis_filename_deinit(haggis_filename *fname);
int haggis_load_filename(FILE *stream, haggis_filename *n); int haggis_load_filename (FILE *stream, haggis_filename *n);
int haggis_store_filename(FILE *stream, haggis_filename *n); int haggis_store_filename (FILE *stream, haggis_filename *n);
int haggis_load_filetype(FILE *stream, haggis_typeflag tag, haggis_filetype *file); int haggis_load_filetype (FILE *stream, haggis_typeflag tag, haggis_filetype *file);
int haggis_store_filetype(FILE *stream, haggis_filetype *filetype); int haggis_store_filetype (FILE *stream, haggis_filetype *filetype);
uint64_t hash_fnv1a_64(uint8_t *key, size_t len); uint64_t hash_fnv1a_64 (uint8_t *key, size_t len);
uint64_t hash_str_fnv1a_64(char *s); uint64_t hash_str_fnv1a_64 (char *s);
struct _map_node { struct _map_node {
struct _map_node *next; struct _map_node *next;
void * key; void *key;
uint64_t hash; uint64_t hash;
void *data; void *data;
}; };
typedef struct _map_node hmap_node; typedef struct _map_node hmap_node;
typedef struct { typedef struct {
size_t capacity; size_t capacity;
size_t len; size_t len;
size_t keysize; size_t keysize;
hmap_node *buckets; hmap_node *buckets;
} hmap; } hmap;
hmap_node* hmap_node_init(void *key, size_t keysize, void *data); hmap_node* hmap_node_init (void *key, size_t keysize, void *data);
void hmap_node_deinit(hmap_node *node); void hmap_node_deinit(hmap_node *self);
void* hmap_node_attach(hmap_node *root, hmap_node *leaf, size_t keysize); void* hmap_node_attach(hmap_node *root, hmap_node *leaf, size_t keysize);
void* hmap_node_search(hmap_node *root, void *key, size_t keysize); void* hmap_node_search(hmap_node *root, void *key, size_t keysize);
hmap* hmap_init(size_t keysize); hmap* hmap_init (size_t keysize);
void hmap_deinit(hmap *map); void hmap_deinit (hmap *self);
int hmap_expand(hmap *map); int hmap_expand (hmap *self);
void* hmap_insert(hmap *map, void *key, void *data); void* hmap_insert (hmap *self, void *key, void *data);
void* hmap_get(hmap *map, void *key); void* hmap_get (hmap *self, void *key);
void* hmap_remove(hmap *map, void *key); void* hmap_remove (hmap *self, void *key);
#endif // !HAGGIS_PRIVATE_H #endif // !HAGGIS_PRIVATE_H

View file

@ -39,26 +39,26 @@
typedef union { typedef union {
haggis_node *node; haggis_node *node;
char *f_name; char *f_name;
} haggis_job; } haggis_job;
struct _job_node { struct _job_node {
struct _job_node *prev; struct _job_node *prev;
haggis_job *job; haggis_job *job;
struct _job_node *next; struct _job_node *next;
}; };
typedef struct _job_node haggis_jobq_node; typedef struct _job_node haggis_jobq_node;
typedef struct { typedef struct {
pthread_cond_t *cond; pthread_cond_t *cond;
size_t count; size_t count;
pthread_mutex_t *mutex; pthread_mutex_t *mutex;
haggis_jobq_node *head; haggis_jobq_node *head;
haggis_jobq_node *tail; haggis_jobq_node *tail;
} haggis_jobq; } haggis_jobq;
int haggis_jobq_push(haggis_jobq *queue, haggis_job *job); int haggis_jobq_push(haggis_jobq *self, haggis_job *job);
haggis_job* haggis_jobq_pop(haggis_jobq *queue); haggis_job* haggis_jobq_pop (haggis_jobq *self);
#endif // !JOBQ_H #endif // !JOBQ_H

View file

@ -36,11 +36,11 @@
#include <pthread.h> #include <pthread.h>
#include "haggis.h" #include "haggis.h"
haggis_msg* haggis_msg_init(haggis_message_type tag, haggis_message_body body); haggis_msg* haggis_msg_init (haggis_message_type tag, haggis_message_body body);
void haggis_msg_deinit(haggis_msg *msg); void haggis_msg_deinit(haggis_msg *self);
int haggis_mq_init(haggis_mq *mq); int haggis_mq_init (haggis_mq *self);
int haggis_mq_push(haggis_mq *queue, haggis_msg *msg); int haggis_mq_push (haggis_mq *self, haggis_msg *msg);
haggis_msg* haggis_mq_pop(haggis_mq *queue); haggis_msg* haggis_mq_pop (haggis_mq *self);
haggis_msg* haggis_mq_try_pop(haggis_mq *queue); haggis_msg* haggis_mq_try_pop(haggis_mq *self);
#endif // !MQ_H #endif // !MQ_H

38
jobq.c
View file

@ -33,42 +33,42 @@
#include "jobq.h" #include "jobq.h"
int haggis_jobq_push(haggis_jobq *queue, haggis_job *job) { int haggis_jobq_push(haggis_jobq *self, haggis_job *job) {
haggis_jobq_node *new = malloc(sizeof(haggis_jobq_node)); haggis_jobq_node *new = malloc(sizeof(haggis_jobq_node));
if (new == NULL) if (new == NULL)
return 1; return 1;
new->job = job; new->job = job;
new->next = new->prev = NULL; new->next = new->prev = NULL;
pthread_mutex_lock(queue->mutex); pthread_mutex_lock(self->mutex);
if (queue->tail == NULL) { if (self->tail == NULL) {
queue->tail = queue->head = new; self->tail = self->head = new;
} else { } else {
new->next = queue->tail; new->next = self->tail;
queue->tail->prev = new; self->tail->prev = new;
queue->tail = new; self->tail = new;
} }
queue->count++; self->count++;
pthread_mutex_unlock(queue->mutex); pthread_mutex_unlock(self->mutex);
return 0; return 0;
} }
haggis_job* haggis_jobq_pop(haggis_jobq *queue) { haggis_job* haggis_jobq_pop(haggis_jobq *self) {
haggis_jobq_node *j; haggis_jobq_node *j;
haggis_job *job; haggis_job *job;
while (queue->count == 0) while (self->count == 0)
pthread_cond_wait(queue->cond, queue->mutex); pthread_cond_wait(self->cond, self->mutex);
pthread_mutex_lock(queue->mutex); pthread_mutex_lock(self->mutex);
queue->count--; self->count--;
j = queue->head; j = self->head;
job = j->job; job = j->job;
if (queue->tail == queue->head) { if (self->tail == self->head) {
queue->tail = queue->head = NULL; self->tail = self->head = NULL;
} else { } else {
queue->head = queue->head->prev; self->head = self->head->prev;
} }
free(j); free(j);
pthread_mutex_unlock(queue->mutex); pthread_mutex_unlock(self->mutex);
return job; return job;
} }

View file

@ -38,7 +38,7 @@
#include <string.h> // strndup #include <string.h> // strndup
#define FNV64_OFFSET_BASIS 14695981039346656037u #define FNV64_OFFSET_BASIS 14695981039346656037u
#define FNV64_PRIME 1099511628211u #define FNV64_PRIME 1099511628211u
uint64_t hash_fnv1a_64(uint8_t *key, size_t len) { uint64_t hash_fnv1a_64(uint8_t *key, size_t len) {
int i; int i;
@ -78,38 +78,38 @@ haggis_linkmap* haggis_linkmap_init() {
return map; return map;
} }
void haggis_linkmap_deinit(haggis_linkmap *map) { void haggis_linkmap_deinit(haggis_linkmap *self) {
free(map->buckets); free(self->buckets);
free(map); free(self);
} }
int haggis_linkmap_expand(haggis_linkmap *map) { int haggis_linkmap_expand(haggis_linkmap *self) {
haggis_bucket *buckets_new; haggis_bucket *buckets_new;
haggis_bucket *buckets_old; haggis_bucket *buckets_old;
size_t i, hash, idx; size_t i, hash, idx;
buckets_new = calloc(map->capacity + HAGGIS_BUCKETS_BASE, sizeof(haggis_bucket)); buckets_new = calloc(self->capacity + HAGGIS_BUCKETS_BASE, sizeof(haggis_bucket));
if (buckets_new == NULL) if (buckets_new == NULL)
return 2; return 2;
for (i = 0; i < map->capacity + HAGGIS_BUCKETS_BASE; i++) { for (i = 0; i < self->capacity + HAGGIS_BUCKETS_BASE; i++) {
map->buckets[i].path = NULL; self->buckets[i].path = NULL;
} }
for (i = 0; i < map->capacity; i++) { for (i = 0; i < self->capacity; i++) {
if (map->buckets[i].key.val != 0) { if (self->buckets[i].key.val != 0) {
hash = hash_fnv1a_64(&map->buckets[i].key.bytes[0], sizeof(ino_t)); hash = hash_fnv1a_64(&self->buckets[i].key.bytes[0], sizeof(ino_t));
map ->capacity += HAGGIS_BUCKETS_BASE; self ->capacity += HAGGIS_BUCKETS_BASE;
idx = map->capacity % hash; idx = self->capacity % hash;
buckets_new[idx] = map->buckets[i]; buckets_new[idx] = self->buckets[i];
} }
} }
buckets_old = map->buckets; buckets_old = self->buckets;
map->buckets = buckets_new; self->buckets = buckets_new;
free(buckets_old); free(buckets_old);
map->capacity += HAGGIS_BUCKETS_BASE; self->capacity += HAGGIS_BUCKETS_BASE;
return 0; return 0;
} }
char* haggis_linkmap_get_or_add(haggis_linkmap *map, ino_t inode, char * path) { char* haggis_linkmap_get_or_add(haggis_linkmap *self, ino_t inode, char * path) {
union { union {
ino_t val; ino_t val;
u8 bytes[sizeof(ino_t)]; u8 bytes[sizeof(ino_t)];
@ -117,29 +117,29 @@ char* haggis_linkmap_get_or_add(haggis_linkmap *map, ino_t inode, char * path) {
char * target = NULL; char * target = NULL;
size_t idx, hash, i; size_t idx, hash, i;
pthread_mutex_lock(&map->mutex); pthread_mutex_lock(&self->mutex);
if (map->len >= map->capacity) if (self->len >= self->capacity)
haggis_linkmap_expand(map); haggis_linkmap_expand(self);
key.val = inode; key.val = inode;
hash = hash_fnv1a_64(key.bytes, sizeof(ino_t)); hash = hash_fnv1a_64(key.bytes, sizeof(ino_t));
idx = hash % map->capacity; idx = hash % self->capacity;
for (i = 0; i < map->capacity; i++) { for (i = 0; i < self->capacity; i++) {
if (map->buckets[idx].key.val == inode) { if (self->buckets[idx].key.val == inode) {
target = strndup(map->buckets[idx].path, PATH_MAX - 1); target = strndup(self->buckets[idx].path, PATH_MAX - 1);
map->buckets[idx].path = path; self->buckets[idx].path = path;
break; break;
} else if (map->buckets[idx].key.val == 0) { } else if (self->buckets[idx].key.val == 0) {
map->buckets[idx].key.val = inode; self->buckets[idx].key.val = inode;
map->buckets[idx].hash = hash; self->buckets[idx].hash = hash;
map->buckets[idx].path = path; self->buckets[idx].path = path;
map->len++; self->len++;
break; break;
} else { } else {
idx++; idx++;
if (idx == map->capacity) if (idx == self->capacity)
idx = 0; idx = 0;
} }
} }
pthread_mutex_unlock(&map->mutex); pthread_mutex_unlock(&self->mutex);
return target; return target;
} }

76
mq.c
View file

@ -46,82 +46,82 @@ haggis_msg* haggis_msg_init(haggis_message_type tag, haggis_message_body body) {
return msg; return msg;
} }
void haggis_msg_deinit(haggis_msg *msg) { void haggis_msg_deinit(haggis_msg *self) {
switch (msg->tag) { switch (self->tag) {
case DevNodeSkipped: case DevNodeSkipped:
case NodeCreated: case NodeCreated:
case NodeExtracted: case NodeExtracted:
free(msg->body.f_name); free(self->body.f_name);
break; break;
case EndOfArchive: case EndOfArchive:
case ArchiveError: case ArchiveError:
break; break;
} }
free(msg); free(self);
} }
int haggis_mq_init(haggis_mq *mq) { int haggis_mq_init(haggis_mq *self) {
int ret; int ret;
mq->head = NULL; self->head = NULL;
mq->tail = NULL; self->tail = NULL;
ret = pthread_mutex_init(&mq->mutex, NULL); ret = pthread_mutex_init(&self->mutex, NULL);
if (ret != 0) if (ret != 0)
return ret; return ret;
return pthread_cond_init(&mq->cond, NULL); return pthread_cond_init(&self->cond, NULL);
} }
int haggis_mq_push(haggis_mq *queue, haggis_msg *msg) { int haggis_mq_push(haggis_mq *self, haggis_msg *msg) {
pthread_mutex_lock(&queue->mutex); pthread_mutex_lock(&self->mutex);
if (queue->tail == NULL) { if (self->tail == NULL) {
queue->tail = queue->head = msg; self->tail = self->head = msg;
} else { } else {
msg->next = queue->tail; msg->next = self->tail;
queue->tail->prev = msg; self->tail->prev = msg;
queue->tail = msg; self->tail = msg;
} }
queue->count++; self->count++;
pthread_cond_broadcast(&queue->cond); pthread_cond_broadcast(&self->cond);
pthread_mutex_unlock(&queue->mutex); pthread_mutex_unlock(&self->mutex);
return 0; return 0;
} }
haggis_msg* haggis_mq_pop(haggis_mq *queue) { haggis_msg* haggis_mq_pop(haggis_mq *self) {
haggis_msg *msg; haggis_msg *msg;
while (queue->count == 0) while (self->count == 0)
pthread_cond_wait(&queue->cond, &queue->mutex); pthread_cond_wait(&self->cond, &self->mutex);
pthread_mutex_lock(&queue->mutex); pthread_mutex_lock(&self->mutex);
queue->count--; self->count--;
msg = queue->head; msg = self->head;
if (msg->tag == EndOfArchive) if (msg->tag == EndOfArchive)
return msg; return msg;
if (queue->tail == queue->head) { if (self->tail == self->head) {
queue->tail = queue->head = NULL; self->tail = self->head = NULL;
} else { } else {
queue->head = queue->head->prev; self->head = self->head->prev;
} }
pthread_mutex_unlock(&queue->mutex); pthread_mutex_unlock(&self->mutex);
msg->prev = msg->next = NULL; msg->prev = msg->next = NULL;
return msg; return msg;
} }
haggis_msg* haggis_mq_try_pop(haggis_mq *queue) { haggis_msg* haggis_mq_try_pop(haggis_mq *self) {
haggis_msg *msg; haggis_msg *msg;
if (queue->count == 0) if (self->count == 0)
return NULL; return NULL;
pthread_mutex_lock(&queue->mutex); pthread_mutex_lock(&self->mutex);
queue->count--; self->count--;
msg = queue->head; msg = self->head;
if (msg->tag == EndOfArchive) if (msg->tag == EndOfArchive)
return msg; return msg;
if (queue->tail == queue->head) { if (self->tail == self->head) {
queue->tail = queue->head = NULL; self->tail = self->head = NULL;
} else { } else {
queue->head = queue->head->prev; self->head = self->head->prev;
} }
pthread_mutex_unlock(&queue->mutex); pthread_mutex_unlock(&self->mutex);
msg->prev = msg->next = NULL; msg->prev = msg->next = NULL;
return msg; return msg;
} }

View file

@ -16,12 +16,12 @@ int main() {
node = haggis_create_node(path, sha256, map, &mq); node = haggis_create_node(path, sha256, map, &mq);
assert(node->filetype.tag == character || node->filetype.tag == block); assert(node->filetype.tag == character || node->filetype.tag == block);
#if defined(__linux__) #if defined(__linux__)
assert(node->filetype.f_type.dev.major.val == 1); assert(node->filetype.dev.major.val == 1);
assert(node->filetype.f_type.dev.minor.val == 3); assert(node->filetype.dev.minor.val == 3);
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
assert(node->filetype.f_type.dev.major.val == 0); assert(node->filetype.dev.major.val == 0);
#endif /* if defined (__linux__) */ #endif /* if defined (__linux__) */
haggis_node_deinit(node); haggis_node_deinit(node);
haggis_linkmap_deinit(map); haggis_linkmap_deinit(map);
return 0; return 0;
} }

View file

@ -12,10 +12,10 @@ int main() {
haggis_node *node; haggis_node *node;
haggis_mq mq; haggis_mq mq;
char *path = "create_dev_node.c"; char *path = "create_dev_node.c";
uint8_t sum[] = {169, 53, 195, 76, 81, 143, 0, 198, 121, 240, uint8_t sum[] = { 0x69, 0x05, 0x0c, 0x52, 0x1d, 0xc9, 0x5e, 0x8d, 0x29,
35, 26, 176, 103, 200, 73, 229, 249, 238, 164, 0x42, 0xb3, 0x77, 0x81, 0x6f, 0x00, 0x47, 0x19, 0xd3,
54, 32, 101, 168, 23, 58, 200, 254, 228, 193, 0x67, 0x03, 0xd5, 0xaa, 0xce, 0x4f, 0x3f, 0x40, 0xc0,
215, 6}; 0x52, 0x54, 0xc1, 0x5b, 0x13 };
int i; int i;
map = haggis_linkmap_init(); map = haggis_linkmap_init();
@ -24,11 +24,11 @@ int main() {
node = haggis_create_node(path, sha256, map, &mq); node = haggis_create_node(path, sha256, map, &mq);
assert(node->filetype.tag == normal); assert(node->filetype.tag == normal);
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
assert(sum[i] == node->filetype.f_type.file.cksum.sum.sha256[i]); assert(sum[i] == node->filetype.file.cksum.sha256[i]);
} }
assert(node->filetype.f_type.file.len.val == 746); assert(node->filetype.file.len.val == 726);
assert(memcmp(path, node->name.name, 17) == 0); assert(memcmp(path, node->name.name, 17) == 0);
haggis_node_deinit(node); haggis_node_deinit(node);
haggis_linkmap_deinit(map); haggis_linkmap_deinit(map);
return 0; return 0;
} }

View file

@ -19,8 +19,8 @@ int main() {
node = haggis_create_node(path, sha256, map, &mq); node = haggis_create_node(path, sha256, map, &mq);
assert(node->filetype.tag == softlink); assert(node->filetype.tag == softlink);
assert(memcmp(path, node->name.name, 10) == 0); assert(memcmp(path, node->name.name, 10) == 0);
assert(memcmp(node->filetype.f_type.target.name, "device", 6) == 0); assert(memcmp(node->filetype.target.name, "device", 6) == 0);
haggis_node_deinit(node); haggis_node_deinit(node);
haggis_linkmap_deinit(map); haggis_linkmap_deinit(map);
return 0; return 0;
} }

View file

@ -31,7 +31,7 @@ int main() {
assert(msg->tag == NodeCreated); assert(msg->tag == NodeCreated);
assert(memcmp(msg->body.f_name, "dev/null", 8) == 0); assert(memcmp(msg->body.f_name, "dev/null", 8) == 0);
haggis_msg_deinit(msg); haggis_msg_deinit(msg);
ret = haggis_extract_node("output/extracted", node, &mq); ret = haggis_extract_node(node, "output/extracted", &mq);
msg = haggis_mq_pop(&mq); msg = haggis_mq_pop(&mq);
assert(msg->tag == NodeExtracted); assert(msg->tag == NodeExtracted);
assert(memcmp(msg->body.f_name, "dev/null", 8) == 0); assert(memcmp(msg->body.f_name, "dev/null", 8) == 0);
@ -39,4 +39,4 @@ int main() {
haggis_node_deinit(node); haggis_node_deinit(node);
haggis_linkmap_deinit(map); haggis_linkmap_deinit(map);
return 0; return 0;
} }

View file

@ -24,7 +24,7 @@ int main() {
assert(msg->tag == NodeCreated); assert(msg->tag == NodeCreated);
assert(memcmp(msg->body.f_name, path, 6) == 0); assert(memcmp(msg->body.f_name, path, 6) == 0);
haggis_msg_deinit(msg); haggis_msg_deinit(msg);
ret = haggis_extract_node("output/extracted", node, &mq); ret = haggis_extract_node(node, "output/extracted", &mq);
assert(ret == 0); assert(ret == 0);
msg = haggis_mq_pop(&mq); msg = haggis_mq_pop(&mq);
assert(msg->tag == NodeExtracted); assert(msg->tag == NodeExtracted);
@ -33,4 +33,4 @@ int main() {
haggis_node_deinit(node); haggis_node_deinit(node);
haggis_linkmap_deinit(map); haggis_linkmap_deinit(map);
return 0; return 0;
} }

View file

@ -20,7 +20,7 @@ int main() {
assert(node != NULL); assert(node != NULL);
assert(node->filetype.tag == fifo); assert(node->filetype.tag == fifo);
assert(memcmp(node->name.name, path, 11) == 0); assert(memcmp(node->name.name, path, 11) == 0);
ret = haggis_extract_node("output/extracted", node, &mq); ret = haggis_extract_node(node, "output/extracted", &mq);
assert(ret == 0); assert(ret == 0);
msg = haggis_mq_pop(&mq); msg = haggis_mq_pop(&mq);
assert(msg->tag == NodeCreated); assert(msg->tag == NodeCreated);
@ -35,4 +35,4 @@ int main() {
haggis_node_deinit(node); haggis_node_deinit(node);
haggis_linkmap_deinit(map); haggis_linkmap_deinit(map);
return 0; return 0;
} }

View file

@ -20,7 +20,7 @@ int main() {
assert(node != NULL); assert(node != NULL);
assert(node->filetype.tag == normal); assert(node->filetype.tag == normal);
assert(memcmp(node->name.name, inf, 8) == 0); assert(memcmp(node->name.name, inf, 8) == 0);
ret = haggis_extract_node("output/extracted", node, &mq); ret = haggis_extract_node(node, "output/extracted", &mq);
assert(ret == 0); assert(ret == 0);
msg = haggis_mq_pop(&mq); msg = haggis_mq_pop(&mq);
assert(msg->tag == NodeCreated); assert(msg->tag == NodeCreated);

View file

@ -33,10 +33,10 @@ int main() {
assert(node1 != NULL); assert(node1 != NULL);
assert(node1->filetype.tag == hardlink); assert(node1->filetype.tag == hardlink);
assert(memcmp(node1->name.name, lnk, 15) == 0); assert(memcmp(node1->name.name, lnk, 15) == 0);
ret = haggis_extract_node("output/extracted", node0, &mq); ret = haggis_extract_node(node0, "output/extracted", &mq);
assert(ret == 0); assert(ret == 0);
haggis_node_deinit(node0); haggis_node_deinit(node0);
ret = haggis_extract_node("output/extracted", node1, &mq); ret = haggis_extract_node(node1, "output/extracted", &mq);
assert(ret == 0); assert(ret == 0);
haggis_node_deinit(node1); haggis_node_deinit(node1);
msg = haggis_mq_pop(&mq); msg = haggis_mq_pop(&mq);

View file

@ -23,8 +23,8 @@ int main() {
assert(node != NULL); assert(node != NULL);
assert(node->filetype.tag == softlink); assert(node->filetype.tag == softlink);
assert(memcmp(node->name.name, lnk, 14) == 0); assert(memcmp(node->name.name, lnk, 14) == 0);
assert(memcmp(node->filetype.f_type.target.name, tgt, 11) == 0); assert(memcmp(node->filetype.target.name, tgt, 11) == 0);
ret = haggis_extract_node("output/extracted", node, &mq); ret = haggis_extract_node(node, "output/extracted", &mq);
assert(ret == 0); assert(ret == 0);
msg = haggis_mq_pop(&mq); msg = haggis_mq_pop(&mq);
assert(msg->tag == NodeCreated); assert(msg->tag == NodeCreated);

View file

@ -10,5 +10,5 @@ int main() {
assert(haggis_file_init(f, &hf, md5) == 0); assert(haggis_file_init(f, &hf, md5) == 0);
assert(hf.cksum.tag == md5); assert(hf.cksum.tag == md5);
assert(memcmp(buf, hf.cksum.sum.md5, 16) == 0); assert(memcmp(buf, hf.cksum.md5, 16) == 0);
} }

View file

@ -11,6 +11,5 @@ int main() {
assert(haggis_file_init(f, &hf, sha1) == 0); assert(haggis_file_init(f, &hf, sha1) == 0);
assert(hf.cksum.tag == sha1); assert(hf.cksum.tag == sha1);
assert(memcmp(buf, hf.cksum.sum.sha1, 20) == 0); assert(memcmp(buf, hf.cksum.sha1, 20) == 0);
} }

View file

@ -12,6 +12,6 @@ int main() {
assert(haggis_file_init(f, &hf, sha256) == 0); assert(haggis_file_init(f, &hf, sha256) == 0);
assert(hf.cksum.tag == sha256); assert(hf.cksum.tag == sha256);
assert(memcmp(buf, hf.cksum.sum.sha256, 32) == 0); assert(memcmp(buf, hf.cksum.sha256, 32) == 0);
} }

View file

@ -13,7 +13,7 @@ int main() {
if (haggis_load_cksum(f, &cksum)) return 1; if (haggis_load_cksum(f, &cksum)) return 1;
assert(cksum.tag == md5); assert(cksum.tag == md5);
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
assert(cksum.sum.md5[i] == (uint8_t)i); assert(cksum.md5[i] == (uint8_t)i);
} }
fclose(f); fclose(f);
} }

View file

@ -13,7 +13,7 @@ int main() {
if (haggis_load_cksum(f, &cksum)) return 1; if (haggis_load_cksum(f, &cksum)) return 1;
assert(cksum.tag == sha1); assert(cksum.tag == sha1);
for (i = 0; i < 20; i++) { for (i = 0; i < 20; i++) {
assert(cksum.sum.sha1[i] == (uint8_t)i); assert(cksum.sha1[i] == (uint8_t)i);
} }
fclose(f); fclose(f);
} }

View file

@ -13,7 +13,7 @@ int main() {
if (haggis_load_cksum(f, &cksum)) return 1; if (haggis_load_cksum(f, &cksum)) return 1;
assert(cksum.tag == sha256); assert(cksum.tag == sha256);
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
assert(cksum.sum.sha256[i] == (uint8_t)i); assert(cksum.sha256[i] == (uint8_t)i);
} }
fclose(f); fclose(f);
} }

View file

@ -2,14 +2,14 @@
#include <stdio.h> #include <stdio.h>
int main() { int main() {
haggis_device dev; haggis_device dev;
FILE *f; FILE *f;
int ret; int ret;
dev.major.val = 42; dev.major.val = 42;
dev.minor.val = 69; dev.minor.val = 69;
f = fopen("output/device", "w"); f = fopen("output/device", "w");
ret = haggis_store_device(f, &dev); ret = haggis_store_device(&dev, f);
fflush(f); fflush(f);
fclose(f); fclose(f);
return ret; return ret;

View file

@ -10,7 +10,7 @@ int main() {
cksum.tag = md5; cksum.tag = md5;
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
cksum.sum.md5[i] = (uint8_t)i; cksum.md5[i] = (uint8_t)i;
} }
f = fopen("output/md5", "w"); f = fopen("output/md5", "w");
ret = haggis_store_cksum(f, &cksum); ret = haggis_store_cksum(f, &cksum);

View file

@ -10,7 +10,7 @@ int main() {
cksum.tag = sha1; cksum.tag = sha1;
for (i = 0; i < 20; i++) { for (i = 0; i < 20; i++) {
cksum.sum.md5[i] = (uint8_t)i; cksum.md5[i] = (uint8_t)i;
} }
f = fopen("output/sha1", "w"); f = fopen("output/sha1", "w");
ret = haggis_store_cksum(f, &cksum); ret = haggis_store_cksum(f, &cksum);

View file

@ -10,7 +10,7 @@ int main() {
cksum.tag = sha256; cksum.tag = sha256;
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
cksum.sum.sha256[i] = (uint8_t)i; cksum.sha256[i] = (uint8_t)i;
} }
f = fopen("output/sha256", "w"); f = fopen("output/sha256", "w");
ret = haggis_store_cksum(f, &cksum); ret = haggis_store_cksum(f, &cksum);