X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=usystem.c;h=572b910d091a384d7a55bd9dc24d478a36cefc2c;hb=95244a1c40718e9ad8bda9e2df66677e180354d6;hp=92234806ab6bfc85c7153d708bd93388cedccdf3;hpb=247b78e04059c63bb74ad0cc3bb81f93e0636b95;p=xboard.git diff --git a/usystem.c b/usystem.c index 9223480..572b910 100644 --- a/usystem.c +++ b/usystem.c @@ -5,7 +5,8 @@ * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, - * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. + * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free + * Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: @@ -266,22 +267,6 @@ ParseIcsTextColors () SetTextColor(cnames, textColors[ColorNormal].fg - 30, textColors[ColorNormal].bg - 40, -2); // kludge to announce background color to front-end } -static Boolean noEcho; - -void -EchoOn () -{ - system("stty echo"); - noEcho = False; -} - -void -EchoOff () -{ - system("stty -echo"); - noEcho = True; -} - char *oldICSInteractionTitle; void @@ -293,7 +278,7 @@ ShutDownFrontEnd () if (saveSettingsOnExit) SaveSettings(settingsFileName); unlink(gameCopyFilename); unlink(gamePasteFilename); - if(noEcho) EchoOn(); + EchoOn(); } void @@ -362,7 +347,7 @@ ExpandPathName (char *path) if (*s == '~') { if(s[1] == '~') { // use ~~ for XBoard's private data directory - snprintf(d, 4*MSG_SIZ, DATADIR "%s", s+2); + snprintf(d, 4*MSG_SIZ, "%s%s", dataDir, s+2); } else if (*(s+1) == '/') { safeStrCpy(d, getpwuid(getuid())->pw_dir, 4*MSG_SIZ ); @@ -531,6 +516,25 @@ DestroyChildProcess (ProcRef pr, int signalType) close(cp->fdTo); } +char * +BufferCommandOutput (char *command, int size) +{ + ChildProc *pr; + char *res = (char *) calloc(1, size); + if(res) { + int count; + FILE *f; + StartChildProcess(command, ".", (ProcRef) &pr); // run command in daughter process + f = fdopen(pr->fdFrom, "r"); + count = fread(res, 1, size-1, f); // read its output + fclose(f); + res[count > 0 ? count : 0] = NULLCHAR; + DestroyChildProcess((ProcRef) pr, 9); + free(pr); + } + return res; // return buffer with output +} + void InterruptChildProcess (ProcRef pr) { @@ -657,7 +661,7 @@ 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) {