Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Better modularization of the tesh source code
[simgrid.git] / tools / tesh / signal.c
diff --git a/tools/tesh/signal.c b/tools/tesh/signal.c
new file mode 100644 (file)
index 0000000..b70ce5b
--- /dev/null
@@ -0,0 +1,66 @@
+/* $Id$ */
+
+/* signal -- what TESH needs to know about signals                          */
+
+/* Copyright (c) 2007 Martin Quinson.                                       */
+/* All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "tesh.h"
+#include <signal.h>
+
+typedef struct s_signal_entry {
+  const char* name;
+  int number;
+} s_signal_entry_t,* signal_entry_t;
+
+static const s_signal_entry_t signals[] = {
+       {"SIGHUP"       ,SIGHUP},
+       {"SIGINT"       ,SIGINT},
+       {"SIGQUIT"      ,SIGQUIT},
+       {"SIGILL"       ,SIGILL},
+       {"SIGTRAP"      ,SIGTRAP},
+       {"SIGABRT"      ,SIGABRT},
+       {"SIGFPE"       ,SIGFPE},
+       {"SIGKILL"      ,SIGKILL},
+       {"SIGBUS"       ,SIGBUS},
+       {"SIGSEGV"      ,SIGSEGV},
+       {"SIGSYS"       ,SIGSYS},
+       {"SIGPIPE"      ,SIGPIPE},
+       {"SIGALRM"      ,SIGALRM},
+       {"SIGTERM"      ,SIGTERM},
+       {"SIGURG"       ,SIGURG},
+       {"SIGSTOP"      ,SIGSTOP},
+       {"SIGTSTP"      ,SIGTSTP},
+       {"SIGCONT"      ,SIGCONT},
+       {"SIGCHLD"      ,SIGCHLD},
+       {"SIGTTIN"      ,SIGTTIN},
+       {"SIGTTOU"      ,SIGTTOU},
+       {"SIGIO"        ,SIGIO},
+       {"SIGXCPU"      ,SIGXCPU},
+       {"SIGXFSZ"      ,SIGXFSZ},
+       {"SIGVTALRM"    ,SIGVTALRM},
+       {"SIGPROF"      ,SIGPROF},
+       {"SIGWINCH"     ,SIGWINCH},
+       {"SIGUSR1"      ,SIGUSR1},
+       {"SIGUSR2"      ,SIGUSR2},
+       {"SIG UNKNOWN"  ,-1}
+};
+
+
+const char* signal_name(unsigned int got, char *expected) {
+  int i;
+
+  /* Make SIGBUS a synonym for SIGSEGV
+     (segfault leads to any of them depending on the system) */
+  if((got == SIGBUS) && !strcmp("SIGSEGV",expected))
+    got = SIGSEGV;
+  
+  for (i=0; signals[i].number != -1; i++)
+    if (signals[i].number == got)
+      return (signals[i].name);
+
+  return "SIG UNKNOWN";  
+}