Changed haggis_node struct to include sub-structures rather than

pointers
This commit is contained in:
Nathan Fisher 2023-08-07 23:37:47 -04:00
parent 5d410cb7d3
commit bd6686fd88
9 changed files with 124 additions and 92 deletions

View file

@ -31,10 +31,9 @@
*/
#ifndef BYTES_H
#define BYTES_H
#define BYTES_H 1
#include <stdint.h>
#include <stdio.h>
#include <stdio.h> // FILE
#include "haggis.h"

View file

@ -31,7 +31,7 @@
*/
#ifndef HAGGIS_H
#define HAGGIS_H
#define HAGGIS_H 1
#include "linklist.h"
#include <stdint.h> // uint<x>_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);

View file

@ -31,7 +31,7 @@
*/
#ifndef JOBQ_H
#define JOBQ_H
#define JOBQ_H 1
#include <pthread.h>

View file

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

0
test/device.c Normal file
View file

0
test/filename.c Normal file
View file

64
test/haggis_private.h Normal file
View file

@ -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 <stdio.h>
#include <sys/types.h>
#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