Fix format to match expected output.
[kopensolaris-gnu/glibc.git] / hurd / hurdkill.c
index 6be6393..e633690 100644 (file)
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
 
 #include <errno.h>
 #include <sys/types.h>
@@ -39,10 +39,10 @@ _hurd_sig_post (pid_t pid, int sig, mach_port_t arg_refport)
   inline void kill_pid (pid_t pid) /* Kill one PID.  */
     {
       err = HURD_MSGPORT_RPC (__proc_getmsgport (proc, pid, &msgport),
-                             ((refport = arg_refport), 0),
+                             (refport = arg_refport, 0), 0,
                              /* If no message port we cannot send signals.  */
                              msgport == MACH_PORT_NULL ? EPERM :
-                             __sig_post (msgport, sig, refport));
+                             __msg_sig_post (msgport, sig, 0, refport));
       if (! err)
        delivered = 1;
     }
@@ -58,16 +58,25 @@ _hurd_sig_post (pid_t pid, int sig, mach_port_t arg_refport)
       err = __proc_getpgrppids (proc, - pid, &pids, &npids);
       if (!err)
        {
+         int self = 0;
          for (i = 0; i < npids; ++i)
-           {
-             kill_pid (pids[i]);
-             if (err == ESRCH)
-               /* The process died already.  Ignore it.  */
-               err = 0;
-           }
+           if (pids[i] == _hurd_pid)
+             /* We must do ourselves last so we are not suspended
+                and fail to suspend the other processes in the pgrp.  */
+             self = 1;
+           else
+             {
+               kill_pid (pids[i]);
+               if (err == ESRCH)
+                 /* The process died already.  Ignore it.  */
+                 err = 0;
+             }
          if (pids != pidsbuf)
            __vm_deallocate (__mach_task_self (),
                             (vm_address_t) pids, npids * sizeof (pids[0]));
+
+         if (self)
+           kill_pid (_hurd_pid);
        }
     }
   else
@@ -81,3 +90,4 @@ _hurd_sig_post (pid_t pid, int sig, mach_port_t arg_refport)
      fail with ESRCH.  */
   return delivered ? 0 : err ?: ESRCH;
 }
+weak_alias (_hurd_sig_post, hurd_sig_post)