From c33e76abbadb186568a8c3545cfaa9193972b6ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Fri, 27 Feb 1998 11:17:34 -0800
Subject: [PATCH] includes kill() for NT

Rev: src/signal_handler.c:1.33
---
 src/signal_handler.c | 69 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/src/signal_handler.c b/src/signal_handler.c
index 7e7261aee7..e3d3257965 100644
--- a/src/signal_handler.c
+++ b/src/signal_handler.c
@@ -94,6 +94,14 @@ struct sigdesc
  * All known signals
  */
 
+#ifdef __NT__
+
+#ifndef SIGKILL
+#define SIGKILL 9
+#endif
+
+#endif /* __NT__ */
+
 static struct sigdesc signal_desc []={
 #ifdef SIGHUP
   { SIGHUP, "SIGHUP" },
@@ -1215,6 +1223,67 @@ static void f_kill(INT32 args)
   pop_n_elems(args-1);
 }
 
+#else
+
+#ifdef __NT__
+void f_kill(INT32 args)
+{
+  HANDLE proc=INVALID_HANDLE_VALUE;
+
+  if(args < 2)
+    error("Too few arguments to kill().\n");
+
+  switch(sp[-args].type)
+  {
+  case T_INT:
+    proc=OpenProcess(PROCESS_TERMINATE,
+		     0,
+		     sp[-args].u.integer);
+    if(proc==INVALID_HANDLE_VALUE)
+    {
+      errno=EPERM;
+      pop_n_elems(args);
+      push_int(-1);
+      return;
+    }
+    break;
+
+  case T_OBJECT:
+  {
+    INT32 pid;
+    struct pid_status *p;
+    if((p=(struct pid_status *)get_storage(sp[-args].u.object,
+					  pid_status_program)))
+    {
+      proc=p->handle;
+      break;
+    }
+  }
+
+  default:
+    error("Bad argument 1 to kill().\n");
+  }
+    
+  if(sp[1-args].type != T_INT)
+    error("Bad argument 1 to kill().\n");
+
+  switch(sp[1-args].u.integer)
+  {
+    case SIGKILL:
+    {
+      int i=TerminateProcess(proc,0xff)?0:-1;
+      pop_n_elems(args);
+      push_int(i);
+      check_signals(0,0,0);
+      break;
+    }
+      
+    default:
+      error("Unknown signal %d\n",sp[1-args].u.integer);
+  }
+}
+#endif
+
 #endif
 
 
-- 
GitLab