/*
- * 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:
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;
}
}
textColors[ColorNone].fg = textColors[ColorNone].bg = -1;
textColors[ColorNone].attr = 0;
+ SetTextColor(cnames, textColors[ColorNormal].fg - 30, textColors[ColorNormal].bg - 40, -2); // kludge to announce background color to front-end
}
static Boolean noEcho;
char buf[MSG_SIZ];
int count, outCount, error;
+ SetTextColor(cnames, textColors[(int)cc].fg - 30, textColors[(int)cc].bg - 40, textColors[(int)cc].attr); // for GTK widget
+
if (textColors[(int)cc].bg > 0) {
if (textColors[(int)cc].fg > 0) {
snprintf(buf, MSG_SIZ, "\033[0;%d;%d;%dm", textColors[(int)cc].attr,
}
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);
}
// [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;
}
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);
}
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;
return -1;
}
+Boolean stdoutClosed = FALSE;
+
int
OutputToProcess (ProcRef pr, char *message, int count, int *outError)
{
static int line = 0;
ChildProc *cp = (ChildProc *) pr;
- int outCount;
+ int outCount = count;
if (pr == NoProc)
{
- if (appData.noJoin || !appData.useInternalWrap)
- outCount = fwrite(message, 1, count, stdout);
- else
+ if (appData.noJoin || !appData.useInternalWrap) {
+ if(!stdoutClosed) outCount = fwrite(message, 1, count, stdout);
+ } else
{
int width = get_term_width();
int len = wrap(NULL, message, count, width, &line);
free(msg);
}
}
+ if(*message != '\033') ConsoleWrite(message, count);
}
else
outCount = write(cp->fdTo, message, count);
return outCount;
}
-void
+int
ICSInitScript ()
{
/* try to open the icsLogon script, either in the location given
}
}
- 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
{
update_ics_width();
}
-
-