1 /* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB. If not,
16 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA. */
20 #include <sys/types.h>
23 #include <hurd/port.h>
24 #include <hurd/signal.h>
27 /* Send a `sig_post' RPC to process number PID. If PID is zero,
28 send the message to all processes in the current process's process group.
29 If PID is < -1, send SIG to all processes in process group - PID.
30 SIG and REFPORT are passed along in the request message. */
32 _hurd_sig_post (pid_t pid
, int sig
, mach_port_t arg_refport
)
34 int delivered
= 0; /* Set when we deliver any signal. */
37 struct hurd_userlink ulink
;
39 inline void kill_pid (pid_t pid
) /* Kill one PID. */
41 err
= HURD_MSGPORT_RPC (__proc_getmsgport (proc
, pid
, &msgport
),
42 (refport
= arg_refport
, 0), 0,
43 /* If no message port we cannot send signals. */
44 msgport
== MACH_PORT_NULL
? EPERM
:
45 __msg_sig_post (msgport
, sig
, 0, refport
));
50 proc
= _hurd_port_get (&_hurd_ports
[INIT_PORT_PROC
], &ulink
);
54 /* Send SIG to each process in pgrp (- PID). */
55 mach_msg_type_number_t npids
= 10, i
;
56 pid_t pidsbuf
[10], *pids
= pidsbuf
;
58 err
= __proc_getpgrppids (proc
, - pid
, &pids
, &npids
);
62 for (i
= 0; i
< npids
; ++i
)
63 if (pids
[i
] == _hurd_pid
)
64 /* We must do ourselves last so we are not suspended
65 and fail to suspend the other processes in the pgrp. */
71 /* The process died already. Ignore it. */
75 __vm_deallocate (__mach_task_self (),
76 (vm_address_t
) pids
, npids
* sizeof (pids
[0]));
85 _hurd_port_free (&_hurd_ports
[INIT_PORT_PROC
], &ulink
, proc
);
87 /* If we delivered no signals, but ERR is clear, this must mean that
88 every kill_pid call failed with ESRCH, meaning all the processes in
89 the pgrp died between proc_getpgrppids and kill_pid; in that case we
91 return delivered
? 0 : err
?: ESRCH
;
93 weak_alias (_hurd_sig_post
, hurd_sig_post
)