From b0fa9d195327f9d79637eec1d17de1e4c7dda6a2 Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Sat, 29 Jul 2023 18:39:07 -0400 Subject: [PATCH] Finish `haggis_store_node` along with adjustments to dependent functions --- src/haggis.c | 130 ++++++++++++++++++++++++--------------------------- 1 file changed, 61 insertions(+), 69 deletions(-) diff --git a/src/haggis.c b/src/haggis.c index d9cbb18..db9296d 100644 --- a/src/haggis.c +++ b/src/haggis.c @@ -262,70 +262,6 @@ int haggis_load_file(FILE *stream, haggis_ft *ft) { return 0; } -int haggis_store_filetype(FILE *stream, haggis_filetype *filetype) { - size_t len; - u8 flag; - int res; - - switch (filetype->tag) { - case normal: - flag = 0; - if (fwrite(&flag, 1, 1, stream) != 1) - return 1; - 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; - len = (size_t)filetype->f_type->target->len.val; - res = fwrite(filetype->f_type->target->name, 1, len, stream); - if (res != (size_t)len) - return 1; - break; - case softlink: - flag = 2; - if (fwrite(&flag, 1, 1, stream) != 1) - return 1; - len = (size_t)filetype->f_type->target->len.val; - res = fwrite(filetype->f_type->target->name, 1, len, stream); - if (res != (size_t)len) - return 1; - break; - case directory: - flag = 3; - if (fwrite(&flag, 1, 1, stream) != 1) - return 1; - break; - case character: - flag = 4; - if (fwrite(&flag, 1, 1, stream) != 1) - return 1; - 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) - return 1; - break; - case fifo: - flag = 6; - if (fwrite(&flag, 1, 1, stream) != 1) - return 1; - break; - case eof: - flag = 7; - if (fwrite(&flag, 1, 1, stream) != 1) - return 1; - break; - }; - return 0; -} - int haggis_load_filename(FILE *stream, haggis_filename *n) { u16 len; char *name; @@ -380,16 +316,69 @@ int haggis_load_filetype(FILE *stream, haggis_typeflag tag, haggis_filetype *fil return 0; } +int haggis_store_filetype(FILE *stream, haggis_filetype *filetype) { + u8 flag; + + switch (filetype->tag) { + case normal: + flag = 0; + if (fwrite(&flag, 1, 1, stream) != 1) + return 1; + 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); + case softlink: + flag = 2; + if (fwrite(&flag, 1, 1, stream) != 1) + return 1; + return haggis_store_filename(stream, filetype->f_type->target); + case directory: + flag = 3; + if (fwrite(&flag, 1, 1, stream) != 1) + return 1; + break; + case character: + flag = 4; + if (fwrite(&flag, 1, 1, stream) != 1) + return 1; + 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) + return 1; + break; + case fifo: + flag = 6; + if (fwrite(&flag, 1, 1, stream) != 1) + return 1; + break; + case eof: + flag = 7; + if (fwrite(&flag, 1, 1, stream) != 1) + return 1; + break; + }; + return 0; +} + haggis_typeflag haggis_filetype_from_mode(u16 mode) { u8 mask = 07 << 5; int filetype = (int)((mode.bytes[0] & mask) >> 5); return filetype; } -u16 haggis_combine_mode(u16 raw, haggis_ft ft) { +u16 haggis_derive_mode(u16 raw, haggis_filetype *ft) { u16 mode; - mode.val = 0; - //todo + mode.val = ((uint16_t)ft->tag << 5) & raw.val; return mode; } @@ -437,11 +426,14 @@ int haggis_load_node(FILE *stream, haggis_node *node) { } int haggis_store_node(FILE *stream, haggis_node *node) { + u16 mode; + if (haggis_store_filename(stream, node->name) != (size_t)(node->name->len.val) + 2) return 2; if (store_u32(stream, node->uid) != 4) return 2; if (store_u32(stream, node->gid) != 4) return 2; if (store_u64(stream, node->mtime) != 8) return 2; - // todo - return 0; + mode = haggis_derive_mode(node->mode, node->filetype); + if (store_u16(stream, mode) != 2) return 2; + return haggis_store_filetype(stream, node->filetype); }