aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/err.h13
-rw-r--r--src/process.c36
-rw-r--r--src/utils.c10
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 <errno.h>
#include <stdarg.h>
-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 <errno.h>
+#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
@@ -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