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

@ -73,7 +73,7 @@ typedef struct {
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 {
@ -104,7 +104,7 @@ typedef struct {
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 {
@ -165,12 +165,13 @@ typedef struct {
} 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

@ -46,7 +46,7 @@
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);
@ -83,14 +83,14 @@ typedef struct {
} 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

@ -58,7 +58,7 @@ typedef struct {
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

@ -37,10 +37,10 @@
#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

@ -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,10 +16,10 @@ 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);

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,9 +24,9 @@ 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);

View file

@ -19,7 +19,7 @@ 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);

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);

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);

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

@ -9,7 +9,7 @@ int main() {
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);