aboutsummaryrefslogtreecommitdiffstats
path: root/portbash/pgrp.c
diff options
context:
space:
mode:
Diffstat (limited to 'portbash/pgrp.c')
-rw-r--r--portbash/pgrp.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/portbash/pgrp.c b/portbash/pgrp.c
new file mode 100644
index 0000000..5198dd6
--- /dev/null
+++ b/portbash/pgrp.c
@@ -0,0 +1,48 @@
+/*
+ * If this system has a BSD-style getpgrp() call which takes a pid
+ * as an argument, output a -DBSD_GETPGRP.
+ */
+#include <stdio.h>
+#include <sys/types.h>
+
+int pid;
+int pg1, pg2, pg3, pg4;
+int ng, np, s, child;
+
+main()
+{
+ pid = getpid();
+ pg1 = getpgrp(0);
+ pg2 = getpgrp();
+ pg3 = getpgrp(pid);
+ pg4 = getpgrp(1);
+
+ /*
+ * If all of these values are the same, it's pretty sure that
+ * we're on a system that ignores getpgrp's first argument.
+ */
+ if (pg2 == pg4 && pg1 == pg3 && pg2 == pg3)
+ exit(0);
+
+ child = fork();
+ if (child < 0)
+ exit(1);
+ else if (child == 0) {
+ np = getpid();
+ /*
+ * If this is Sys V, this will not work; pgrp will be
+ * set to np because setpgrp just changes a pgrp to be
+ * the same as the pid.
+ */
+ setpgrp(np, pg1);
+ ng = getpgrp(0); /* Same result for Sys V and BSD */
+ if (ng == pg1) {
+ printf("-DBSD_GETPGRP\n");
+ exit(0);
+ } else
+ exit(1);
+ } else {
+ wait(&s);
+ exit(s>>8);
+ }
+}