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;
|
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) {
|
int haggis_load_filename(FILE *stream, haggis_filename *n) {
|
||||||
u16 len;
|
u16 len;
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -380,16 +316,69 @@ int haggis_load_filetype(FILE *stream, haggis_typeflag tag, haggis_filetype *fil
|
||||||
return 0;
|
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) {
|
haggis_typeflag haggis_filetype_from_mode(u16 mode) {
|
||||||
u8 mask = 07 << 5;
|
u8 mask = 07 << 5;
|
||||||
int filetype = (int)((mode.bytes[0] & mask) >> 5);
|
int filetype = (int)((mode.bytes[0] & mask) >> 5);
|
||||||
return filetype;
|
return filetype;
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 haggis_combine_mode(u16 raw, haggis_ft ft) {
|
u16 haggis_derive_mode(u16 raw, haggis_filetype *ft) {
|
||||||
u16 mode;
|
u16 mode;
|
||||||
mode.val = 0;
|
mode.val = ((uint16_t)ft->tag << 5) & raw.val;
|
||||||
//todo
|
|
||||||
return mode;
|
return mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -437,11 +426,14 @@ int haggis_load_node(FILE *stream, haggis_node *node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int haggis_store_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)
|
if (haggis_store_filename(stream, node->name) != (size_t)(node->name->len.val) + 2)
|
||||||
return 2;
|
return 2;
|
||||||
if (store_u32(stream, node->uid) != 4) return 2;
|
if (store_u32(stream, node->uid) != 4) return 2;
|
||||||
if (store_u32(stream, node->gid) != 4) return 2;
|
if (store_u32(stream, node->gid) != 4) return 2;
|
||||||
if (store_u64(stream, node->mtime) != 8) return 2;
|
if (store_u64(stream, node->mtime) != 8) return 2;
|
||||||
// todo
|
mode = haggis_derive_mode(node->mode, node->filetype);
|
||||||
return 0;
|
if (store_u16(stream, mode) != 2) return 2;
|
||||||
|
return haggis_store_filetype(stream, node->filetype);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue