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

View file

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

View file

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

View file

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

View file

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

38
jobq.c
View file

@ -33,42 +33,42 @@
#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));
if (new == NULL)
return 1;
new->job = job;
new->next = new->prev = NULL;
pthread_mutex_lock(queue->mutex);
if (queue->tail == NULL) {
queue->tail = queue->head = new;
pthread_mutex_lock(self->mutex);
if (self->tail == NULL) {
self->tail = self->head = new;
} else {
new->next = queue->tail;
queue->tail->prev = new;
queue->tail = new;
new->next = self->tail;
self->tail->prev = new;
self->tail = new;
}
queue->count++;
pthread_mutex_unlock(queue->mutex);
self->count++;
pthread_mutex_unlock(self->mutex);
return 0;
}
haggis_job* haggis_jobq_pop(haggis_jobq *queue) {
haggis_job* haggis_jobq_pop(haggis_jobq *self) {
haggis_jobq_node *j;
haggis_job *job;
while (queue->count == 0)
pthread_cond_wait(queue->cond, queue->mutex);
pthread_mutex_lock(queue->mutex);
queue->count--;
j = queue->head;
while (self->count == 0)
pthread_cond_wait(self->cond, self->mutex);
pthread_mutex_lock(self->mutex);
self->count--;
j = self->head;
job = j->job;
if (queue->tail == queue->head) {
queue->tail = queue->head = NULL;
if (self->tail == self->head) {
self->tail = self->head = NULL;
} else {
queue->head = queue->head->prev;
self->head = self->head->prev;
}
free(j);
pthread_mutex_unlock(queue->mutex);
pthread_mutex_unlock(self->mutex);
return job;
}

View file

@ -38,7 +38,7 @@
#include <string.h> // strndup
#define FNV64_OFFSET_BASIS 14695981039346656037u
#define FNV64_PRIME 1099511628211u
#define FNV64_PRIME 1099511628211u
uint64_t hash_fnv1a_64(uint8_t *key, size_t len) {
int i;
@ -78,38 +78,38 @@ haggis_linkmap* haggis_linkmap_init() {
return map;
}
void haggis_linkmap_deinit(haggis_linkmap *map) {
free(map->buckets);
free(map);
void haggis_linkmap_deinit(haggis_linkmap *self) {
free(self->buckets);
free(self);
}
int haggis_linkmap_expand(haggis_linkmap *map) {
int haggis_linkmap_expand(haggis_linkmap *self) {
haggis_bucket *buckets_new;
haggis_bucket *buckets_old;
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)
return 2;
for (i = 0; i < map->capacity + HAGGIS_BUCKETS_BASE; i++) {
map->buckets[i].path = NULL;
for (i = 0; i < self->capacity + HAGGIS_BUCKETS_BASE; i++) {
self->buckets[i].path = NULL;
}
for (i = 0; i < map->capacity; i++) {
if (map->buckets[i].key.val != 0) {
hash = hash_fnv1a_64(&map->buckets[i].key.bytes[0], sizeof(ino_t));
map ->capacity += HAGGIS_BUCKETS_BASE;
idx = map->capacity % hash;
buckets_new[idx] = map->buckets[i];
for (i = 0; i < self->capacity; i++) {
if (self->buckets[i].key.val != 0) {
hash = hash_fnv1a_64(&self->buckets[i].key.bytes[0], sizeof(ino_t));
self ->capacity += HAGGIS_BUCKETS_BASE;
idx = self->capacity % hash;
buckets_new[idx] = self->buckets[i];
}
}
buckets_old = map->buckets;
map->buckets = buckets_new;
buckets_old = self->buckets;
self->buckets = buckets_new;
free(buckets_old);
map->capacity += HAGGIS_BUCKETS_BASE;
self->capacity += HAGGIS_BUCKETS_BASE;
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 {
ino_t val;
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;
size_t idx, hash, i;
pthread_mutex_lock(&map->mutex);
if (map->len >= map->capacity)
haggis_linkmap_expand(map);
pthread_mutex_lock(&self->mutex);
if (self->len >= self->capacity)
haggis_linkmap_expand(self);
key.val = inode;
hash = hash_fnv1a_64(key.bytes, sizeof(ino_t));
idx = hash % map->capacity;
for (i = 0; i < map->capacity; i++) {
if (map->buckets[idx].key.val == inode) {
target = strndup(map->buckets[idx].path, PATH_MAX - 1);
map->buckets[idx].path = path;
idx = hash % self->capacity;
for (i = 0; i < self->capacity; i++) {
if (self->buckets[idx].key.val == inode) {
target = strndup(self->buckets[idx].path, PATH_MAX - 1);
self->buckets[idx].path = path;
break;
} else if (map->buckets[idx].key.val == 0) {
map->buckets[idx].key.val = inode;
map->buckets[idx].hash = hash;
map->buckets[idx].path = path;
map->len++;
} else if (self->buckets[idx].key.val == 0) {
self->buckets[idx].key.val = inode;
self->buckets[idx].hash = hash;
self->buckets[idx].path = path;
self->len++;
break;
} else {
idx++;
if (idx == map->capacity)
if (idx == self->capacity)
idx = 0;
}
}
pthread_mutex_unlock(&map->mutex);
pthread_mutex_unlock(&self->mutex);
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;
}
void haggis_msg_deinit(haggis_msg *msg) {
switch (msg->tag) {
void haggis_msg_deinit(haggis_msg *self) {
switch (self->tag) {
case DevNodeSkipped:
case NodeCreated:
case NodeExtracted:
free(msg->body.f_name);
free(self->body.f_name);
break;
case EndOfArchive:
case ArchiveError:
break;
}
free(msg);
free(self);
}
int haggis_mq_init(haggis_mq *mq) {
int haggis_mq_init(haggis_mq *self) {
int ret;
mq->head = NULL;
mq->tail = NULL;
ret = pthread_mutex_init(&mq->mutex, NULL);
self->head = NULL;
self->tail = NULL;
ret = pthread_mutex_init(&self->mutex, NULL);
if (ret != 0)
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) {
pthread_mutex_lock(&queue->mutex);
if (queue->tail == NULL) {
queue->tail = queue->head = msg;
int haggis_mq_push(haggis_mq *self, haggis_msg *msg) {
pthread_mutex_lock(&self->mutex);
if (self->tail == NULL) {
self->tail = self->head = msg;
} else {
msg->next = queue->tail;
queue->tail->prev = msg;
queue->tail = msg;
msg->next = self->tail;
self->tail->prev = msg;
self->tail = msg;
}
queue->count++;
pthread_cond_broadcast(&queue->cond);
pthread_mutex_unlock(&queue->mutex);
self->count++;
pthread_cond_broadcast(&self->cond);
pthread_mutex_unlock(&self->mutex);
return 0;
}
haggis_msg* haggis_mq_pop(haggis_mq *queue) {
haggis_msg* haggis_mq_pop(haggis_mq *self) {
haggis_msg *msg;
while (queue->count == 0)
pthread_cond_wait(&queue->cond, &queue->mutex);
pthread_mutex_lock(&queue->mutex);
queue->count--;
msg = queue->head;
while (self->count == 0)
pthread_cond_wait(&self->cond, &self->mutex);
pthread_mutex_lock(&self->mutex);
self->count--;
msg = self->head;
if (msg->tag == EndOfArchive)
return msg;
if (queue->tail == queue->head) {
queue->tail = queue->head = NULL;
if (self->tail == self->head) {
self->tail = self->head = NULL;
} 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;
return msg;
}
haggis_msg* haggis_mq_try_pop(haggis_mq *queue) {
haggis_msg* haggis_mq_try_pop(haggis_mq *self) {
haggis_msg *msg;
if (queue->count == 0)
if (self->count == 0)
return NULL;
pthread_mutex_lock(&queue->mutex);
queue->count--;
msg = queue->head;
pthread_mutex_lock(&self->mutex);
self->count--;
msg = self->head;
if (msg->tag == EndOfArchive)
return msg;
if (queue->tail == queue->head) {
queue->tail = queue->head = NULL;
if (self->tail == self->head) {
self->tail = self->head = NULL;
} 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;
return msg;
}

View file

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

View file

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

View file

@ -19,8 +19,8 @@ int main() {
node = haggis_create_node(path, sha256, map, &mq);
assert(node->filetype.tag == softlink);
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_linkmap_deinit(map);
return 0;
}
}

View file

@ -31,7 +31,7 @@ int main() {
assert(msg->tag == NodeCreated);
assert(memcmp(msg->body.f_name, "dev/null", 8) == 0);
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);
assert(msg->tag == NodeExtracted);
assert(memcmp(msg->body.f_name, "dev/null", 8) == 0);
@ -39,4 +39,4 @@ int main() {
haggis_node_deinit(node);
haggis_linkmap_deinit(map);
return 0;
}
}

View file

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

View file

@ -20,7 +20,7 @@ int main() {
assert(node != NULL);
assert(node->filetype.tag == fifo);
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);
msg = haggis_mq_pop(&mq);
assert(msg->tag == NodeCreated);
@ -35,4 +35,4 @@ int main() {
haggis_node_deinit(node);
haggis_linkmap_deinit(map);
return 0;
}
}

View file

@ -20,7 +20,7 @@ int main() {
assert(node != NULL);
assert(node->filetype.tag == normal);
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);
msg = haggis_mq_pop(&mq);
assert(msg->tag == NodeCreated);

View file

@ -33,10 +33,10 @@ int main() {
assert(node1 != NULL);
assert(node1->filetype.tag == hardlink);
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);
haggis_node_deinit(node0);
ret = haggis_extract_node("output/extracted", node1, &mq);
ret = haggis_extract_node(node1, "output/extracted", &mq);
assert(ret == 0);
haggis_node_deinit(node1);
msg = haggis_mq_pop(&mq);

View file

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

View file

@ -10,5 +10,5 @@ int main() {
assert(haggis_file_init(f, &hf, md5) == 0);
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(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(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;
assert(cksum.tag == md5);
for (i = 0; i < 16; i++) {
assert(cksum.sum.md5[i] == (uint8_t)i);
assert(cksum.md5[i] == (uint8_t)i);
}
fclose(f);
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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