Finish haggis_store_node
along with adjustments to dependent functions
This commit is contained in:
parent
46d0892b77
commit
b0fa9d1953
1 changed files with 61 additions and 69 deletions
130
src/haggis.c
130
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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue