On Thu, 29 Nov 2018 09:38:31 +0100
Olivier Taïbi <[email protected]> wrote:

> 2) remove the check
>     if (job_pid == getpgid(job_pid))
>  from vim's mch_signal_job() in src/os_unix.c so that the whole group
>  always gets a signal.

Thank you for finding the failing getpgid().  I suggest to remove the
check, like in the below diff.  The process group id should equal the
process id after vim called setsid(2) or setpgid(2).  I had helped to
remove a similar getpgid() call from meson:
https://github.com/mesonbuild/meson/commit/64906b0

I haven't used vim recently, but I tried to test the below diff with

:let j = job_start('sh -c "dd if=/dev/zero | cat | dd of=/dev/zero"')
:echo j
:let r = job_stop(j)

job_stop stopped the sh, dd, and cat processes.  If I did kill -9 the
sh before job_stop, then job_stop still stopped dd and cat.

I also tried `make test` in /usr/ports/editors/vim, but it fails
because my terminal is smaller than 80x24.  After I grow my terminal,
it fails with:

> make: don't know how to make writevimcmd (prerequisite of: test_arabic.res)

The documentation where it says, "The job will use the same terminal
as Vim.", is still wrong.  Someone want to report a bug to vim?

Index: patches/patch-src_os_unix_c
===================================================================
RCS file: patches/patch-src_os_unix_c
diff -N patches/patch-src_os_unix_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_os_unix_c 29 Nov 2018 22:01:09 -0000
@@ -0,0 +1,22 @@
+$OpenBSD$
+
+Don't call getpgid().  It fails with EPERM in OpenBSD because setsid()
+had put job_pid in a different session.  Go ahead and kill the process
+group that setsid() created.
+
+Index: src/os_unix.c
+--- src/os_unix.c.orig
++++ src/os_unix.c
+@@ -5871,11 +5871,7 @@ mch_signal_job(job_T *job, char_u *how)
+       return FAIL;
+ 
+     /* TODO: have an option to only kill the process, not the group? */
+-    job_pid = job->jv_pid;
+-#ifdef HAVE_GETPGID
+-    if (job_pid == getpgid(job_pid))
+-      job_pid = -job_pid;
+-#endif
++    job_pid = -job->jv_pid;
+ 
+     /* Never kill ourselves! */
+     if (job_pid != 0)

-- 
George Koehler <[email protected]>

Reply via email to