aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2009-10-25 02:39:57 +0000
committerdos-reis <gdr@axiomatics.org>2009-10-25 02:39:57 +0000
commitbd7d826e17d7719188598a9149403d544d1c45bc (patch)
tree50ca970578d4560c976c6d9818adb07857775106 /src/lib
parent4a8c82c52e9cf88d925c1de807307b6ec8d26c9b (diff)
downloadopen-axiom-bd7d826e17d7719188598a9149403d544d1c45bc.tar.gz
* lib/cfuns-c.c (oa_spawn): New.
(oa_allocate_process_argv): Likewise.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/cfuns-c.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/lib/cfuns-c.c b/src/lib/cfuns-c.c
index 7562874a..60cb4e3a 100644
--- a/src/lib/cfuns-c.c
+++ b/src/lib/cfuns-c.c
@@ -716,3 +716,80 @@ oa_get_host_byteorder(void)
return oa_little_endian;
#endif
}
+
+
+OPENAXIOM_EXPORT void
+oa_allocate_process_argv(openaxiom_process* proc, int argc)
+{
+ proc->argc = argc;
+ proc->argv = (char**) malloc((1 + argc) * sizeof (char*));
+ proc->argv[argc] = NULL;
+}
+
+OPENAXIOM_EXPORT int
+oa_spawn(openaxiom_process* proc, openaxiom_spawn_flags flags)
+{
+#ifdef __WIN32__
+ cons char* path = NULL;
+ char* cmd_line = NULL;
+ int curpos = strlen(proc->argv[0]);
+ int cmd_line_length = curpos;
+ int i;
+ PROCESS_INFORMATION proc_info;
+ STARTUPINFO startup_info = { 0 };
+ DWORD status;
+
+ for (i = 0; i < proc->argc; ++i)
+ cmd_line_length += 1 + strlen(proc->argv[i]);
+
+ cmd_line = (char*) malloc(cmd_line_length + 1);
+ strcpy(cmd_line, proc->argv[0]);
+ for (i = 0; i < proc->argc; ++i) {
+ cmd_line[curpos++] = ' ';
+ strcpy(cmd_line + curpos, proc->argv[i]);
+ curpos += strlen(proc->argv[i]);
+ }
+ cmd_line[curpos] = '\0';
+
+ if (flags & openaxiom_spawn_search_path == 0)
+ path = proc->argv[0];
+
+ if(CreateProcess(/* lpApplicationName */ path,
+ /* lpCommandLine */ cmd_line,
+ /* lpProcessAttributes */ NULL,
+ /* lpThreadAttributes */ NULL,
+ /* bInheritHandles */ TRUE,
+ /* dwCreationFlags */ 0,
+ /* lpEnvironment */ NULL,
+ /* lpCurrentDirectory */ NULL,
+ /* lpstartupInfo */ &startup_info,
+ /* lpProcessInformation */ &proc_info) == 0) {
+ fprintf(stderr, "oa_spawn: error %d\n", GetLastError());
+ return proc->id = -1;
+ }
+ proc->id = proc_info.dwProcessId;
+ if (flags & openaxiom_spawn_replace == 0)
+ return proc->id;
+ WaitForSingleObject(proc_info.hProcess, INFINITE);
+ GetExitCodeProcess(proc_info.hProcess, &status);
+ CloseHandle(proc_info.hThread);
+ CloseHandle(proc_info.hProcess);
+ return 0;
+
+#else
+ proc->id = 0;
+ if ((flags & openaxiom_spawn_replace) == 0)
+ proc->id = fork();
+ if (proc->id == 0) {
+ if (flags & openaxiom_spawn_search_path)
+ execvp(proc->argv[0], proc->argv);
+ else
+ execv(proc->argv[0], proc->argv);
+ perror(strerror(errno));
+ /* Don't keep useless clones around. */
+ if ((flags & openaxiom_spawn_replace) == 0)
+ exit(-1);
+ }
+ return proc->id;
+#endif
+}