Skip to content

Commit 93a1bc6

Browse files
committed
2 parents 706af26 + f092076 commit 93a1bc6

33 files changed

+248
-0
lines changed

bash-completion/Makemodule.am

+3
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ endif
9999
if BUILD_SCRIPTLIVE
100100
dist_bashcompletion_DATA += bash-completion/scriptlive
101101
endif
102+
if BUILD_SETPGID
103+
dist_bashcompletion_DATA += bash-completion/setpgid
104+
endif
102105
if BUILD_SETSID
103106
dist_bashcompletion_DATA += bash-completion/setsid
104107
endif

bash-completion/setpgid

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
_setpgid_module()
2+
{
3+
local cur prev OPTS
4+
COMPREPLY=()
5+
cur="${COMP_WORDS[COMP_CWORD]}"
6+
prev="${COMP_WORDS[COMP_CWORD-1]}"
7+
case $prev in
8+
'-h'|'--help'|'-V'|'--version')
9+
return 0
10+
;;
11+
esac
12+
case $cur in
13+
-*)
14+
OPTS="--foreground --help --version"
15+
COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
16+
return 0
17+
;;
18+
esac
19+
compopt -o bashdefault
20+
COMPREPLY=( $(compgen -c -- $cur) )
21+
return 0
22+
}
23+
complete -F _setpgid_module setpgid

configure.ac

+3
Original file line numberDiff line numberDiff line change
@@ -2077,6 +2077,9 @@ UL_REQUIRES_BUILD([rfkill], [libsmartcols])
20772077
AM_CONDITIONAL([BUILD_RFKILL], [test "x$build_rfkill" = xyes])
20782078

20792079

2080+
UL_BUILD_INIT([setpgid], [yes])
2081+
AM_CONDITIONAL([BUILD_SETPGID], [test "x$build_setpgid" = xyes])
2082+
20802083
UL_BUILD_INIT([setsid], [yes])
20812084
AM_CONDITIONAL([BUILD_SETSID], [test "x$build_setsid" = xyes])
20822085

meson.build

+14
Original file line numberDiff line numberDiff line change
@@ -1371,6 +1371,20 @@ if not is_disabler(exe)
13711371
bashcompletions += ['renice']
13721372
endif
13731373

1374+
exe = executable(
1375+
'setpgid',
1376+
setpgid_sources,
1377+
include_directories: includes,
1378+
link_with : [lib_common,
1379+
lib_smartcols],
1380+
install_dir : usrbin_exec_dir,
1381+
install : true)
1382+
if opt and not is_disabler(exe)
1383+
exes += exe
1384+
manadocs += ['sys-utils/setpgid.1.adoc']
1385+
bashcompletions += ['setpgid']
1386+
endif
1387+
13741388
exe = executable(
13751389
'setsid',
13761390
setsid_sources,

sys-utils/Makemodule.am

+7
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@ rfkill_LDADD = $(LDADD) libcommon.la libsmartcols.la
113113
rfkill_CFLAGS = $(AM_CFLAGS) -I$(ul_libsmartcols_incdir)
114114
endif
115115

116+
if BUILD_SETPGID
117+
usrbin_exec_PROGRAMS += setpgid
118+
MANPAGES += sys-utils/setpgid.1
119+
dist_noinst_DATA += sys-utils/setpgid.1.adoc
120+
setpgid_SOURCES = sys-utils/setpgid.c
121+
endif
122+
116123
if BUILD_SETSID
117124
usrbin_exec_PROGRAMS += setsid
118125
MANPAGES += sys-utils/setsid.1

sys-utils/meson.build

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ renice_sources = files(
3636
'renice.c',
3737
)
3838

39+
setpgid_sources = files(
40+
'setpgid.c',
41+
)
42+
3943
setsid_sources = files(
4044
'setsid.c',
4145
)

sys-utils/setpgid.1.adoc

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//po4a: entry man manual
2+
// Daan De Meyer <[email protected]>
3+
// In the public domain.
4+
= setpgid(1)
5+
:doctype: manpage
6+
:man manual: User Commands
7+
:man source: util-linux {release-version}
8+
:page-layout: base
9+
:command: setpgid
10+
11+
== NAME
12+
13+
setpgid - run a program in a new process group
14+
15+
== SYNOPSIS
16+
17+
*setpgid* [options] _program_ [_arguments_]
18+
19+
== DESCRIPTION
20+
21+
*setpgid* runs a program in a new process group.
22+
23+
== OPTIONS
24+
25+
*-f*, *--foreground*::
26+
Make the new process group the foreground process group of the controlling
27+
terminal if there is a controlling terminal.
28+
29+
include::man-common/help-version.adoc[]
30+
31+
== AUTHORS
32+
33+
mailto:[email protected][Daan De Meyer]
34+
35+
== SEE ALSO
36+
37+
*setpgid*(2)
38+
39+
include::man-common/bugreports.adoc[]
40+
41+
include::man-common/footer.adoc[]
42+
43+
ifdef::translation[]
44+
include::man-common/translation.adoc[]
45+
endif::[]

sys-utils/setpgid.c

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* setpgid.c -- execute a command in a new process group
3+
* Daan De Meyer <[email protected]>
4+
* In the public domain.
5+
*/
6+
7+
#include <getopt.h>
8+
#include <stdio.h>
9+
#include <stdlib.h>
10+
#include <unistd.h>
11+
#include <signal.h>
12+
13+
#include "closestream.h"
14+
15+
static void __attribute__((__noreturn__)) usage(void)
16+
{
17+
FILE *out = stdout;
18+
fputs(USAGE_HEADER, out);
19+
fprintf(out, _(
20+
" %s [options] <program> [arguments ...]\n"),
21+
program_invocation_short_name);
22+
23+
fputs(USAGE_SEPARATOR, out);
24+
fputs(_("Run a program in a new process group.\n"), out);
25+
26+
fputs(USAGE_OPTIONS, out);
27+
fputs(_(" -f, --foregound Make a foreground process group\n"), out);
28+
29+
printf(USAGE_HELP_OPTIONS(16));
30+
31+
printf(USAGE_MAN_TAIL("setpgid(1)"));
32+
exit(EXIT_SUCCESS);
33+
}
34+
35+
int main(int argc, char **argv)
36+
{
37+
int ch, foreground = 0, fd;
38+
sigset_t s, old;
39+
40+
static const struct option longopts[] = {
41+
{"foreground", no_argument, NULL, 'f'},
42+
{"version", no_argument, NULL, 'V'},
43+
{"help", no_argument, NULL, 'h'},
44+
{NULL, 0, NULL, 0}
45+
};
46+
47+
setlocale(LC_ALL, "");
48+
bindtextdomain(PACKAGE, LOCALEDIR);
49+
textdomain(PACKAGE);
50+
close_stdout_atexit();
51+
52+
while ((ch = getopt_long(argc, argv, "+Vh", longopts, NULL)) != -1)
53+
switch (ch) {
54+
case 'f':
55+
foreground = 1;
56+
break;
57+
case 'h':
58+
usage();
59+
case 'V':
60+
print_version(EXIT_SUCCESS);
61+
default:
62+
errtryhelp(EXIT_FAILURE);
63+
}
64+
65+
if (argc - optind < 1) {
66+
warnx(_("no command specified"));
67+
errtryhelp(EXIT_FAILURE);
68+
}
69+
70+
if (setpgid(0, 0) < 0)
71+
err(EXIT_FAILURE, _("setpgid failed"));
72+
73+
if (foreground) {
74+
fd = open("/dev/tty", O_RDONLY|O_CLOEXEC);
75+
if (fd >= 0) {
76+
if (sigemptyset(&s) < 0)
77+
err(EXIT_FAILURE, _("sigemptyset failed"));
78+
if (sigaddset(&s, SIGTTOU) < 0)
79+
err(EXIT_FAILURE, _("sigaddset failed"));
80+
if (sigprocmask(SIG_BLOCK, &s, &old) < 0)
81+
err(EXIT_FAILURE, _("sigprocmask failed"));
82+
if (tcsetpgrp(fd, getpgid(0)) < 0)
83+
err(EXIT_FAILURE, _("tcsetpgrp failed"));
84+
if (sigprocmask(SIG_SETMASK, &old, NULL) < 0)
85+
err(EXIT_FAILURE, _("sigprocmask failed"));
86+
}
87+
}
88+
89+
execvp(argv[optind], argv + optind);
90+
errexec(argv[optind]);
91+
}

tests/commands.sh

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ TS_CMD_SCRIPT=${TS_CMD_SCRIPT-"${ts_commandsdir}script"}
108108
TS_CMD_SCRIPTREPLAY=${TS_CMD_SCRIPTREPLAY-"${ts_commandsdir}scriptreplay"}
109109
TS_CMD_SCRIPTLIVE=${TS_CMD_SCRIPTLIVE-"${ts_commandsdir}scriptlive"}
110110
TS_CMD_SETARCH=${TS_CMD_SETARCH-"${ts_commandsdir}setarch"}
111+
TS_CMD_SETPGID=${TS_CMD_SETPGID-"${ts_commandsdir}setpgid"}
111112
TS_CMD_SETSID=${TS_CMD_SETSID-"${ts_commandsdir}setsid"}
112113
TS_CMD_SWAPLABEL=${TS_CMD_SWAPLABEL:-"${ts_commandsdir}swaplabel"}
113114
TS_CMD_SWAPOFF=${TS_CMD_SWAPOFF:-"${ts_commandsdir}swapoff"}

tests/expected/build-sys/config-all

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ scriptlive:
110110
scriptreplay:
111111
setarch:
112112
setpriv: libcap-ng
113+
setpgid:
113114
setsid:
114115
setterm: libtinfo
115116
su: libpam libpam_misc

tests/expected/build-sys/config-all-devel

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ readprofile:
8989
renice:
9090
rtcwake:
9191
setarch:
92+
setpgid:
9293
setsid:
9394
switch_root:
9495
tunelp:

tests/expected/build-sys/config-all-non-nls

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ scriptlive:
110110
scriptreplay:
111111
setarch:
112112
setpriv: libcap-ng
113+
setpgid:
113114
setsid:
114115
setterm: libtinfo
115116
su: libpam libpam_misc

tests/expected/build-sys/config-audit

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ scriptlive:
106106
scriptreplay:
107107
setarch:
108108
setpriv: libcap-ng
109+
setpgid:
109110
setsid:
110111
setterm: libtinfo
111112
su: libpam libpam_misc

tests/expected/build-sys/config-chfnsh-libuser

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ scriptlive:
106106
scriptreplay:
107107
setarch:
108108
setpriv: libcap-ng
109+
setpgid:
109110
setsid:
110111
setterm: libtinfo
111112
su: libpam libpam_misc

tests/expected/build-sys/config-chfnsh-no-password

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ scriptlive:
106106
scriptreplay:
107107
setarch:
108108
setpriv: libcap-ng
109+
setpgid:
109110
setsid:
110111
setterm: libtinfo
111112
su: libpam libpam_misc

tests/expected/build-sys/config-chfnsh-pam

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ scriptlive:
106106
scriptreplay:
107107
setarch:
108108
setpriv: libcap-ng
109+
setpgid:
109110
setsid:
110111
setterm: libtinfo
111112
su: libpam libpam_misc

tests/expected/build-sys/config-core

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ scriptlive:
106106
scriptreplay:
107107
setarch:
108108
setpriv: libcap-ng
109+
setpgid:
109110
setsid:
110111
setterm: libtinfo
111112
su: libpam libpam_misc

tests/expected/build-sys/config-cryptsetup

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ scriptlive:
110110
scriptreplay:
111111
setarch:
112112
setpriv: libcap-ng
113+
setpgid:
113114
setsid:
114115
setterm: libtinfo
115116
su: libpam libpam_misc

tests/expected/build-sys/config-devel

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ scriptlive:
110110
scriptreplay:
111111
setarch:
112112
setpriv: libcap-ng
113+
setpgid:
113114
setsid:
114115
setterm: libtinfo
115116
su: libpam libpam_misc

tests/expected/build-sys/config-devel-new-mount

+1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ readprofile:
9494
renice:
9595
rtcwake:
9696
setarch:
97+
setpgid:
9798
setsid:
9899
switch_root:
99100
tunelp:

tests/expected/build-sys/config-devel-non-asan

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ scriptlive:
110110
scriptreplay:
111111
setarch:
112112
setpriv: libcap-ng
113+
setpgid:
113114
setsid:
114115
setterm: libtinfo
115116
su: libpam libpam_misc

tests/expected/build-sys/config-devel-non-docs

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ scriptlive:
110110
scriptreplay:
111111
setarch:
112112
setpriv: libcap-ng
113+
setpgid:
113114
setsid:
114115
setterm: libtinfo
115116
su: libpam libpam_misc

tests/expected/build-sys/config-non-libblkid

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ scriptlive:
8383
scriptreplay:
8484
setarch:
8585
setpriv: libcap-ng
86+
setpgid:
8687
setsid:
8788
setterm: libtinfo
8889
su: libpam libpam_misc

tests/expected/build-sys/config-non-libmount

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ scriptlive:
9292
scriptreplay:
9393
setarch:
9494
setpriv: libcap-ng
95+
setpgid:
9596
setsid:
9697
setterm: libtinfo
9798
su: libpam libpam_misc

tests/expected/build-sys/config-non-libs

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ scriptlive:
6060
scriptreplay:
6161
setarch:
6262
setpriv: libcap-ng
63+
setpgid:
6364
setsid:
6465
setterm: libtinfo
6566
su: libpam libpam_misc

tests/expected/build-sys/config-non-libsmartcols

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ scriptlive:
7676
scriptreplay:
7777
setarch:
7878
setpriv: libcap-ng
79+
setpgid:
7980
setsid:
8081
setterm: libtinfo
8182
su: libpam libpam_misc

tests/expected/build-sys/config-non-libuuid

+1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ scriptlive:
9898
scriptreplay:
9999
setarch:
100100
setpriv: libcap-ng
101+
setpgid:
101102
setsid:
102103
setterm: libtinfo
103104
su: libpam libpam_misc

tests/expected/build-sys/config-non-nls

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ scriptlive:
106106
scriptreplay:
107107
setarch:
108108
setpriv: libcap-ng
109+
setpgid:
109110
setsid:
110111
setterm: libtinfo
111112
su: libpam libpam_misc

tests/expected/build-sys/config-selinux

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ scriptlive:
106106
scriptreplay:
107107
setarch:
108108
setpriv: libcap-ng
109+
setpgid:
109110
setsid:
110111
setterm: libtinfo
111112
su: libpam libpam_misc

0 commit comments

Comments
 (0)