~ chicken-core (chicken-5) 82f0b107ba32f64355a816c206d2a450282d6fa1
commit 82f0b107ba32f64355a816c206d2a450282d6fa1 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Apr 3 18:00:43 2017 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Apr 3 18:00:43 2017 +0200 first attempt to port chicken-do to windows diff --git a/chicken-do.c b/chicken-do.c index 7f242c7b..0adf99a4 100644 --- a/chicken-do.c +++ b/chicken-do.c @@ -28,23 +28,107 @@ #include "chicken.h" -#include <sys/stat.h> + +#ifndef WIN32 #include <errno.h> +#include <sys/stat.h> +#include <sys/wait.h> +#endif + + +static char *target; -void usage(int code) +static void usage(int code) { fputs("usage: chicken-do [-q] [-h] TARGET COMMAND ... : DEPENDENCIES ...\n", stderr); exit(code); } -int execute(char **argv) +static void cleanup() +{ +#ifdef WIN32 + DeleteFile(target); +#else + unlink(target); +#endif +} + + +static int execute(char **argv) { - execvp(argv[ 0 ], argv); - /* returns only in case of error */ - perror("executing command failed"); - exit(1); +#ifdef WIN32 + static PROCESS_INFORMATION process_info; + static STARTUPINFO startup_info; + startup_info.cb = sizeof(STARTUPINFO); + static TCHAR cmdline[ MAX_PATH ]; + + while(*argv != NULL) { + strcat(cmdline, "\""); + strcat(cmdline, *(argv++)); + strcat(cmdline, "\""); + } + + if(!CreateProcess(NULL, cmdline, NULL, NULL, TRUE, + NORMAL_PRIORITY_CLASS, NULL, NULL, &startup_info, + &process_info)) { + fprintf(stderr, "creating subprocess failed\n"); + exit(1); + } + + CloseHandle(process_info.hThread); + + WaitForSingleObject(process_info.hProcess, INIFNITE); + DWORD code; + + if(!GetExitCodeProcess(process_info.hProcess, &code)) { + fprintf(stderr, "unable to obtain exit status of subprocess\n"); + exit(1); + } + + exit(code); +#else + pid_t child = fork(); + + if(child == -1) { + perror("forking subprocess failed"); + exit(1); + } + + if(child == 0) { + execvp(argv[ 0 ], argv); + /* returns only in case of error */ + perror("executing command failed"); + cleanup(); + exit(1); + } + + for(;;) { + int status; + pid_t w = waitpid(child, &status, 0); + + if(w == -1) { + perror("waiting for subprocess failed"); + cleanup(); + exit(1); + } + + if(WIFEXITED(status)) { + int s = WEXITSTATUS(status); + + if(s != 0) cleanup(); + + exit(s); + } + + if(WIFSIGNALED(status)) { + fprintf(stderr, "subprocess killed by signal %d\n", WTERMSIG(status)); + cleanup(); + exit(1); + } + } +#endif } @@ -52,7 +136,6 @@ int main(int argc, char *argv[]) { int i, count, a = 0; char **args = (char **)malloc(sizeof(char *) * argc); - char *target; struct stat st, sd; int quiet = 0, opts = 1;Trap