summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver Kiddle <opk@zsh.org>2023-12-05 18:49:42 +0100
committerOliver Kiddle <opk@zsh.org>2023-12-05 18:51:33 +0100
commit618f842b464c090f4a6fb02a9f4d217be9270466 (patch)
treeed63dcb213881275b0d8d300b1c5df385d0c6d0a
parent0394b7cf1787f1fdeedf3e7fa1ad0ba976bdc862 (diff)
downloadzsh-618f842b464c090f4a6fb02a9f4d217be9270466.tar.gz
zsh-618f842b464c090f4a6fb02a9f4d217be9270466.zip
52326, 52372: add -q option to kill for sigqueue
-rw-r--r--ChangeLog3
-rw-r--r--Completion/Zsh/Command/_kill1
-rw-r--r--Doc/Zsh/builtins.yo5
-rw-r--r--Src/jobs.c36
-rw-r--r--configure.ac1
5 files changed, 43 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index aa995e0d2..cd3cd4e84 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2023-12-05 Oliver Kiddle <opk@zsh.org>
+ * 52326, 52372: configure.ac, Src/jobs.c, Doc/Zsh/builtins.yo,
+ Completion/Zsh/Command/_kill: add -q option to kill for sigqueue
+
* 52373: Completion/Base/Utility/_numbers,
Completion/Solaris/Command/_dumpadm, Completion/Unix/Command/_xz:
fix _numbers for suffixes containing % and update affected functions
diff --git a/Completion/Zsh/Command/_kill b/Completion/Zsh/Command/_kill
index b9dfde3f0..084cf42c8 100644
--- a/Completion/Zsh/Command/_kill
+++ b/Completion/Zsh/Command/_kill
@@ -5,6 +5,7 @@ typeset -A opt_args
_arguments -C \
'(-s -l 1)-n[specify signal number]:signal number' \
+ '(-l)-q[send the specified integer with the signal using sigqueue]:value' \
'(-n -l 1)-s[specify signal name]:signal:_signals -s' \
'(-n -s)-l[list signal names or numbers of specified signals]:*:signal:_signals' \
'(-n -s -l)1::signal:_signals -p -s' \
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index cab265a25..1aa807633 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -1143,7 +1143,7 @@ findex(kill)
cindex(killing jobs)
cindex(jobs, killing)
xitem(tt(kill) [ tt(-s) var(signal_name) | tt(-n) var(signal_number) | \
-tt(-)var(sig) ] var(job) ...)
+tt(-)var(sig) ] [ tt(-q) var(value) ] var(job) ...)
item(tt(kill) tt(-l) [ var(sig) ... ])(
Sends either tt(SIGTERM) or the specified signal to the given
jobs or processes.
@@ -1170,6 +1170,9 @@ tt(kill -IO) and tt(kill -POLL) have the same effect.
Many systems will allow process IDs to be negative to kill a process
group or zero to kill the current process group.
+
+The tt(-q) option allows an integer value to be sent with the signal
+on systems that support tt(sigqueue+LPAR()RPAR()).
)
findex(let)
item(tt(let) var(arg) ...)(
diff --git a/Src/jobs.c b/Src/jobs.c
index a3b9f667a..4e9767ee4 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -2677,9 +2677,35 @@ bin_kill(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func))
{
int sig = SIGTERM;
int returnval = 0;
+#ifdef HAVE_SIGQUEUE
+ union sigval sigqueue_info;
+#endif
+ int use_sigqueue = 0, got_sig = 0;
+
+ while (*argv && **argv == '-') {
+ if (!use_sigqueue && (*argv)[1] == 'q' && (*argv)[2] == '\0') {
+ char *endp;
+
+ if (!*++argv) {
+ zwarnnam(nam, "-q: argument expected");
+ return 1;
+ }
+#ifdef HAVE_SIGQUEUE
+ sigqueue_info.sival_int =
+#endif
+ zstrtol(*argv, &endp, 10);
+ if (*endp) {
+ zwarnnam(nam, "invalid number: %s", *argv);
+ return 1;
+ }
+ use_sigqueue = 1;
+ argv++;
+ continue;
+ }
+ if (got_sig)
+ break;
/* check for, and interpret, a signal specifier */
- if (*argv && **argv == '-') {
if (idigit((*argv)[1])) {
char *endp;
/* signal specified by number */
@@ -2796,6 +2822,7 @@ bin_kill(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func))
}
}
argv++;
+ got_sig = 1;
}
/* Discard the standard "-" and "--" option breaks */
@@ -2844,7 +2871,12 @@ bin_kill(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func))
returnval++;
} else {
int pid = atoi(*argv);
- if (kill(pid, sig) == -1) {
+ if (
+#ifdef HAVE_SIGQUEUE
+ use_sigqueue ? sigqueue(pid, sig, sigqueue_info) :
+#endif
+ kill(pid, sig) == -1)
+ {
zwarnnam("kill", "kill %s failed: %e", *argv, errno);
returnval++;
}
diff --git a/configure.ac b/configure.ac
index c5263035e..9cb6e032b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1299,6 +1299,7 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \
mkfifo _mktemp mkstemp \
waitpid wait3 \
sigaction sigblock sighold sigrelse sigsetmask sigprocmask \
+ sigqueue \
killpg setpgid setpgrp tcsetpgrp tcgetattr nice \
gethostname gethostbyname2 getipnodebyname \
inet_aton inet_pton inet_ntop \