From bd6686fd88eeace9a80da974ee80571d97a8b18c Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Mon, 7 Aug 2023 23:37:47 -0400 Subject: [PATCH] Changed `haggis_node` struct to include sub-structures rather than pointers --- include/bytes.h | 5 +- include/haggis.h | 14 +-- include/jobq.h | 2 +- src/haggis.c | 131 +++++++++++------------------ {src/test => test}/Makefile | 0 src/test/test.c => test/checksum.c | 0 test/device.c | 0 test/filename.c | 0 test/haggis_private.h | 64 ++++++++++++++ 9 files changed, 124 insertions(+), 92 deletions(-) rename {src/test => test}/Makefile (100%) rename src/test/test.c => test/checksum.c (100%) create mode 100644 test/device.c create mode 100644 test/filename.c create mode 100644 test/haggis_private.h diff --git a/include/bytes.h b/include/bytes.h index 70d1d51..31911e8 100644 --- a/include/bytes.h +++ b/include/bytes.h @@ -31,10 +31,9 @@ */ #ifndef BYTES_H -#define BYTES_H +#define BYTES_H 1 -#include -#include +#include // FILE #include "haggis.h" diff --git a/include/haggis.h b/include/haggis.h index 1972463..87722e8 100644 --- a/include/haggis.h +++ b/include/haggis.h @@ -31,7 +31,7 @@ */ #ifndef HAGGIS_H -#define HAGGIS_H +#define HAGGIS_H 1 #include "linklist.h" #include // uint_t @@ -74,12 +74,12 @@ typedef union { typedef struct { haggis_algorithm tag; - haggis_sum *sum; + haggis_sum sum; } haggis_checksum; typedef struct { u64 len; - haggis_checksum *cksum; + haggis_checksum cksum; u8 *data; } haggis_file; @@ -100,9 +100,9 @@ typedef enum { } haggis_typeflag; typedef union { - haggis_file *file; - haggis_filename *target; - haggis_device *dev; + haggis_file file; + haggis_filename target; + haggis_device dev; } haggis_ft; typedef struct { @@ -119,6 +119,8 @@ typedef struct { haggis_filetype *filetype; } haggis_node; +haggis_node* haggis_node_init(); +void haggis_node_deinit(haggis_node *node); haggis_node* haggis_create_node(char *file, haggis_hardlink_list *list); int haggis_extract_node(FILE *stram, haggis_node *node); int haggis_load_node(FILE *stream, haggis_node *node); diff --git a/include/jobq.h b/include/jobq.h index 79aff62..a70980d 100644 --- a/include/jobq.h +++ b/include/jobq.h @@ -31,7 +31,7 @@ */ #ifndef JOBQ_H -#define JOBQ_H +#define JOBQ_H 1 #include diff --git a/src/haggis.c b/src/haggis.c index 80400bc..ea519e6 100644 --- a/src/haggis.c +++ b/src/haggis.c @@ -75,13 +75,9 @@ int haggis_check_header(FILE *stream) { return 1; } -haggis_device* haggis_device_init(dev_t rdev) { - haggis_device *dev; - dev = malloc(sizeof(haggis_device)); - if (dev == NULL) return NULL; +void haggis_device_init(dev_t rdev, haggis_device *dev) { dev->major.val = (uint32_t)major(rdev); dev->minor.val = (uint32_t)minor(rdev); - return dev; } void haggis_device_deinit(haggis_device *dev) { @@ -97,9 +93,9 @@ int haggis_store_device(FILE *stream, haggis_device *dev) { } int haggis_load_device(FILE *stream, haggis_ft *ft) { - if (fread(ft->dev->major.bytes, 1, 4, stream) != 4) + if (fread(ft->dev.major.bytes, 1, 4, stream) != 4) return 1; - if (fread(ft->dev->minor.bytes, 1, 4, stream) != 4) + if (fread(ft->dev.minor.bytes, 1, 4, stream) != 4) return 1; return 0; } @@ -112,21 +108,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->sum.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->sum.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->sum.sha256, 1, 32, stream) != 32) return 1; break; case skip: @@ -146,17 +142,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->sum.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->sum.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->sum.sha256, 1, 32, stream) != 32) return 1; break; case skip: @@ -173,7 +169,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.sum.md5, digest, sizeof(digest))) return 2; return 0; } @@ -186,7 +182,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.sum.sha1, digest, sizeof(digest))) return 2; return 0; } @@ -198,7 +194,7 @@ int validate_sha1(haggis_file *file) { SHA1Init(&ctx); SHA1Update(&ctx, file->data, (size_t)file->len.val); SHA1Final(digest, &ctx); - if (memcmp(file->cksum->sum->sha1, digest, sizeof(digest))) + if (memcmp(file->cksum.sum.sha1, digest, sizeof(digest))) return 2; return 0; } @@ -212,7 +208,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.sum.sha256, digest, sizeof(digest))) return 2; return 0; } @@ -224,14 +220,14 @@ int validate_sha256(haggis_file *file) { SHA256Init(&ctx); SHA256Update(&ctx, file->data, (size_t)file->len.val); SHA256Final(digest, &ctx); - if (memcmp(file->cksum->sum->sha256, digest, sizeof(digest))) + if (memcmp(file->cksum.sum.sha256, digest, sizeof(digest))) return 2; return 0; } #endif /* if defined (__FreeBSD__) */ int haggis_validate_cksum(haggis_file *file) { - switch (file->cksum->tag) { + switch (file->cksum.tag) { case md5: return validate_md5(file); case sha1: @@ -275,10 +271,14 @@ haggis_file* haggis_file_init(char *path) { return hf; } +void haggis_file_deinit(haggis_file *f) { + 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(stream, &file->cksum) != 0) return 1; int res = fwrite(file->data, 1, (size_t)file->len.val, stream); if (res != (size_t)file->len.val) @@ -287,49 +287,36 @@ int haggis_store_file(FILE *stream, haggis_file *file) { } int haggis_load_file(FILE *stream, haggis_ft *ft) { - u64 len; - len.val = 0; - - if (load_u64(stream, len) != 8) + if (load_u64(stream, ft->file.len) != 8) return 1; - ft->file->len = len; - if (haggis_load_cksum(stream, ft->file->cksum) != 0) + if (haggis_load_cksum(stream, &ft->file.cksum) != 0) return 1; - u8 *data = malloc((size_t)len.val); - if (data == NULL) + ft->file.data = malloc((size_t)ft->file.len.val); + if (ft->file.data == NULL) return -1; - int res = fread(data, 1, (size_t)ft->file->len.val, stream); - if (res != (size_t)ft->file->len.val) { + int res = fread(ft->file.data, 1, (size_t)ft->file.len.val, stream); + if (res != (size_t)ft->file.len.val) { free(ft); return 1; } - ft->file->data = data; - if (haggis_validate_cksum(ft->file)) { + if (haggis_validate_cksum(&ft->file)) { free(ft); return 1; } return 0; } -haggis_filename* haggis_filename_init(char *target) { +haggis_filename* haggis_filename_init(char *target, haggis_filename *fname) { size_t len; - haggis_filename *fname; len = strlen(target) - 1; - fname = malloc(sizeof(haggis_filename)); - if (fname == NULL) { - free(target); - return NULL; - } fname->len.val = (uint16_t)len; fname->name = target; return fname; } void haggis_filename_deinit(haggis_filename *fname) { - if (fname->name != NULL) - free(fname->name); - free(fname); + if (fname->name != NULL) free(fname->name); } int haggis_load_filename(FILE *stream, haggis_filename *n) { @@ -362,10 +349,10 @@ int haggis_load_filetype(FILE *stream, haggis_typeflag tag, haggis_filetype *fil file->tag = 0; return haggis_load_file(stream, file->f_type); case hardlink: - return haggis_load_filename(stream, file->f_type->target); + return haggis_load_filename(stream, &file->f_type->target); file->tag = 1; case softlink: - return haggis_load_filename(stream, file->f_type->target); + return haggis_load_filename(stream, &file->f_type->target); file->tag = 2; case directory: file->tag = 3; @@ -394,19 +381,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->f_type->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->f_type->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->f_type->target); case directory: flag = 3; if (fwrite(&flag, 1, 1, stream) != 1) @@ -416,14 +403,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(stream, &filetype->f_type->dev) != 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(stream, &filetype->f_type->dev) != 0) return 1; break; case fifo: @@ -454,25 +441,21 @@ u16 haggis_derive_mode(u16 raw, haggis_filetype *ft) { void haggis_node_deinit(haggis_node *node) { if (node == NULL) return; - if (node->name != NULL) free(node->name); + if (node->name != NULL) haggis_filename_deinit(node->name); switch (node->filetype->tag) { case normal: - if (node->filetype->f_type->file != NULL) { - free(node->filetype->f_type->file); + if (node->filetype->f_type->file.data != NULL) { + free(node->filetype->f_type->file.data); } break; case hardlink: case softlink: - if (node->filetype->f_type->target != NULL) { - haggis_filename_deinit(node->filetype->f_type->target); + if (node->filetype->f_type->target.name != NULL) { + haggis_filename_deinit(&node->filetype->f_type->target); } break; case character: case block: - if (node->filetype->f_type->dev != NULL) { - haggis_device_deinit(node->filetype->f_type->dev); - } - break; case directory: case fifo: case eof: @@ -491,7 +474,6 @@ haggis_node* haggis_create_node(char *file, haggis_hardlink_list *list) { char *target; char pathbuf[PATH_MAX]; haggis_filename *fname; - haggis_device *dev; haggis_file *f; haggis_node *node; @@ -541,53 +523,39 @@ haggis_node* haggis_create_node(char *file, haggis_hardlink_list *list) { } } else { node->filetype->tag = hardlink; - fname = haggis_filename_init(target); + fname = haggis_filename_init(target, &node->filetype->f_type->target); if (fname == NULL) { haggis_node_deinit(node); return NULL; } - node->filetype->f_type->target = fname; } break; case block: target = haggis_linklist_get_or_put(list, st->st_ino, file); if (target == NULL) { node->filetype->tag = block; - dev = haggis_device_init(st->st_rdev); - if (dev == NULL) { - haggis_node_deinit(node); - return NULL; - } - node->filetype->f_type->dev = dev; + haggis_device_init(st->st_rdev, &node->filetype->f_type->dev); } else { node->filetype->tag = hardlink; - fname = haggis_filename_init(target); + fname = haggis_filename_init(target, &node->filetype->f_type->target); if (fname == NULL) { haggis_node_deinit(node); return NULL; } - node->filetype->f_type->target = fname; } break; case character: target = haggis_linklist_get_or_put(list, st->st_ino, file); if (target == NULL) { node->filetype->tag = character; - dev = haggis_device_init(st->st_rdev); - if (dev == NULL) { - haggis_node_deinit(node); - return NULL; - } - node->filetype->f_type->dev = dev; + haggis_device_init(st->st_rdev, &node->filetype->f_type->dev); } else { node->filetype->tag = hardlink; - fname = haggis_filename_init(target); + fname = haggis_filename_init(target, &node->filetype->f_type->target); if (fname == NULL) { haggis_node_deinit(node); return NULL; } - fname->name = target; - node->filetype->f_type->target = fname; } break; case fifo: @@ -596,13 +564,12 @@ haggis_node* haggis_create_node(char *file, haggis_hardlink_list *list) { node->filetype->tag = fifo; } else { node->filetype->tag = hardlink; - fname = haggis_filename_init(target); + fname = haggis_filename_init(target, &node->filetype->f_type->target); if (fname == NULL) { haggis_node_deinit(node); return NULL; } fname->name = target; - node->filetype->f_type->target = fname; } break; case directory: @@ -620,8 +587,8 @@ haggis_node* haggis_create_node(char *file, haggis_hardlink_list *list) { } target = malloc(res + 1); memcpy(target, pathbuf, (unsigned long)res); - node->filetype->f_type->target = haggis_filename_init(target); - if (node->filetype->f_type->target == NULL) { + fname = haggis_filename_init(target, &node->filetype->f_type->target); + if (fname == NULL) { haggis_node_deinit(node); return NULL; } diff --git a/src/test/Makefile b/test/Makefile similarity index 100% rename from src/test/Makefile rename to test/Makefile diff --git a/src/test/test.c b/test/checksum.c similarity index 100% rename from src/test/test.c rename to test/checksum.c diff --git a/test/device.c b/test/device.c new file mode 100644 index 0000000..e69de29 diff --git a/test/filename.c b/test/filename.c new file mode 100644 index 0000000..e69de29 diff --git a/test/haggis_private.h b/test/haggis_private.h new file mode 100644 index 0000000..872d65c --- /dev/null +++ b/test/haggis_private.h @@ -0,0 +1,64 @@ +/* _,.---._ .-._ .--.-. ,--.--------. + * _,..---._ ,-.' , - `. /==/ \ .-._/==/ //==/, - , -\ + * /==/, - \ /==/_, , - \|==|, \/ /, |==\ -\\==\.-. - ,-./ + * |==| _ _\==| .=. |==|- \| | \==\- \`--`\==\- \ + * |==| .=. |==|_ : ;=: - |==| , | -| `--`-' \==\_ \ + * |==|,| | -|==| , '=' |==| - _ | |==|- | + * |==| '=' /\==\ - ,_ /|==| /\ , | |==|, | + * |==|-, _`/ '.='. - .' /==/, | |- | /==/ -/ + * `-.`.____.' `--`--'' `--`./ `--` `--`--` + * _ __ ,---. .-._ .=-.-. _,.----. + * .-`.' ,`..--.' \ /==/ \ .-._ /==/_ /.' .' - \ + * /==/, - \==\-/\ \ |==|, \/ /, /==|, |/==/ , ,-' + * |==| _ .=. /==/-|_\ | |==|- \| ||==| ||==|- | . + * |==| , '=',\==\, - \ |==| , | -||==|- ||==|_ `-' \ + * |==|- '..'/==/ - ,| |==| - _ ||==| ,||==| _ , | + * |==|, | /==/- /\ - \|==| /\ , ||==|- |\==\. / + * /==/ - | \==\ _.\=\.-'/==/, | |- |/==/. / `-.`.___.-' + * `--`---' `--` `--`./ `--``--`-` + * + * @(#)Copyright (c) 2023, Nathan D. Fisher. + * + * This is free software. It comes with NO WARRANTY. + * Permission to use, modify and distribute this source code + * is granted subject to the following conditions. + * 1/ that the above copyright notice and this notice + * are preserved in all copies and that due credit be given + * to the author. + * 2/ that any changes to this code are clearly commented + * as such so that the author does not get blamed for bugs + * other than his own. +*/ + +#ifndef HAGGIS_PRIVATE_H +#define HAGGIS_PRIVATE_H 1 + +#include + +#include + +#include "haggis.h" + +int haggis_store_header(FILE *stream); +int haggis_check_header(FILE *stream); +haggis_device* haggis_device_init(dev_t rdev); +void haggis_device_deinit(haggis_device *dev); +int haggis_store_device(FILE *stream, haggis_device *dev); +int haggis_load_device(FILE *stream, haggis_ft *ft); +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); +haggis_file* haggis_file_init(char *path); +int haggis_store_file(FILE *stream, haggis_file *file); +int haggis_load_file(FILE *stream, haggis_ft *ft); +haggis_filename* haggis_filename_init(char *target); +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); + +#endif // !HAGGIS_PRIVATE_H