Continue refactor

This commit is contained in:
Nathan Fisher 2024-02-11 11:00:28 -05:00
parent 1e5b903cff
commit 4a2b0328f9
9 changed files with 783 additions and 781 deletions

138
haggis.c
View file

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

View file

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

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

View file

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

View file

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

View file

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

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}