diff --git a/Makefile b/Makefile index 99829d4..6112ddd 100644 --- a/Makefile +++ b/Makefile @@ -68,6 +68,7 @@ SRC = \ rm.c \ rmdir.c \ sleep.c \ + setsid.c \ sort.c \ split.c \ sponge.c \ diff --git a/setsid.1 b/setsid.1 new file mode 100644 index 0000000..3c65051 --- /dev/null +++ b/setsid.1 @@ -0,0 +1,7 @@ +.TH SETSID 1 sbase\-VERSION +.SH NAME +setsid \- run a program in a new session +.SH SYNOPSIS +.B setsid +.RI program +.RI [ arg ...] diff --git a/setsid.c b/setsid.c new file mode 100644 index 0000000..796f8d7 --- /dev/null +++ b/setsid.c @@ -0,0 +1,42 @@ +/* (C)opyright MMVI Anselm R. Garbe + * See LICENSE file for license details. */ +#include +#include +#include +#include +#include "util.h" + +static void +usage(void) +{ + eprintf("usage: %s cmd [arg ...]\n", argv0); +} + +int +main(int argc, char *argv[]) +{ + ARGBEGIN { + default: + usage(); + } ARGEND; + + if (argc < 1) + usage(); + + if(getpgrp() == getpid()) { + switch(fork()){ + case -1: + eprintf("fork:"); + case 0: + break; + default: + exit(0); + } + } + if(setsid() < 0) + eprintf("setsid:"); + execvp(argv[0], argv); + eprintf("execvp:"); + /* NOTREACHED */ + return 0; +}