about summary refs log tree commit diff
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.tar.xz
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 \