diff options
author | Ian C <ianc@noddybox.co.uk> | 2011-06-09 13:46:28 +0000 |
---|---|---|
committer | Ian C <ianc@noddybox.co.uk> | 2011-06-09 13:46:28 +0000 |
commit | a9022b5972dc49d86f617a27940fafe9c4d0e7e7 (patch) | |
tree | 61405aa4ade91ed1057f863ddf118ceb38e14f8e /djgpp/runcmd.c |
Initial import of (very old) vidoom sources.
Diffstat (limited to 'djgpp/runcmd.c')
-rw-r--r-- | djgpp/runcmd.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/djgpp/runcmd.c b/djgpp/runcmd.c new file mode 100644 index 0000000..2148806 --- /dev/null +++ b/djgpp/runcmd.c @@ -0,0 +1,143 @@ +/* + + viDOOM - level editor for DOOM + + Copyright (C) 2000 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------- + + Command execution interface + +*/ +static const char rcs_id[]="$Id$"; + +#include "config.h" +#include "mem.h" + +#include <unistd.h> +#include <string.h> +#include <stdio.h> +#include <fcntl.h> +#include <errno.h> +#include <process.h> + +#define MAX_ARGS 128 + +static void CopyArgs(char *argv[],char *new[]) +{ + char *na; + char *p; + int len; + int f; + + len=0; + f=0; + while(argv[f]) + len+=strlen(argv[f++])+1; + + len++; + + na=Grab(len); + + f=0; + while(argv[f]) + { + strcat(na,argv[f++]); + strcat(na," "); + } + + f=0; + p=strtok(na," \t"); + + while((f<MAX_ARGS-1)&&(p)) + { + new[f++]=Strdup(p); + p=strtok(NULL," \t"); + } + + new[f]=NULL; + + Release(na); +} + + +static void Write(int fd, char *p) +{ + write(fd,p,strlen(p)); +} + + +int RunCommand(char *argv[], char *path) +{ + static int old_stdout=-1; + static int old_stderr=-1; + int ret; + int f; + int fd; + char *new[MAX_ARGS]; + + if (old_stdout==-1) + if ((old_stdout=dup(STDOUT_FILENO))==-1) + return(FALSE); + + if (old_stderr==-1) + if ((old_stderr=dup(STDERR_FILENO))==-1) + return(FALSE); + + tmpnam(path); + + if ((fd=open(path,O_WRONLY|O_CREAT|O_TRUNC,0666))==-1) + return(FALSE); + + CopyArgs(argv,new); + + if (!new[0]) + { + close(fd); + return(FALSE); + } + + dup2(fd,STDOUT_FILENO); + dup2(fd,STDERR_FILENO); + + ret=spawnvp(P_WAIT,new[0],new); + + f=0; + while(new[f]) + Release(new[f++]); + + if (ret==-1) + { + Write(fd,"Exec failed:\n"); + Write(fd,sys_errlist[errno]); + Write(fd,"\n"); + } + + dup2(old_stdout,STDOUT_FILENO); + dup2(old_stderr,STDERR_FILENO); + close(fd); + + if (ret==-1) + return(FALSE); + + /* Assume that non-zero is error + */ + return(ret==0); +} + + +/* END OF FILE */ |