diff options
| author | Kacper Fiedorowicz <kf@efab.pl> | 2026-01-03 18:44:51 +0100 |
|---|---|---|
| committer | Kacper Fiedorowicz <kf@efab.pl> | 2026-01-03 18:44:51 +0100 |
| commit | 6018e17637264a9561b37be699c3d53b6661de23 (patch) | |
| tree | 8546c9fa94358e7d6daaad5f11ac53e61be97ad5 /bin/nohup/nohup.c | |
| parent | ab21f339a33abb1144f3c0f5c4285324e7e88392 (diff) | |
Diffstat (limited to 'bin/nohup/nohup.c')
| -rw-r--r-- | bin/nohup/nohup.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/bin/nohup/nohup.c b/bin/nohup/nohup.c new file mode 100644 index 00000000..8a6171eb --- /dev/null +++ b/bin/nohup/nohup.c @@ -0,0 +1,47 @@ +#include <errno.h> +#include <fcntl.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +int main(int argc, char **argv) +{ + int fildes; + + if (argc < 2) { + write(STDOUT_FILENO, "nohup utility [argument...]\n", 29); + return 1; + } + + if (signal(SIGHUP, SIG_IGN) == SIG_ERR) { + perror("nohup: signal"); + return 1; + } + + if (isatty(STDOUT_FILENO)) { + fildes = open("nohup.out", O_WRONLY | O_APPEND | O_CREAT); + if (fildes < 0) { + perror("nohup: open"); + return 1; + } + + if (dup2(fildes, STDOUT_FILENO) < 0) { + perror("nohup: dup2"); + return 1; + } + + close(fildes); + } + + if (isatty(STDERR_FILENO)) { + if (dup2(STDOUT_FILENO, STDERR_FILENO) < 0) { + perror("nohup: dup2"); + return 1; + } + } + + execvp(argv[0], argv); + perror("nohup: execvp"); + return 127 + (errno == ENOENT); +} |
