annotate crashRun.c @ 684:369c59b10266

ported crasRun to OpenBSD
author thomask
date Sun, 25 Sep 2005 17:50:06 +0000
parents 7b5efee9d724
children 528649416e9d
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>
684
369c59b10266 ported crasRun to OpenBSD
thomask
parents: 545
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
684
369c59b10266 ported crasRun to OpenBSD
thomask
parents: 545
diff changeset
42 #if defined(linux) || defined(__FreeBsd__) || defined(__OpenBSD__)
490
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
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
50 #if !defined(USE_POSIX) && \
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
51 (defined(WINDOWS) || defined(WIN) || defined(WINVER) || defined(WIN32))
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
52 #define USE_WINDOWS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
53 #endif
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
54
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
55
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
56 /* is the environment sane? */
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
57 #if defined(USE_POSIX) && defined(USE_WINDOWS)
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
58 #error USE_WINDOWS and USE_POSIX are defined
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
59 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
60
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 neither USE_POSIX nor USE_WINDOWS 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
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
66 /* API inludes and config */
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
67 #ifdef USE_POSIX
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
68 #define USE_POSIX_LIMITS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
69 #include <sys/types.h>
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
70 #include <unistd.h>
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
71 #include <sys/wait.h>
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
72 static pid_t pID;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
73 #endif
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
74
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
75 #ifdef USE_POSIX_LIMITS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
76 #ifndef USE_POSIX
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
77 #error USE_POSIX_LIMITS requires USE_POSIX
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
78 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
79 #include <sys/resource.h>
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
80 #include <sys/types.h>
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
81 #endif
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
82
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
83
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
84 /* let's start implementing :) */
495
e4119df89e01 fixed timeout handing of crashRun
thomask
parents: 493
diff changeset
85
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
86 void handleSignal(int signalID){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
87 #ifdef SIGALARM
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
88 if( signalID==SIGALRM
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
89 #ifdef SIGXCPU
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
90 || signalID==SIGXCPU
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
91 #endif
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
92 )
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
93 printf("EXIT CODE: signal %d (time-out after %d seconds)", signalID, TIME_OUT);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
94 else
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
95 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
96 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
97
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
98 fflush(stdout);
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
99 fflush(stderr);
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
100
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
101 #ifdef USE_POSIX
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
102 kill(-pID, SIGTERM);
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
103 sleep(1);
495
e4119df89e01 fixed timeout handing of crashRun
thomask
parents: 493
diff changeset
104 kill(-pID, SIGKILL);
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
105 #else
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
106 #error sub processes have to be killed
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
107 #endif
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
108
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
109 #ifdef SIGUSR1
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
110 if(signalID==SIGUSR1 || signalID==SIGUSR2)
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
111 exit(EXIT_SUCCESS);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
112 else
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
113 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
114 exit(EXIT_FAILURE);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
115 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
116
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
117 void setupLimits(){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
118 #ifdef USE_POSIX_LIMITS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
119 struct rlimit limit;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
120
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
121 limit.rlim_cur = TIME_OUT;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
122 limit.rlim_max = TIME_OUT;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
123 if(0!=setrlimit(RLIMIT_CPU, &limit)){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
124 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
125 exit(EXIT_FAILURE);
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
126 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
127
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
128 limit.rlim_cur = MEM_LIMIT * 1024L * 1024L;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
129 limit.rlim_max = MEM_LIMIT * 1024L * 1024L;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
130 #ifdef RLIMIT_AS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
131 if(0!=setrlimit(RLIMIT_AS, &limit)){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
132 fprintf(stderr, "failed to set mem limit (AS) [%d]\n", errno);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
133 exit(EXIT_FAILURE);
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
134 }
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
135 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
136
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
137 if(0!=setrlimit(RLIMIT_DATA, &limit)){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
138 fprintf(stderr, "failed to set mem limit (DATA) [%d]\n", errno);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
139 exit(EXIT_FAILURE);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
140 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
141
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
142 if(0!=setrlimit(RLIMIT_RSS, &limit)){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
143 fprintf(stderr, "failed to set mem limit (RSS) [%d]\n", errno);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
144 exit(EXIT_FAILURE);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
145 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
146 #if defined(RLIMIT_MEMLOCK) && !defined(linux)
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
147 if(0!=setrlimit(RLIMIT_MEMLOCK, &limit)){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
148 fprintf(stderr, "failed to set mem limit (MEMLOCK) [%d]\n", errno);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
149 exit(EXIT_FAILURE);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
150 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
151 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
152 #endif /* USE_POSIX_LIMITS */
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
153 }
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
154
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
155 void setupHandlers(){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
156 #ifdef USE_POSIX
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
157 #ifdef SIGHUP
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
158 signal(SIGHUP, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
159 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
160 signal(SIGINT, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
161 #ifdef SIGQUIT
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
162 signal(SIGQUIT, &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(SIGILL, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
165 #ifdef SIGTRAP
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
166 signal(SIGTRAP, &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(SIGABRT, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
169 #ifdef SIGIOT
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
170 signal(SIGIOT, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
171 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
172 #ifdef SIGBUS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
173 signal(SIGBUS, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
174 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
175 signal(SIGFPE, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
176 #ifdef SIGKILL
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
177 signal(SIGKILL, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
178 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
179 #ifdef SIGUSR1
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
180 signal(SIGUSR1, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
181 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
182 signal(SIGSEGV, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
183 #ifdef SIGUSR2
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
184 signal(SIGUSR2, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
185 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
186 #ifdef SIGPIPE
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
187 signal(SIGPIPE, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
188 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
189 #ifdef SIGALRM
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
190 signal(SIGALRM, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
191 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
192 signal(SIGTERM, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
193 #ifdef SIGSTKFLT
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
194 signal(SIGSTKFLT, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
195 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
196 #ifdef SIGTSTP
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
197 signal(SIGTSTP, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
198 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
199 #ifdef SIGXCPU
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
200 signal(SIGXCPU, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
201 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
202 #ifdef SIGXFSZ
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
203 signal(SIGXFSZ, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
204 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
205 #ifdef SIGVTALRM
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
206 signal(SIGVTALRM, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
207 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
208 #ifdef SIGSYS
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
209 signal(SIGSYS, &handleSignal);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
210 #endif
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
211 #endif /* USE_POSIX */
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
212 }
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
213
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
214 char* reconstructCmd(int argc, char** argv){
684
369c59b10266 ported crasRun to OpenBSD
thomask
parents: 545
diff changeset
215 size_t cmdLen=1;
369c59b10266 ported crasRun to OpenBSD
thomask
parents: 545
diff changeset
216 size_t tmpLen;
369c59b10266 ported crasRun to OpenBSD
thomask
parents: 545
diff changeset
217 size_t i;
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
218 char* cmd;
684
369c59b10266 ported crasRun to OpenBSD
thomask
parents: 545
diff changeset
219 char* tmp;
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
220
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
221 for(i=0; i<argc; i++){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
222 cmdLen+=strlen(argv[i]);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
223 cmdLen+=3;
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
224 }
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
225
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
226 cmd = (char*)malloc(cmdLen);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
227 *cmd = '\x00';
684
369c59b10266 ported crasRun to OpenBSD
thomask
parents: 545
diff changeset
228 tmp = cmd;
495
e4119df89e01 fixed timeout handing of crashRun
thomask
parents: 493
diff changeset
229
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
230 for(i=0; i<argc; i++){
684
369c59b10266 ported crasRun to OpenBSD
thomask
parents: 545
diff changeset
231 tmpLen = snprintf(tmp, cmdLen, "\"%s\" ", argv[i]);
369c59b10266 ported crasRun to OpenBSD
thomask
parents: 545
diff changeset
232 tmp += tmpLen;
369c59b10266 ported crasRun to OpenBSD
thomask
parents: 545
diff changeset
233 cmdLen -= tmpLen;
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
234 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
235 return cmd;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
236 }
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
237
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
238 int main(int argc, char** argv){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
239 char* cmd;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
240 if(argc<2){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
241 fprintf(stderr, "name of command to call required\n");
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
242 return EXIT_FAILURE;
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
243 }
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
244 cmd = reconstructCmd(argc-1, argv+1);
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
245
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
246 #ifdef USE_POSIX
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
247 setupLimits();
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
248 pID = fork();
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
249 if(pID == 0){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
250 /* child */
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
251 pID=setsid();
493
1418f225a81e disabled debug output
thomask
parents: 490
diff changeset
252 #ifdef DEBUG
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
253 printf("cmd[%i sec]: %s \n", TIME_OUT, cmd);
493
1418f225a81e disabled debug output
thomask
parents: 490
diff changeset
254 #endif
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
255 printf("EXIT CODE: %d\n", system(cmd));
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
256 }else if(pID < 0){
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
257 fprintf(stderr, "failed to fork\n");
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
258 return EXIT_FAILURE;
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
259 }else{
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
260 /* parent */
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
261 setupHandlers();
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
262 #if !(defined(USE_POSIX_LIMITS) && defined(SIGXCPU))
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
263 alarm(TIME_OUT);
502
a15d15eb3928 added memory limit to crashRun
thomask
parents: 498
diff changeset
264 #endif
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
265 wait(NULL);
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
266 }
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
267 return EXIT_SUCCESS;
498
1636b8289a73 correctly kill child process if killed by user
thomask
parents: 495
diff changeset
268 #else /* USE_POSIX */
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
269
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
270 #error no test run implmentation present for your system
490
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
271
d091ff903fa4 added crashRun for POSIX systems
thomask
parents:
diff changeset
272 #endif /* USE_POSIX else */
545
7b5efee9d724 prepared for windows porting
thomask
parents: 502
diff changeset
273 }