blob: 080b21083f162e2fefb7a768eece3a055a70cc6a [file] [log] [blame]
Connor Lane Smithf24772d2011-06-18 06:41:28 +01001/* See LICENSE file for copyright and license details. */
FRIGNb7c199e2015-03-05 00:57:14 +01002#include <sys/stat.h>
3
Connor Lane Smithf24772d2011-06-18 06:41:28 +01004#include <errno.h>
5#include <fcntl.h>
6#include <signal.h>
Connor Lane Smithf24772d2011-06-18 06:41:28 +01007#include <unistd.h>
FRIGNeee98ed2014-11-13 18:29:30 +01008
Connor Lane Smithf24772d2011-06-18 06:41:28 +01009#include "util.h"
10
Christoph Lohmann4d38f602013-06-14 20:20:47 +020011static void
12usage(void)
13{
FRIGN7b6d9182015-01-28 23:55:57 +010014 eprintf("usage: %s cmd [arg ...]\n", argv0);
Christoph Lohmann4d38f602013-06-14 20:20:47 +020015}
16
Connor Lane Smithf24772d2011-06-18 06:41:28 +010017int
18main(int argc, char *argv[])
19{
FRIGNa6ee96a2015-03-04 22:39:12 +010020 int fd, savederrno;
Connor Lane Smithf24772d2011-06-18 06:41:28 +010021
FRIGN9016d282015-04-24 23:54:17 +020022 argv0 = argv[0], argc--, argv++;
Christoph Lohmann4d38f602013-06-14 20:20:47 +020023
FRIGNa6ee96a2015-03-04 22:39:12 +010024 if (!argc)
Christoph Lohmann4d38f602013-06-14 20:20:47 +020025 usage();
Connor Lane Smithf24772d2011-06-18 06:41:28 +010026
FRIGNeee98ed2014-11-13 18:29:30 +010027 if (signal(SIGHUP, SIG_IGN) == SIG_ERR)
FRIGNa6ee96a2015-03-04 22:39:12 +010028 enprintf(127, "signal HUP:");
Christoph Lohmann4d38f602013-06-14 20:20:47 +020029
FRIGNeee98ed2014-11-13 18:29:30 +010030 if (isatty(STDOUT_FILENO)) {
FRIGNa6ee96a2015-03-04 22:39:12 +010031 if ((fd = open("nohup.out", O_APPEND | O_CREAT, S_IRUSR | S_IWUSR)) < 0)
32 enprintf(127, "open nohup.out:");
FRIGN14365182014-11-19 20:59:37 +010033 if (dup2(fd, STDOUT_FILENO) < 0)
FRIGNa6ee96a2015-03-04 22:39:12 +010034 enprintf(127, "dup2:");
Connor Lane Smithf24772d2011-06-18 06:41:28 +010035 close(fd);
36 }
FRIGNa6ee96a2015-03-04 22:39:12 +010037 if (isatty(STDERR_FILENO) && dup2(STDOUT_FILENO, STDERR_FILENO) < 0)
38 enprintf(127, "dup2:");
Connor Lane Smithf24772d2011-06-18 06:41:28 +010039
FRIGNa6ee96a2015-03-04 22:39:12 +010040 execvp(argv[0], argv);
41 savederrno = errno;
FRIGN6f207da2015-03-09 01:04:34 +010042 weprintf("execvp %s:", argv[0]);
FRIGNa6ee96a2015-03-04 22:39:12 +010043
FRIGN6f207da2015-03-09 01:04:34 +010044 _exit(126 + (savederrno == ENOENT));
Connor Lane Smithf24772d2011-06-18 06:41:28 +010045}
OSZAR »