Finish haggis_store_node along with adjustments to dependent functions

This commit is contained in:
Nathan Fisher 2023-07-29 18:39:07 -04:00
parent 46d0892b77
commit b0fa9d1953

View file

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