Minor refactor and formatting changes
This commit is contained in:
parent
a988a7877e
commit
f4e9b80737
28 changed files with 291 additions and 291 deletions
134
haggis.c
134
haggis.c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
12
include/mq.h
12
include/mq.h
|
@ -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
38
jobq.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
66
linkmap.c
66
linkmap.c
|
@ -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
76
mq.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue