root/rat/trunk/process.c @ 4213

Revision 4213, 4.7 KB (checked in by turam, 6 years ago)

Accept -X arguments on command line, and pass to underlying apps and into tcl interpreter

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/*
2 * FILE:    process.c
3 * PROGRAM: RAT - controller
4 * AUTHOR:  Colin Perkins / Orion Hodson
5 *
6 * Copyright (c) 1999-2001 University College London
7 * All rights reserved.
8 */
9
10#ifndef HIDE_SOURCE_STRINGS
11static const char cvsid[] = "$Id";
12#endif /* HIDE_SOURCE_STRINGS */
13
14#include "config_unix.h"
15#include "config_win32.h"
16#include "debug.h"
17#include "mbus.h"
18#include "process.h"
19
20
21void fork_process(char *proc_name, char *ctrl_addr, pid_t *pid, int num_tokens, char *token[2], int argc, char **argv)
22{
23#ifdef WIN32
24        int                      i;
25        char                     args[1024];
26        LPSTARTUPINFO            startup_info;
27        LPPROCESS_INFORMATION    proc_info;
28
29        startup_info = (LPSTARTUPINFO) xmalloc(sizeof(STARTUPINFO));
30        startup_info->cb              = sizeof(STARTUPINFO);
31        startup_info->lpReserved      = 0;
32        startup_info->lpDesktop       = 0;
33        startup_info->lpTitle         = 0;
34        startup_info->dwX             = 0;
35        startup_info->dwY             = 0;
36        startup_info->dwXSize         = 0;
37        startup_info->dwYSize         = 0;
38        startup_info->dwXCountChars   = 0;
39        startup_info->dwYCountChars   = 0;
40        startup_info->dwFillAttribute = 0;
41        startup_info->dwFlags         = 0;
42        startup_info->wShowWindow     = 0;
43        startup_info->cbReserved2     = 0;
44        startup_info->lpReserved2     = 0;
45        startup_info->hStdInput       = 0;
46        startup_info->hStdOutput      = 0;
47        startup_info->hStdError       = 0;
48
49        proc_info = (LPPROCESS_INFORMATION) xmalloc(sizeof(PROCESS_INFORMATION));
50
51        if (num_tokens == 1) {
52                _snprintf(args, sizeof(args), "%s -ctrl \"%s\" -token %s", proc_name, ctrl_addr, token[0]);
53        } else {
54                _snprintf(args, sizeof(args), "%s -T -ctrl \"%s\" -token %s -token %s", proc_name, ctrl_addr, token[0], token[1]);
55        }
56        for(i=0;i<argc;i++) {
57                _snprintf(args, sizeof(args), "%s %s", args, argv[i]);
58        }
59
60        if (!CreateProcess(NULL, args, NULL, NULL, TRUE, 0, NULL, NULL, startup_info, proc_info)) {
61                perror("Couldn't create process");
62                abort();
63        }
64        *pid = (pid_t) proc_info->hProcess;     /* Sigh, hope a HANDLE fits into 32 bits... */
65        debug_msg("Forked %s\n", proc_name);
66#else /* ...we're on unix */
67        char *path, *path_env;
68        int i;
69#ifdef DEBUG_FORK
70        if (num_tokens == 1) {
71                debug_msg("%s -ctrl '%s' -token %s\n", proc_name, ctrl_addr, token[0]);
72        } else {
73                debug_msg("%s -T -ctrl '%s' -token %s -token %s\n", proc_name, ctrl_addr, token[0], token[1]);
74        }
75        UNUSED(pid);
76#else
77        if ((getuid() != 0) && (geteuid() != 0)) {
78                /* Ensure that the current directory is in the PATH. This is a security */
79                /* problem, but reduces the number of support calls we get...           */
80                path = getenv("PATH");
81                if (path == NULL) {
82                        path_env = (char *) xmalloc(8);
83                        sprintf(path_env, "PATH=.");
84                } else {
85                        path_env = (char *) xmalloc(strlen(path) + 8);
86                        sprintf(path_env, "PATH=%s:.", path);
87                }
88                debug_msg("%s\n", path_env);
89                putenv(path_env);
90                /* NOTE: we MUST NOT free the memory allocated to path_env. In some    */
91                /* cases the string passed to putenv() becomes part of the environment */
92                /* and hence freeing the memory removes PATH from the environment.     */
93        } else {
94                debug_msg("Running as root? PATH unmodified\n");
95        }
96        /* Fork off the sub-process... */
97                char **args = xmalloc(argc);
98                int numargs=0;
99        *pid = fork();
100        if (*pid == -1) {
101                perror("Cannot fork");
102                abort();
103        } else if (*pid == 0) {
104                        args[numargs++] = proc_name;
105                        args[numargs++] = "-ctrl";
106                        args[numargs++] = ctrl_addr;
107                        for(i=0;i<num_tokens;i++) {
108                                args[numargs++] = "-token";
109                                args[numargs++] = token[i];
110                        }
111                        for(i=0;i<argc;i++) {
112                                args[numargs++] = argv[i];
113                        }
114                        args[numargs++] = NULL;
115                        execvp( proc_name, args );
116               
117            perror("Cannot execute subprocess");
118            /* Note: this MUST NOT be exit() or abort(), since they affect the standard */
119            /* IO channels in the parent process (fork duplicates file descriptors, but */
120            /* they still point to the same underlying file).                           */
121            _exit(1);
122        }
123        xfree(args);
124#endif
125#endif
126}
127
128void kill_process(pid_t proc)
129{
130        if (proc == 0) {
131                debug_msg("Process already dead\n", proc);
132                return;
133        }
134        debug_msg("Killing process %d\n", proc);
135#ifdef WIN32
136        /* This doesn't close down DLLs or free resources, so we have to  */
137        /* hope it doesn't get called. With any luck everything is closed */
138        /* down by sending it an mbus.exit() message, anyway...           */
139        TerminateProcess((HANDLE) proc, 0);
140#else
141        kill(proc, SIGINT);
142#endif
143}
144
Note: See TracBrowser for help on using the browser.