Merge branch 'odin' of git.hitchhiker-linux.org:jeang3nie/seahag into odin

This commit is contained in:
Nathan Fisher 2024-02-11 01:14:31 -05:00
commit 1e5b903cff
2 changed files with 11 additions and 5 deletions

View file

@ -19,6 +19,10 @@ the `Destdir` pattern for ease of packaging.
There is a simple test harness which can be invoked via `make test`. If you wish There is a simple test harness which can be invoked via `make test`. If you wish
to port this software to an untested platform the tests will greatly assist in to port this software to an untested platform the tests will greatly assist in
that process. that process.
> Note: if your OS uses **dash** as `/bin/sh` then the builtin echo command will not
> be up to the task of printing the escape sequences used by the test runner. If this
> bothers you, you can call `make` with the `SHELL` environment variable overridden
> by calling `make SHELL=/bin/bash all test`.
## Contributing ## Contributing
Contributions are always welcome and can be made via pull request or `git send-email`, Contributions are always welcome and can be made via pull request or `git send-email`,

View file

@ -355,8 +355,6 @@ int haggis_load_file(FILE *stream, haggis_file *f) {
return -1; return -1;
int res = fread(f->data, 1, (size_t)f->len.val, stream); int res = fread(f->data, 1, (size_t)f->len.val, stream);
if (res != (size_t)f->len.val) { if (res != (size_t)f->len.val) {
fprintf(stderr, "Error reading file:\n length: %i\n expected: %lu\n",
res, f->len.val);
free(f->data); free(f->data);
return 1; return 1;
} }
@ -751,6 +749,8 @@ int haggis_extract_dev(haggis_node *node, char *basedir) {
} else if (node->filetype.tag == character) { } else if (node->filetype.tag == character) {
mode = (mode_t)node->mode.val | S_IFCHR; mode = (mode_t)node->mode.val | S_IFCHR;
} }
if (access(path, F_OK) == 0)
unlink(path);
ret = mknod(path, mode, dev); ret = mknod(path, mode, dev);
free(path); free(path);
return ret; return ret;
@ -782,6 +782,7 @@ int haggis_extract_fifo(haggis_node *node, char *basedir) {
int haggis_extract_symlink(haggis_node *node, char *basedir) { int haggis_extract_symlink(haggis_node *node, char *basedir) {
char *path, *target; char *path, *target;
int ret; int ret;
struct stat st;
assert(node->filetype.tag == softlink); assert(node->filetype.tag == softlink);
path = get_full_path(&node->name, basedir); path = get_full_path(&node->name, basedir);
@ -792,7 +793,7 @@ int haggis_extract_symlink(haggis_node *node, char *basedir) {
return 2; return 2;
} }
target = node->filetype.target.name; target = node->filetype.target.name;
if (access(path, F_OK) == 0) if (lstat(path, &st) == 0)
unlink(path); unlink(path);
ret = symlink(target, path); ret = symlink(target, path);
free(path); free(path);
@ -870,7 +871,7 @@ char* haggis_extract_file(haggis_node *node, char *basedir) {
free(path); free(path);
return NULL; return NULL;
} }
fd = fopen(path, "w"); fd = fopen(path, "w+");
if (fd == NULL) { if (fd == NULL) {
free(path); free(path);
return NULL; return NULL;
@ -938,6 +939,7 @@ int haggis_extract_node(haggis_node *self, char *basedir, haggis_mq *mq) {
return errno; return errno;
} }
} }
if (self->filetype.tag != softlink)
ret = chmod(path, (mode_t)self->mode.val); ret = chmod(path, (mode_t)self->mode.val);
if (ret) return ret; if (ret) return ret;
msg = calloc(1, sizeof(haggis_msg)); msg = calloc(1, sizeof(haggis_msg));