annotate crashRun.c @ 545:7b5efee9d724

prepared for windows porting
author thomask
date Tue, 17 May 2005 19:05:41 +0000
parents a15d15eb3928
children 369c59b10266
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
1 /*
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
2 * crashRun - execute command with restricted CPU time and memory usage
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
3 *
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
4 * Copyright (C)
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
5 * 2005 Thomas Kuehne <thomas@kuehne.cn>
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
6 * 2005 Anders F Björklund <afb@algonet.se>
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
7 *
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
11 * (at your option) any later version.
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
12 *
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
16 * GNU General Public License for more details.
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
17 *
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
21 *
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
22 * $HeadURL$
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
23 * $Date$
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
24 * $Author$
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
25 *
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
26 */
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
27
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
28 #include <errno.h>
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
29 #include <string.h>
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
30 #include <stdlib.h>
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
31 #include <stdio.h>
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
32 #include <signal.h>
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
33
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
34 const int TIME_OUT= 5*60; /* time-out in seconds (might be cpu or system time)*/
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
35 const int MEM_LIMIT = 200; /* mem megabytes */
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
36
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
37 /* try to cope with -ansi and other threads */
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
38 #if defined(__GNU_LIBRARY__) || defined(__GLIBC__) || defined(__USE_POSIX)
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
39 #define USE_POSIX
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
40 #endif
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
41
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
42 #ifdef linux
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
43 #define USE_POSIX
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
44 #endif
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
45
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
46 #if defined(__APPLE__) && defined(__MACH__)
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
47 #define USE_POSIX
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
48 #endif
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
49
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
50 #ifdef __FreeBSD__
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
51 #define USE_POSIX
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
52 #endif
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
53
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
54 #if !defined(USE_POSIX) && \
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
55 (defined(WINDOWS) || defined(WIN) || defined(WINVER) || defined(WIN32))
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
56 #define USE_WINDOWS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
57 #endif
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
58
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
59
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
60 /* is the environment sane? */
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
61 #if defined(USE_POSIX) && defined(USE_WINDOWS)
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
62 #error USE_WINDOWS and USE_POSIX are defined
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
63 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
64
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
65 #if !defined(USE_POSIX) && !defined(USE_WINDOWS)
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
66 #error neither USE_POSIX nor USE_WINDOWS are defined
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
67 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
68
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
69
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
70 /* API inludes and config */
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
71 #ifdef USE_POSIX
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
72 #define USE_POSIX_LIMITS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
73 #include <sys/types.h>
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
74 #include <unistd.h>
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
75 #include <sys/wait.h>
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
76 static pid_t pID;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
77 #endif
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
78
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
79 #ifdef USE_POSIX_LIMITS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
80 #ifndef USE_POSIX
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
81 #error USE_POSIX_LIMITS requires USE_POSIX
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
82 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
83 #include <sys/resource.h>
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
84 #include <sys/types.h>
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
85 #endif
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
86
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
87
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
88 /* let's start implementing :) */
495
e4119df89e01 fixed timeout handing of crashRun
thomask
parents: 493
diff changeset
89
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
90 void handleSignal(int signalID){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
91 #ifdef SIGALARM
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
92 if( signalID==SIGALRM
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
93 #ifdef SIGXCPU
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
94 || signalID==SIGXCPU
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
95 #endif
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
96 )
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
97 printf("EXIT CODE: signal %d (time-out after %d seconds)", signalID, TIME_OUT);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
98 else
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
99 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
100 printf("EXIT CODE: signal %d, errno %d\n", signalID, errno);
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
101
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
102 fflush(stdout);
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
103 fflush(stderr);
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
104
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
105 #ifdef USE_POSIX
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
106 kill(-pID, SIGTERM);
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
107 sleep(1);
495
e4119df89e01 fixed timeout handing of crashRun
thomask
parents: 493
diff changeset
108 kill(-pID, SIGKILL);
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
109 #else
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
110 #error sub processes have to be killed
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
111 #endif
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
112
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
113 #ifdef SIGUSR1
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
114 if(signalID==SIGUSR1 || signalID==SIGUSR2)
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
115 exit(EXIT_SUCCESS);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
116 else
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
117 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
118 exit(EXIT_FAILURE);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
119 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
120
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
121 void setupLimits(){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
122 #ifdef USE_POSIX_LIMITS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
123 struct rlimit limit;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
124
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
125 limit.rlim_cur = TIME_OUT;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
126 limit.rlim_max = TIME_OUT;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
127 if(0!=setrlimit(RLIMIT_CPU, &limit)){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
128 fprintf(stderr, "failed to set cpu limit [%d]\n", errno);
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
129 exit(EXIT_FAILURE);
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
130 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
131
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
132 limit.rlim_cur = MEM_LIMIT * 1024L * 1024L;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
133 limit.rlim_max = MEM_LIMIT * 1024L * 1024L;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
134 #ifdef RLIMIT_AS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
135 if(0!=setrlimit(RLIMIT_AS, &limit)){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
136 fprintf(stderr, "failed to set mem limit (AS) [%d]\n", errno);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
137 exit(EXIT_FAILURE);
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
138 }
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
139 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
140
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
141 if(0!=setrlimit(RLIMIT_DATA, &limit)){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
142 fprintf(stderr, "failed to set mem limit (DATA) [%d]\n", errno);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
143 exit(EXIT_FAILURE);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
144 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
145
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
146 if(0!=setrlimit(RLIMIT_RSS, &limit)){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
147 fprintf(stderr, "failed to set mem limit (RSS) [%d]\n", errno);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
148 exit(EXIT_FAILURE);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
149 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
150 #if defined(RLIMIT_MEMLOCK) && !defined(linux)
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
151 if(0!=setrlimit(RLIMIT_MEMLOCK, &limit)){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
152 fprintf(stderr, "failed to set mem limit (MEMLOCK) [%d]\n", errno);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
153 exit(EXIT_FAILURE);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
154 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
155 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
156 #endif /* USE_POSIX_LIMITS */
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
157 }
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
158
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
159 void setupHandlers(){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
160 #ifdef USE_POSIX
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
161 #ifdef SIGHUP
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
162 signal(SIGHUP, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
163 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
164 signal(SIGINT, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
165 #ifdef SIGQUIT
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
166 signal(SIGQUIT, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
167 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
168 signal(SIGILL, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
169 #ifdef SIGTRAP
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
170 signal(SIGTRAP, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
171 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
172 signal(SIGABRT, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
173 #ifdef SIGIOT
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
174 signal(SIGIOT, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
175 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
176 #ifdef SIGBUS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
177 signal(SIGBUS, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
178 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
179 signal(SIGFPE, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
180 #ifdef SIGKILL
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
181 signal(SIGKILL, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
182 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
183 #ifdef SIGUSR1
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
184 signal(SIGUSR1, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
185 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
186 signal(SIGSEGV, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
187 #ifdef SIGUSR2
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
188 signal(SIGUSR2, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
189 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
190 #ifdef SIGPIPE
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
191 signal(SIGPIPE, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
192 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
193 #ifdef SIGALRM
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
194 signal(SIGALRM, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
195 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
196 signal(SIGTERM, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
197 #ifdef SIGSTKFLT
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
198 signal(SIGSTKFLT, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
199 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
200 #ifdef SIGTSTP
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
201 signal(SIGTSTP, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
202 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
203 #ifdef SIGXCPU
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
204 signal(SIGXCPU, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
205 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
206 #ifdef SIGXFSZ
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
207 signal(SIGXFSZ, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
208 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
209 #ifdef SIGVTALRM
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
210 signal(SIGVTALRM, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
211 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
212 #ifdef SIGSYS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
213 signal(SIGSYS, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
214 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
215 #endif /* USE_POSIX */
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
216 }
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
217
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
218 char* reconstructCmd(int argc, char** argv){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
219 int cmdLen=1;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
220 int i;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
221 char* cmd;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
222
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
223 for(i=0; i<argc; i++){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
224 cmdLen+=strlen(argv[i]);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
225 cmdLen+=3;
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
226 }
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
227
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
228 cmd = (char*)malloc(cmdLen);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
229 *cmd = '\x00';
495
e4119df89e01 fixed timeout handing of crashRun
thomask
parents: 493
diff changeset
230
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
231 for(i=0; i<argc; i++){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
232 strcat(cmd, "\"");
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
233 strcat(cmd, argv[i]);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
234 strcat(cmd, "\" ");
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
235 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
236 return cmd;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
237 }
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
238
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
239 int main(int argc, char** argv){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
240 char* cmd;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
241 if(argc<2){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
242 fprintf(stderr, "name of command to call required\n");
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
243 return EXIT_FAILURE;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
244 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
245 cmd = reconstructCmd(argc-1, argv+1);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
246
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
247 #ifdef USE_POSIX
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
248 setupLimits();
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
249 pID = fork();
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
250 if(pID == 0){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
251 /* child */
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
252 pID=setsid();
493
1418f225a81e disabled debug output
thomask
parents: 490
diff changeset
253 #ifdef DEBUG
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
254 printf("cmd[%i sec]: %s \n", TIME_OUT, cmd);
493
1418f225a81e disabled debug output
thomask
parents: 490
diff changeset
255 #endif
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
256 printf("EXIT CODE: %d\n", system(cmd));
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
257 }else if(pID < 0){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
258 fprintf(stderr, "failed to fork\n");
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
259 return EXIT_FAILURE;
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
260 }else{
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
261 /* parent */
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
262 setupHandlers();
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
263 #if !(defined(USE_POSIX_LIMITS) && defined(SIGXCPU))
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
264 alarm(TIME_OUT);
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
265 #endif
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
266 wait(NULL);
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
267 }
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
268 return EXIT_SUCCESS;
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
269 #else /* USE_POSIX */
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
270
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
271 #error no test run implmentation present for your system
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
272
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
273 #endif /* USE_POSIX else */
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
274 }