Continue refactor
This commit is contained in:
parent
1e5b903cff
commit
4a2b0328f9
9 changed files with 783 additions and 781 deletions
138
haggis.c
138
haggis.c
|
@ -58,8 +58,8 @@
|
|||
#include <stdio.h> // fopen, fread, fwrite, FILE
|
||||
#include <stdlib.h> // free, malloc, calloc
|
||||
#include <string.h> // memcpy, strnlen, strndup
|
||||
#include <unistd.h> // access, dirname, geteuid, readlink
|
||||
#include <sys/stat.h> // stat, lstat, mkdir, mknod
|
||||
#include <unistd.h> // access, dirname, geteuid, readlink
|
||||
|
||||
#include "haggis_private.h"
|
||||
|
||||
|
@ -80,9 +80,9 @@ int haggis_check_header(FILE *stream) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
void haggis_device_init(dev_t rdev, haggis_device *dev) {
|
||||
dev->major.val = (uint32_t)major(rdev);
|
||||
dev->minor.val = (uint32_t)minor(rdev);
|
||||
void haggis_device_init(haggis_device *self, dev_t rdev) {
|
||||
self->major.val = (uint32_t)major(rdev);
|
||||
self->minor.val = (uint32_t)minor(rdev);
|
||||
}
|
||||
|
||||
int haggis_store_device(haggis_device *self, FILE *stream) {
|
||||
|
@ -93,37 +93,37 @@ int haggis_store_device(haggis_device *self, FILE *stream) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int haggis_load_device(FILE *stream, haggis_device *dev) {
|
||||
if (fread(dev->major.bytes, 1, 4, stream) != 4)
|
||||
int haggis_load_device(haggis_device *self, FILE *stream) {
|
||||
if (fread(self->major.bytes, 1, 4, stream) != 4)
|
||||
return 1;
|
||||
if (fread(dev->minor.bytes, 1, 4, stream) != 4)
|
||||
if (fread(self->minor.bytes, 1, 4, stream) != 4)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int haggis_store_cksum(FILE *stream, haggis_checksum *cksum) {
|
||||
int haggis_store_cksum(haggis_checksum *self, FILE *stream) {
|
||||
u8 flag;
|
||||
|
||||
switch (cksum->tag) {
|
||||
switch (self->tag) {
|
||||
case md5:
|
||||
flag = 0;
|
||||
if (fwrite(&flag, 1, 1, stream) != 1)
|
||||
return 1;
|
||||
if (fwrite(cksum->md5, 1, 16, stream) != 16)
|
||||
if (fwrite(self->md5, 1, 16, stream) != 16)
|
||||
return 1;
|
||||
break;
|
||||
case sha1:
|
||||
flag = 1;
|
||||
if (fwrite(&flag, 1, 1, stream) != 1)
|
||||
return 1;
|
||||
if (fwrite(cksum->sha1, 1, 20, stream) != 20)
|
||||
if (fwrite(self->sha1, 1, 20, stream) != 20)
|
||||
return 1;
|
||||
break;
|
||||
case sha256:
|
||||
flag = 2;
|
||||
if (fwrite(&flag, 1, 1, stream) != 1)
|
||||
return 1;
|
||||
if (fwrite(cksum->sha256, 1, 32, stream) != 32)
|
||||
if (fwrite(self->sha256, 1, 32, stream) != 32)
|
||||
return 1;
|
||||
break;
|
||||
case skip:
|
||||
|
@ -135,29 +135,29 @@ int haggis_store_cksum(FILE *stream, haggis_checksum *cksum) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int haggis_load_cksum(FILE *stream, haggis_checksum *cksum) {
|
||||
int haggis_load_cksum(haggis_checksum *self, FILE *stream) {
|
||||
u8 flag;
|
||||
|
||||
if (fread(&flag, 1, 1, stream) != 1)
|
||||
return 1;
|
||||
switch (flag) {
|
||||
case md5:
|
||||
cksum->tag = 0;
|
||||
if (fread(&cksum->md5, 1, 16, stream) != 16)
|
||||
self->tag = 0;
|
||||
if (fread(&self->md5, 1, 16, stream) != 16)
|
||||
return 1;
|
||||
break;
|
||||
case sha1:
|
||||
cksum->tag = 1;
|
||||
if (fread(&cksum->sha1, 1, 20, stream) != 20)
|
||||
self->tag = 1;
|
||||
if (fread(&self->sha1, 1, 20, stream) != 20)
|
||||
return 1;
|
||||
break;
|
||||
case sha256:
|
||||
cksum->tag = 2;
|
||||
if (fread(&cksum->sha256, 1, 32, stream) != 32)
|
||||
self->tag = 2;
|
||||
if (fread(&self->sha256, 1, 32, stream) != 32)
|
||||
return 1;
|
||||
break;
|
||||
case skip:
|
||||
cksum->tag = 3;
|
||||
self->tag = 3;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
|
@ -307,7 +307,8 @@ int haggis_file_init(char *path, haggis_file *hf, haggis_algorithm a) {
|
|||
long len;
|
||||
|
||||
f = fopen(path, "r");
|
||||
if (f == NULL) return 2;
|
||||
if (f == NULL)
|
||||
return 2;
|
||||
if (fseek(f, 0, SEEK_END) == -1) {
|
||||
fclose(f);
|
||||
return 2;
|
||||
|
@ -331,13 +332,14 @@ int haggis_file_init(char *path, haggis_file *hf, haggis_algorithm a) {
|
|||
}
|
||||
|
||||
void haggis_file_deinit(haggis_file *f) {
|
||||
if (f->data != NULL) free(f->data);
|
||||
if (f->data != NULL)
|
||||
free(f->data);
|
||||
}
|
||||
|
||||
int haggis_store_file(FILE *stream, haggis_file *file) {
|
||||
if (store_u64(stream, &file->len) != 8)
|
||||
return 1;
|
||||
if (haggis_store_cksum(stream, &file->cksum) != 0)
|
||||
if (haggis_store_cksum(&file->cksum, stream) != 0)
|
||||
return 1;
|
||||
int res = fwrite(file->data, 1, (size_t)file->len.val, stream);
|
||||
if (res != (size_t)file->len.val)
|
||||
|
@ -348,7 +350,7 @@ int haggis_store_file(FILE *stream, haggis_file *file) {
|
|||
int haggis_load_file(FILE *stream, haggis_file *f) {
|
||||
if (load_u64(stream, &f->len) != 8)
|
||||
return 1;
|
||||
if (haggis_load_cksum(stream, &f->cksum) != 0)
|
||||
if (haggis_load_cksum(&f->cksum, stream) != 0)
|
||||
return 1;
|
||||
f->data = calloc(1, (size_t)f->len.val);
|
||||
if (f->data == NULL)
|
||||
|
@ -374,7 +376,8 @@ void haggis_filename_init(char *target, haggis_filename *fname) {
|
|||
}
|
||||
|
||||
void haggis_filename_deinit(haggis_filename *fname) {
|
||||
if (fname->name != NULL) free(fname->name);
|
||||
if (fname->name != NULL)
|
||||
free(fname->name);
|
||||
}
|
||||
|
||||
int haggis_load_filename(FILE *stream, haggis_filename *n) {
|
||||
|
@ -382,10 +385,12 @@ int haggis_load_filename(FILE *stream, haggis_filename *n) {
|
|||
char *name;
|
||||
|
||||
len.val = 0;
|
||||
if (fread(len.bytes, 1, 2, stream) != 2) return 2;
|
||||
if (fread(len.bytes, 1, 2, stream) != 2)
|
||||
return 2;
|
||||
n->len = len;
|
||||
name = calloc(1, (size_t)len.val);
|
||||
if (name == NULL) return -1;
|
||||
if (name == NULL)
|
||||
return -1;
|
||||
if (fread(name, 1, (size_t)len.val, stream) != (size_t)len.val) {
|
||||
free(name);
|
||||
return 2;
|
||||
|
@ -395,13 +400,15 @@ int haggis_load_filename(FILE *stream, haggis_filename *n) {
|
|||
}
|
||||
|
||||
int haggis_store_filename(FILE *stream, haggis_filename *n) {
|
||||
if (fwrite(n->len.bytes, 1, 2, stream) != 2) return 2;
|
||||
if (fwrite(n->len.bytes, 1, 2, stream) != 2)
|
||||
return 2;
|
||||
if (fwrite(n->name, 1, (size_t)n->len.val, stream) != (size_t)n->len.val)
|
||||
return 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int haggis_load_filetype(FILE *stream, haggis_typeflag tag, haggis_filetype *file) {
|
||||
int haggis_load_filetype(FILE *stream, haggis_typeflag tag,
|
||||
haggis_filetype *file) {
|
||||
switch (tag) {
|
||||
case normal:
|
||||
file->tag = 0;
|
||||
|
@ -417,10 +424,10 @@ int haggis_load_filetype(FILE *stream, haggis_typeflag tag, haggis_filetype *fil
|
|||
break;
|
||||
case character:
|
||||
file->tag = 4;
|
||||
return haggis_load_device(stream, &file->dev);
|
||||
return haggis_load_device(&file->dev, stream);
|
||||
case block:
|
||||
file->tag = 5;
|
||||
return haggis_load_device(stream, &file->dev);
|
||||
return haggis_load_device(&file->dev, stream);
|
||||
case fifo:
|
||||
file->tag = 6;
|
||||
break;
|
||||
|
@ -498,8 +505,10 @@ u16 haggis_derive_mode(u16 raw, haggis_filetype *ft) {
|
|||
}
|
||||
|
||||
void haggis_node_deinit(haggis_node *node) {
|
||||
if (node == NULL) return;
|
||||
if (node->name.name != NULL) haggis_filename_deinit(&node->name);
|
||||
if (node == NULL)
|
||||
return;
|
||||
if (node->name.name != NULL)
|
||||
haggis_filename_deinit(&node->name);
|
||||
switch (node->filetype.tag) {
|
||||
case normal:
|
||||
if (node->filetype.file.data != NULL) {
|
||||
|
@ -522,12 +531,8 @@ void haggis_node_deinit(haggis_node *node) {
|
|||
free(node);
|
||||
}
|
||||
|
||||
int haggis_init_hardlink_node(
|
||||
haggis_node *node,
|
||||
char *target,
|
||||
haggis_linkmap *map,
|
||||
haggis_mq *mq
|
||||
) {
|
||||
int haggis_init_hardlink_node(haggis_node *node, char *target,
|
||||
haggis_linkmap *map, haggis_mq *mq) {
|
||||
haggis_message_body body;
|
||||
haggis_msg *msg;
|
||||
|
||||
|
@ -541,13 +546,9 @@ int haggis_init_hardlink_node(
|
|||
return 0;
|
||||
}
|
||||
|
||||
int haggis_init_file_node(
|
||||
haggis_node *node,
|
||||
struct stat *st,
|
||||
haggis_algorithm a,
|
||||
haggis_linkmap *map,
|
||||
haggis_mq *mq
|
||||
) {
|
||||
int haggis_init_file_node(haggis_node *node, struct stat *st,
|
||||
haggis_algorithm a, haggis_linkmap *map,
|
||||
haggis_mq *mq) {
|
||||
haggis_message_body body;
|
||||
haggis_msg *msg;
|
||||
char *target;
|
||||
|
@ -572,12 +573,8 @@ int haggis_init_file_node(
|
|||
return 0;
|
||||
}
|
||||
|
||||
int haggis_init_dev_node(
|
||||
haggis_node *node,
|
||||
struct stat *st,
|
||||
haggis_linkmap *map,
|
||||
haggis_mq *mq
|
||||
) {
|
||||
int haggis_init_dev_node(haggis_node *node, struct stat *st,
|
||||
haggis_linkmap *map, haggis_mq *mq) {
|
||||
haggis_message_body body;
|
||||
haggis_msg *msg;
|
||||
char *target;
|
||||
|
@ -589,19 +586,15 @@ int haggis_init_dev_node(
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
haggis_device_init(st->st_rdev, &node->filetype.dev);
|
||||
haggis_device_init(&node->filetype.dev, st->st_rdev);
|
||||
body.f_name = strndup(node->name.name, PATH_MAX);
|
||||
msg = haggis_msg_init(NodeCreated, body);
|
||||
haggis_mq_push(mq, msg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
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, haggis_mq *mq) {
|
||||
u16 mode;
|
||||
char *target;
|
||||
char pathbuf[PATH_MAX];
|
||||
|
@ -613,7 +606,8 @@ haggis_node* haggis_create_node(
|
|||
struct stat st;
|
||||
|
||||
node = calloc(1, sizeof(haggis_node));
|
||||
if (node == NULL) return NULL;
|
||||
if (node == NULL)
|
||||
return NULL;
|
||||
if (lstat(file, &st) != 0) {
|
||||
free(node);
|
||||
return NULL;
|
||||
|
@ -904,7 +898,8 @@ int haggis_extract_node(haggis_node *self, char *basedir, haggis_mq *mq) {
|
|||
} else {
|
||||
ret = -1;
|
||||
msg = calloc(1, sizeof(haggis_msg));
|
||||
if (msg == NULL) return 2;
|
||||
if (msg == NULL)
|
||||
return 2;
|
||||
msg->tag = DevNodeSkipped;
|
||||
msg->body.f_name = strndup(self->name.name, PATH_MAX);
|
||||
haggis_mq_push(mq, msg);
|
||||
|
@ -931,7 +926,8 @@ int haggis_extract_node(haggis_node *self, char *basedir, haggis_mq *mq) {
|
|||
case eof:
|
||||
return 0;
|
||||
}
|
||||
if (ret) return ret;
|
||||
if (ret)
|
||||
return ret;
|
||||
if (geteuid() == 0) {
|
||||
ret = chown(path, (uid_t)self->uid.val, (gid_t)self->gid.val);
|
||||
if (ret != 0) {
|
||||
|
@ -941,7 +937,8 @@ int haggis_extract_node(haggis_node *self, char *basedir, haggis_mq *mq) {
|
|||
}
|
||||
if (self->filetype.tag != softlink)
|
||||
ret = chmod(path, (mode_t)self->mode.val);
|
||||
if (ret) return ret;
|
||||
if (ret)
|
||||
return ret;
|
||||
msg = calloc(1, sizeof(haggis_msg));
|
||||
if (msg == NULL)
|
||||
return 2;
|
||||
|
@ -984,12 +981,17 @@ int haggis_load_node(haggis_node *self, FILE *stream) {
|
|||
int haggis_store_node(haggis_node *self, FILE *stream) {
|
||||
u16 mode;
|
||||
|
||||
if (haggis_store_filename(stream, &self->name) != (size_t)(self->name.len.val) + 2)
|
||||
if (haggis_store_filename(stream, &self->name) !=
|
||||
(size_t)(self->name.len.val) + 2)
|
||||
return 2;
|
||||
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;
|
||||
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;
|
||||
if (store_u16(stream, &mode) != 2)
|
||||
return 2;
|
||||
return haggis_store_filetype(stream, &self->filetype);
|
||||
}
|
||||
|
|
|
@ -45,11 +45,11 @@
|
|||
|
||||
int haggis_store_header (FILE *stream);
|
||||
int haggis_check_header (FILE *stream);
|
||||
void haggis_device_init (dev_t rdev, haggis_device *dev);
|
||||
void haggis_device_init (haggis_device *self, dev_t rdev);
|
||||
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 haggis_load_device (haggis_device *self, FILE *stream);
|
||||
int haggis_store_cksum (haggis_checksum *self, FILE *stream);
|
||||
int haggis_load_cksum (haggis_checksum *self, FILE *stream);
|
||||
int validate_md5 (haggis_file *file);
|
||||
int validate_sha1 (haggis_file *file);
|
||||
int validate_sha256 (haggis_file *file);
|
||||
|
|
|
@ -8,7 +8,7 @@ int main() {
|
|||
int ret;
|
||||
|
||||
f = fopen("output/device", "r");
|
||||
ret = haggis_load_device(f, &dev);
|
||||
ret = haggis_load_device(&dev, f);
|
||||
fclose(f);
|
||||
if (ret) return ret;
|
||||
assert(dev.major.val == 42);
|
||||
|
|
|
@ -10,7 +10,7 @@ int main() {
|
|||
int i, ret;
|
||||
|
||||
f = fopen("output/md5", "r");
|
||||
if (haggis_load_cksum(f, &cksum)) return 1;
|
||||
if (haggis_load_cksum(&cksum, f)) return 1;
|
||||
assert(cksum.tag == md5);
|
||||
for (i = 0; i < 16; i++) {
|
||||
assert(cksum.md5[i] == (uint8_t)i);
|
||||
|
|
|
@ -10,7 +10,7 @@ int main() {
|
|||
int i, ret;
|
||||
|
||||
f = fopen("output/sha1", "r");
|
||||
if (haggis_load_cksum(f, &cksum)) return 1;
|
||||
if (haggis_load_cksum(&cksum, f)) return 1;
|
||||
assert(cksum.tag == sha1);
|
||||
for (i = 0; i < 20; i++) {
|
||||
assert(cksum.sha1[i] == (uint8_t)i);
|
||||
|
|
|
@ -10,7 +10,7 @@ int main() {
|
|||
int i, ret;
|
||||
|
||||
f = fopen("output/sha256", "r");
|
||||
if (haggis_load_cksum(f, &cksum)) return 1;
|
||||
if (haggis_load_cksum(&cksum, f)) return 1;
|
||||
assert(cksum.tag == sha256);
|
||||
for (i = 0; i < 32; i++) {
|
||||
assert(cksum.sha256[i] == (uint8_t)i);
|
||||
|
|
|
@ -13,7 +13,7 @@ int main() {
|
|||
cksum.md5[i] = (uint8_t)i;
|
||||
}
|
||||
f = fopen("output/md5", "w");
|
||||
ret = haggis_store_cksum(f, &cksum);
|
||||
ret = haggis_store_cksum(&cksum, f);
|
||||
fclose(f);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ int main() {
|
|||
cksum.md5[i] = (uint8_t)i;
|
||||
}
|
||||
f = fopen("output/sha1", "w");
|
||||
ret = haggis_store_cksum(f, &cksum);
|
||||
ret = haggis_store_cksum(&cksum, f);
|
||||
fclose(f);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ int main() {
|
|||
cksum.sha256[i] = (uint8_t)i;
|
||||
}
|
||||
f = fopen("output/sha256", "w");
|
||||
ret = haggis_store_cksum(f, &cksum);
|
||||
ret = haggis_store_cksum(&cksum, f);
|
||||
fclose(f);
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue