From b87d0c4a36c2cfb3d79b09838b88fcab1a8d07f3 Mon Sep 17 00:00:00 2001 From: verdant Date: Thu, 6 Aug 2026 14:52:03 +0800 Subject: Introduce error code system Refactor spawn function, use return error code, provide more clearly error handling. --- src/err.h | 13 ++++++++++++- src/process.c | 36 +++++++++++++++++++++++++++--------- src/utils.c | 10 +++++----- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/err.h b/src/err.h index 6bb4697..bb5ced5 100644 --- a/src/err.h +++ b/src/err.h @@ -1,8 +1,19 @@ #ifndef SS_ERR_H #define SS_ERR_H +#include #include -void die(const char* err, ...); +enum sf_error { + SF_OK = 0, + SF_ERR_INVALID_ARG = -1, + SF_ERR_INVALID_LEN = -2, + SF_ERR_EXEC_FAILED = -3, + SF_ERR_SIGNALED = -4, + SF_ERR_NOMEM = -ENOMEM, + SF_ERR_CANCEL = -1000, +}; + +void die(const char *err, ...); #endif /* SS_ERR_H */ diff --git a/src/process.c b/src/process.c index 3dd93f0..e2fb6b3 100644 --- a/src/process.c +++ b/src/process.c @@ -1,6 +1,8 @@ #include "process.h" #include "err.h" #include "log.h" +#include +#include #include #include @@ -8,21 +10,37 @@ int spawn(char **argv) { pid_t pid; + int status; if (!argv[0] || *argv[0] == '\0') { - log_write(LOG_ERR, "Invalid argv"); - return -1; + return SF_ERR_INVALID_ARG; } if ((pid = fork()) < 0) { - log_write(LOG_ERR, "fork error"); - } else if (pid == 0) { - if (execvp(argv[0], argv) < 0) { - die("exec error"); + log_write(LOG_ERR, "fork error: %s", strerror(errno)); + return -errno; + } + + if (pid == 0) { + execvp(argv[0], argv); + + _exit(errno == ENONET ? 127 : 126); + } + + if (waitpid(pid, &status, 0) < 0) { + return -errno; + } + + if (WIFEXITED(status)) { + int exit_code = WEXITSTATUS(status); + if (exit_code != 0) { + log_write(LOG_ERR, "Command failed with code %d", + exit_code); + return SF_ERR_EXEC_FAILED; } - } else { - wait(NULL); + } else if (WIFSIGNALED(status)) { + return SF_ERR_SIGNALED; } - return 0; + return SF_OK; } diff --git a/src/utils.c b/src/utils.c index ef6734a..c00c3f9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -8,7 +8,7 @@ int get_input(const char *prompt, char *buf, size_t len) { if (!prompt || !buf) - return -1; + return SF_ERR_INVALID_ARG; int ch; curs_set(1); @@ -27,14 +27,14 @@ get_input(const char *prompt, char *buf, size_t len) } else if (ch == 27) { werase(status_window->win); curs_set(0); - return -1; + return SF_ERR_CANCEL; } else if (ch == KEY_ENTER || ch == '\n' || ch == '\r') { if (len < PATH_MAX) { buf[++len] = '\0'; curs_set(0); - return 0; + return SF_OK; } else { - return -1; + return SF_ERR_INVALID_LEN; } } else { continue; @@ -46,7 +46,7 @@ get_input(const char *prompt, char *buf, size_t len) curs_set(0); - return 0; + return SF_OK; } bool -- cgit v1.2.3