Overhaul kill code
[xboard.git] / usystem.c
index a24d04f..6ac238c 100644 (file)
--- a/usystem.c
+++ b/usystem.c
@@ -1,11 +1,11 @@
 /*
- * usystem.c -- X-free, but Unix-like code for XBoard front end 
+ * usystem.c -- X-free, but Unix-like code for XBoard front end
  *
  * Copyright 1991 by Digital Equipment Corporation, Maynard,
  * Massachusetts.
  *
  * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,
- * 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+ * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
  *
  * The following terms apply to Digital Equipment Corporation's copyright
  * interest in XBoard:
@@ -170,6 +170,8 @@ extern char *getenv();
 # define N_(s)  s
 #endif
 
+static int get_term_width P(());
+
 static char *cnames[9] = { "black", "red", "green", "yellow", "blue",
                             "magenta", "cyan", "white" };
 TextColors textColors[(int)NColorClasses];
@@ -225,7 +227,7 @@ static int
 parse_cpair (ColorClass cc, char *str)
 {
     if ((textColors[(int)cc].fg=parse_color(str, 0)) == -2) {
-       fprintf(stderr, _("%s: can't parse foreground color in `%s'\n"),
+       fprintf(stderr, _("%s: can't parse foreground color in '%s'\n"),
                programName, str);
        return -1;
     }
@@ -356,6 +358,9 @@ ExpandPathName (char *path)
     }
 
     if (*s == '~') {
+       if(s[1] == '~') { // use ~~ for XBoard's private data directory
+         snprintf(d, 4*MSG_SIZ, DATADIR "%s", s+2);
+       } else
        if (*(s+1) == '/') {
          safeStrCpy(d, getpwuid(getuid())->pw_dir, 4*MSG_SIZ );
          strcat(d, s+1);
@@ -492,9 +497,12 @@ StartChildProcess (char *cmdLine, char *dir, ProcRef *pr)
 }
 
 // [HGM] kill: implement the 'hard killing' of AS's Winboard_x
+static int pid;
+
 static RETSIGTYPE
 AlarmCallBack (int n)
 {
+    kill(pid, SIGKILL); // kill forcefully
     return;
 }
 
@@ -505,22 +513,17 @@ DestroyChildProcess (ProcRef pr, int signalType)
 
     if (cp->kind != CPReal) return;
     cp->kind = CPNone;
-    if (signalType == 10) { // [HGM] kill: if it does not terminate in 3 sec, kill
-       signal(SIGALRM, AlarmCallBack);
-       alarm(3);
-       if(wait((int *) 0) == -1) { // process does not terminate on its own accord
-           kill(cp->pid, SIGKILL); // kill it forcefully
-           wait((int *) 0);        // and wait again
-       }
-    } else {
-       if (signalType) {
-           kill(cp->pid, signalType == 9 ? SIGKILL : SIGTERM); // [HGM] kill: use hard kill if so requested
-       }
-       /* Process is exiting either because of the kill or because of
-          a quit command sent by the backend; either way, wait for it to die.
-       */
-       wait((int *) 0);
+    if (signalType & 1) {
+           kill(cp->pid, signalType == 9 ? SIGKILL : SIGTERM); // [HGM] kill: for 9 hard-kill immediately
     }
+    signal(SIGALRM, AlarmCallBack);
+    pid = cp->pid;
+    if(signalType & 4) alarm(1 + appData.delayAfterQuit); // [HGM] kill: schedule hard kill if so requested
+    /* Process is exiting either because of the kill or because of
+       a quit command sent by the backend; either way, wait for it to die.
+    */
+    wait((int *) 0);
+    alarm(0); // cancel alarm if still pending
     close(cp->fdFrom);
     close(cp->fdTo);
 }
@@ -570,7 +573,7 @@ OpenTCP (char *host, char *port, ProcRef *pr)
              host, port, gai_strerror(error));
       return ENOENT;
     }
-     
+
     for (ai = ais; ai != NULL; ai = ai->ai_next) {
       if ((s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {
        error = errno;
@@ -710,7 +713,7 @@ OutputToProcessDelayed (ProcRef pr, char *message, int count, int *outError, lon
     return outCount;
 }
 
-void
+int
 ICSInitScript ()
 {
   /* try to open the icsLogon script, either in the location given
@@ -734,12 +737,13 @@ ICSInitScript ()
        }
     }
 
-  if (f != NULL)
+  if (f != NULL) {
     ProcessICSInitScript(f);
-  else
+    return TRUE;
+  } else
     printf("Warning: Couldn't open icsLogon file (checked %s and %s).\n", appData.icsLogon, buf);
 
-  return;
+  return FALSE;
 }
 
 void
@@ -751,7 +755,7 @@ ResetFrontEnd ()
 }
 
 #include <sys/ioctl.h>
-int
+static int
 get_term_width ()
 {
     int fd, default_width;
@@ -787,5 +791,3 @@ NotifyFrontendLogin ()
 {
     update_ics_width();
 }
-
-