commit ddec3259aad6b92727a4f82501b98a491176ac3b
parent 7be94fd3c825a0aa8f6cef97240bdae7eec3f47d
Author: sin <sin@2f30.org>
Date: Wed, 21 Aug 2013 12:56:26 +0100
Add setsid(1) by arg
Diffstat:
3 files changed, 50 insertions(+), 0 deletions(-)
diff --git 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
@@ -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
@@ -0,0 +1,42 @@
+/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details. */
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#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;
+}