Description:
fix bux when pid=0
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r157:b4e13c98cfec - - 2 files changed: 7 inserted, 5 deleted
@@ -14,391 +14,391 | |||||
|
14 | #define CONFIG_DIRECT_IO 1 |
|
14 | #define CONFIG_DIRECT_IO 1 |
|
15 | #define CONFIG_ISOLATE_BOX_DIR "/tmp/box" |
|
15 | #define CONFIG_ISOLATE_BOX_DIR "/tmp/box" |
|
16 | #define CONFIG_ISOLATE_CGROUP_ROOT "/sys/fs/cgroup" |
|
16 | #define CONFIG_ISOLATE_CGROUP_ROOT "/sys/fs/cgroup" |
|
17 | #define CONFIG_ISOLATE_FIRST_GID 60000 |
|
17 | #define CONFIG_ISOLATE_FIRST_GID 60000 |
|
18 | #define CONFIG_ISOLATE_FIRST_UID 60000 |
|
18 | #define CONFIG_ISOLATE_FIRST_UID 60000 |
|
19 | #define CONFIG_ISOLATE_NUM_BOXES 100 |
|
19 | #define CONFIG_ISOLATE_NUM_BOXES 100 |
|
20 | #define CONFIG_LARGE_FILES 1 |
|
20 | #define CONFIG_LARGE_FILES 1 |
|
21 | #define CONFIG_LFS 1 |
|
21 | #define CONFIG_LFS 1 |
|
22 | #define CONFIG_LINUX 1 |
|
22 | #define CONFIG_LINUX 1 |
|
23 | #define CONFIG_LOCAL 1 |
|
23 | #define CONFIG_LOCAL 1 |
|
24 | #define CONFIG_UCW_PARTMAP_IS_MMAP 1 |
|
24 | #define CONFIG_UCW_PARTMAP_IS_MMAP 1 |
|
25 | #define CONFIG_UCW_PERL 1 |
|
25 | #define CONFIG_UCW_PERL 1 |
|
26 | #define CONFIG_UCW_POOL_IS_MMAP 1 |
|
26 | #define CONFIG_UCW_POOL_IS_MMAP 1 |
|
27 | #define CONFIG_UCW_RADIX_SORTER_BITS 10 |
|
27 | #define CONFIG_UCW_RADIX_SORTER_BITS 10 |
|
28 | #define CONFIG_UCW_SHELL_UTILS 1 |
|
28 | #define CONFIG_UCW_SHELL_UTILS 1 |
|
29 | #define CPU_64BIT_POINTERS 1 |
|
29 | #define CPU_64BIT_POINTERS 1 |
|
30 | #define CPU_ALLOW_UNALIGNED 1 |
|
30 | #define CPU_ALLOW_UNALIGNED 1 |
|
31 | #define CPU_AMD64 1 |
|
31 | #define CPU_AMD64 1 |
|
32 | #define CPU_ARCH "default" |
|
32 | #define CPU_ARCH "default" |
|
33 | #define CPU_LITTLE_ENDIAN 1 |
|
33 | #define CPU_LITTLE_ENDIAN 1 |
|
34 | #define CPU_PAGE_SIZE 4096 |
|
34 | #define CPU_PAGE_SIZE 4096 |
|
35 | #define CPU_STRUCT_ALIGN 8 |
|
35 | #define CPU_STRUCT_ALIGN 8 |
|
36 | #define CWARNS_OFF " -Wno-pointer-sign" |
|
36 | #define CWARNS_OFF " -Wno-pointer-sign" |
|
37 | #define HAVE_ASCII_DOC "none" |
|
37 | #define HAVE_ASCII_DOC "none" |
|
38 | #define INSTALL_BIN_DIR "bin" |
|
38 | #define INSTALL_BIN_DIR "bin" |
|
39 | #define INSTALL_CONFIG_DIR "cf" |
|
39 | #define INSTALL_CONFIG_DIR "cf" |
|
40 | #define INSTALL_DOC_DIR "share/doc" |
|
40 | #define INSTALL_DOC_DIR "share/doc" |
|
41 | #define INSTALL_INCLUDE_DIR "include" |
|
41 | #define INSTALL_INCLUDE_DIR "include" |
|
42 | #define INSTALL_LIB_DIR "lib" |
|
42 | #define INSTALL_LIB_DIR "lib" |
|
43 | #define INSTALL_LOG_DIR "log" |
|
43 | #define INSTALL_LOG_DIR "log" |
|
44 | #define INSTALL_MAN_DIR "share/man" |
|
44 | #define INSTALL_MAN_DIR "share/man" |
|
45 | #define INSTALL_PERL_DIR "lib/perl5" |
|
45 | #define INSTALL_PERL_DIR "lib/perl5" |
|
46 | #define INSTALL_PKGCONFIG_DIR "lib/pkgconfig" |
|
46 | #define INSTALL_PKGCONFIG_DIR "lib/pkgconfig" |
|
47 | #define INSTALL_PREFIX |
|
47 | #define INSTALL_PREFIX |
|
48 | #define INSTALL_RUN_DIR "run" |
|
48 | #define INSTALL_RUN_DIR "run" |
|
49 | #define INSTALL_SBIN_DIR "sbin" |
|
49 | #define INSTALL_SBIN_DIR "sbin" |
|
50 | #define INSTALL_SHARE_DIR "share" |
|
50 | #define INSTALL_SHARE_DIR "share" |
|
51 | #define INSTALL_STATE_DIR "lib" |
|
51 | #define INSTALL_STATE_DIR "lib" |
|
52 | #define INSTALL_USR_PREFIX |
|
52 | #define INSTALL_USR_PREFIX |
|
53 | #define INSTALL_VAR_PREFIX |
|
53 | #define INSTALL_VAR_PREFIX |
|
54 | #define SHERLOCK_VERSION "3.99.2" |
|
54 | #define SHERLOCK_VERSION "3.99.2" |
|
55 | #define SHERLOCK_VERSION_CODE 3099002 |
|
55 | #define SHERLOCK_VERSION_CODE 3099002 |
|
56 | #define SONAME_PREFIX "lib/" |
|
56 | #define SONAME_PREFIX "lib/" |
|
57 | #define UCW_VERSION "3.99.2" |
|
57 | #define UCW_VERSION "3.99.2" |
|
58 | #define UCW_VERSION_CODE 3099002 |
|
58 | #define UCW_VERSION_CODE 3099002 |
|
59 |
|
59 | ||
|
60 | #include <errno.h> |
|
60 | #include <errno.h> |
|
61 | #include <stdio.h> |
|
61 | #include <stdio.h> |
|
62 | #include <fcntl.h> |
|
62 | #include <fcntl.h> |
|
63 | #include <stdlib.h> |
|
63 | #include <stdlib.h> |
|
64 | #include <string.h> |
|
64 | #include <string.h> |
|
65 | #include <stdarg.h> |
|
65 | #include <stdarg.h> |
|
66 | #include <stdint.h> |
|
66 | #include <stdint.h> |
|
67 | #include <unistd.h> |
|
67 | #include <unistd.h> |
|
68 | #include <getopt.h> |
|
68 | #include <getopt.h> |
|
69 | #include <time.h> |
|
69 | #include <time.h> |
|
70 | #include <sys/wait.h> |
|
70 | #include <sys/wait.h> |
|
71 | #include <sys/user.h> |
|
71 | #include <sys/user.h> |
|
72 | #include <sys/time.h> |
|
72 | #include <sys/time.h> |
|
73 | #include <sys/ptrace.h> |
|
73 | #include <sys/ptrace.h> |
|
74 | #include <sys/signal.h> |
|
74 | #include <sys/signal.h> |
|
75 | #include <sys/sysinfo.h> |
|
75 | #include <sys/sysinfo.h> |
|
76 | #include <sys/resource.h> |
|
76 | #include <sys/resource.h> |
|
77 | #include <sys/utsname.h> |
|
77 | #include <sys/utsname.h> |
|
78 | //#include <linux/ptrace.h> |
|
78 | //#include <linux/ptrace.h> |
|
79 |
|
79 | ||
|
80 | #if defined(CONFIG_BOX_KERNEL_AMD64) && !defined(CONFIG_BOX_USER_AMD64) |
|
80 | #if defined(CONFIG_BOX_KERNEL_AMD64) && !defined(CONFIG_BOX_USER_AMD64) |
|
81 | #include <asm/unistd_32.h> |
|
81 | #include <asm/unistd_32.h> |
|
82 | #define NATIVE_NR_execve 59 /* 64-bit execve */ |
|
82 | #define NATIVE_NR_execve 59 /* 64-bit execve */ |
|
83 | #else |
|
83 | #else |
|
84 | #include <asm/unistd.h> |
|
84 | #include <asm/unistd.h> |
|
85 | #define NATIVE_NR_execve __NR_execve |
|
85 | #define NATIVE_NR_execve __NR_execve |
|
86 | #endif |
|
86 | #endif |
|
87 |
|
87 | ||
|
88 | #define NONRET __attribute__((noreturn)) |
|
88 | #define NONRET __attribute__((noreturn)) |
|
89 | #define UNUSED __attribute__((unused)) |
|
89 | #define UNUSED __attribute__((unused)) |
|
90 | #define ARRAY_SIZE(a) (int)(sizeof(a)/sizeof(a[0])) |
|
90 | #define ARRAY_SIZE(a) (int)(sizeof(a)/sizeof(a[0])) |
|
91 |
|
91 | ||
|
92 | static int filter_syscalls; /* 0=off, 1=liberal, 2=totalitarian */ |
|
92 | static int filter_syscalls; /* 0=off, 1=liberal, 2=totalitarian */ |
|
93 | static int timeout; /* milliseconds */ |
|
93 | static int timeout; /* milliseconds */ |
|
94 | static int wall_timeout; |
|
94 | static int wall_timeout; |
|
95 | static int extra_timeout; |
|
95 | static int extra_timeout; |
|
96 | static int pass_environ; |
|
96 | static int pass_environ; |
|
97 | static int file_access; |
|
97 | static int file_access; |
|
98 | static int verbose; |
|
98 | static int verbose; |
|
99 | static int memory_limit; |
|
99 | static int memory_limit; |
|
100 | static int stack_limit; |
|
100 | static int stack_limit; |
|
101 | static char *redir_stdin, *redir_stdout, *redir_stderr; |
|
101 | static char *redir_stdin, *redir_stdout, *redir_stderr; |
|
102 | static char *set_cwd; |
|
102 | static char *set_cwd; |
|
103 |
|
103 | ||
|
104 | static pid_t box_pid; |
|
104 | static pid_t box_pid; |
|
105 | static int is_ptraced; |
|
105 | static int is_ptraced; |
|
106 | static volatile int timer_tick; |
|
106 | static volatile int timer_tick; |
|
107 | static struct timeval start_time; |
|
107 | static struct timeval start_time; |
|
108 | static int ticks_per_sec; |
|
108 | static int ticks_per_sec; |
|
109 | static int exec_seen; |
|
109 | static int exec_seen; |
|
110 | static int partial_line; |
|
110 | static int partial_line; |
|
111 |
|
111 | ||
|
112 | static int mem_peak_kb; |
|
112 | static int mem_peak_kb; |
|
113 | static int total_ms, wall_ms, sys_ms; |
|
113 | static int total_ms, wall_ms, sys_ms; |
|
114 |
|
114 | ||
|
115 | static void die(char *msg, ...) NONRET; |
|
115 | static void die(char *msg, ...) NONRET; |
|
116 | static void sample_mem_peak(void); |
|
116 | static void sample_mem_peak(void); |
|
117 |
|
117 | ||
|
118 | /*** Meta-files ***/ |
|
118 | /*** Meta-files ***/ |
|
119 |
|
119 | ||
|
120 | static FILE *metafile; |
|
120 | static FILE *metafile; |
|
121 |
|
121 | ||
|
122 | static void |
|
122 | static void |
|
123 | meta_open(const char *name) |
|
123 | meta_open(const char *name) |
|
124 | { |
|
124 | { |
|
125 | if (!strcmp(name, "-")) |
|
125 | if (!strcmp(name, "-")) |
|
126 | { |
|
126 | { |
|
127 | metafile = stdout; |
|
127 | metafile = stdout; |
|
128 | return; |
|
128 | return; |
|
129 | } |
|
129 | } |
|
130 | metafile = fopen(name, "w"); |
|
130 | metafile = fopen(name, "w"); |
|
131 | if (!metafile) |
|
131 | if (!metafile) |
|
132 | die("Failed to open metafile '%s'",name); |
|
132 | die("Failed to open metafile '%s'",name); |
|
133 | } |
|
133 | } |
|
134 |
|
134 | ||
|
135 | static void |
|
135 | static void |
|
136 | meta_close(void) |
|
136 | meta_close(void) |
|
137 | { |
|
137 | { |
|
138 | if (metafile && metafile != stdout) |
|
138 | if (metafile && metafile != stdout) |
|
139 | fclose(metafile); |
|
139 | fclose(metafile); |
|
140 | } |
|
140 | } |
|
141 |
|
141 | ||
|
142 | static void __attribute__((format(printf,1,2))) |
|
142 | static void __attribute__((format(printf,1,2))) |
|
143 | meta_printf(const char *fmt, ...) |
|
143 | meta_printf(const char *fmt, ...) |
|
144 | { |
|
144 | { |
|
145 | if (!metafile) |
|
145 | if (!metafile) |
|
146 | return; |
|
146 | return; |
|
147 |
|
147 | ||
|
148 | va_list args; |
|
148 | va_list args; |
|
149 | va_start(args, fmt); |
|
149 | va_start(args, fmt); |
|
150 | vfprintf(metafile, fmt, args); |
|
150 | vfprintf(metafile, fmt, args); |
|
151 | va_end(args); |
|
151 | va_end(args); |
|
152 | } |
|
152 | } |
|
153 |
|
153 | ||
|
154 |
|
154 | ||
|
155 | static void print_running_stat(double wall_time, |
|
155 | static void print_running_stat(double wall_time, |
|
156 | double user_time, |
|
156 | double user_time, |
|
157 | double system_time, |
|
157 | double system_time, |
|
158 | int mem_usage) |
|
158 | int mem_usage) |
|
159 | { |
|
159 | { |
|
160 | //total is user |
|
160 | //total is user |
|
161 | //wall is wall |
|
161 | //wall is wall |
|
162 | // |
|
162 | // |
|
163 | fprintf(stderr,"%.4lfr%.4lfu%.4lfs%dm\n", |
|
163 | fprintf(stderr,"%.4lfr%.4lfu%.4lfs%dm\n", |
|
164 | wall_time, user_time, system_time, mem_usage); |
|
164 | wall_time, user_time, system_time, mem_usage); |
|
165 | } |
|
165 | } |
|
166 |
|
166 | ||
|
167 | static void |
|
167 | static void |
|
168 | final_stats(struct rusage *rus) |
|
168 | final_stats(struct rusage *rus) |
|
169 | { |
|
169 | { |
|
170 | struct timeval total, now, wall; |
|
170 | struct timeval total, now, wall; |
|
171 | timeradd(&rus->ru_utime, &rus->ru_stime, &total); |
|
171 | timeradd(&rus->ru_utime, &rus->ru_stime, &total); |
|
172 | total_ms = total.tv_sec*1000 + total.tv_usec/1000; |
|
172 | total_ms = total.tv_sec*1000 + total.tv_usec/1000; |
|
173 | gettimeofday(&now, NULL); |
|
173 | gettimeofday(&now, NULL); |
|
174 | timersub(&now, &start_time, &wall); |
|
174 | timersub(&now, &start_time, &wall); |
|
175 | wall_ms = wall.tv_sec*1000 + wall.tv_usec/1000; |
|
175 | wall_ms = wall.tv_sec*1000 + wall.tv_usec/1000; |
|
176 | sys_ms = rus->ru_stime.tv_sec * 1000 + rus->ru_stime.tv_usec / 1000; |
|
176 | sys_ms = rus->ru_stime.tv_sec * 1000 + rus->ru_stime.tv_usec / 1000; |
|
177 |
|
177 | ||
|
178 | meta_printf("time:%d.%03d\n", total_ms/1000, total_ms%1000); |
|
178 | meta_printf("time:%d.%03d\n", total_ms/1000, total_ms%1000); |
|
179 | meta_printf("time-wall:%d.%03d\n", wall_ms/1000, wall_ms%1000); |
|
179 | meta_printf("time-wall:%d.%03d\n", wall_ms/1000, wall_ms%1000); |
|
180 | meta_printf("mem:%llu\n", (unsigned long long) mem_peak_kb * 1024); |
|
180 | meta_printf("mem:%llu\n", (unsigned long long) mem_peak_kb * 1024); |
|
181 | } |
|
181 | } |
|
182 |
|
182 | ||
|
183 | /*** Messages and exits ***/ |
|
183 | /*** Messages and exits ***/ |
|
184 |
|
184 | ||
|
185 | static void NONRET |
|
185 | static void NONRET |
|
186 | box_exit(int rc) |
|
186 | box_exit(int rc) |
|
187 | { |
|
187 | { |
|
188 | if (box_pid > 0) |
|
188 | if (box_pid > 0) |
|
189 | { |
|
189 | { |
|
190 | sample_mem_peak(); |
|
190 | sample_mem_peak(); |
|
191 | if (is_ptraced) |
|
191 | if (is_ptraced) |
|
192 | ptrace(PTRACE_KILL, box_pid); |
|
192 | ptrace(PTRACE_KILL, box_pid); |
|
193 | kill(-box_pid, SIGKILL); |
|
193 | kill(-box_pid, SIGKILL); |
|
194 | kill(box_pid, SIGKILL); |
|
194 | kill(box_pid, SIGKILL); |
|
195 | meta_printf("killed:1\n"); |
|
195 | meta_printf("killed:1\n"); |
|
196 |
|
196 | ||
|
197 | struct rusage rus; |
|
197 | struct rusage rus; |
|
198 | int p, stat; |
|
198 | int p, stat; |
|
199 | do |
|
199 | do |
|
200 | p = wait4(box_pid, &stat, 0, &rus); |
|
200 | p = wait4(box_pid, &stat, 0, &rus); |
|
201 | while (p < 0 && errno == EINTR); |
|
201 | while (p < 0 && errno == EINTR); |
|
202 | if (p < 0) |
|
202 | if (p < 0) |
|
203 | fprintf(stderr, "UGH: Lost track of the process (%m)\n"); |
|
203 | fprintf(stderr, "UGH: Lost track of the process (%m)\n"); |
|
204 | else { |
|
204 | else { |
|
205 | final_stats(&rus); |
|
205 | final_stats(&rus); |
|
206 | - print_running_stat( |
|
||
|
207 | - (double)wall_ms/1000, |
|
||
|
208 | - (double)total_ms/1000, |
|
||
|
209 | - (double)sys_ms/1000, |
|
||
|
210 | - (mem_peak_kb + 1023) / 1024); |
|
||
|
211 | } |
|
206 | } |
|
212 | } |
|
207 | } |
|
|
208 | + print_running_stat( | ||
|
|
209 | + (double)wall_ms/1000, | ||
|
|
210 | + (double)total_ms/1000, | ||
|
|
211 | + (double)sys_ms/1000, | ||
|
|
212 | + (mem_peak_kb + 1023) / 1024); | ||
|
213 | meta_close(); |
|
213 | meta_close(); |
|
214 | exit(rc); |
|
214 | exit(rc); |
|
215 | } |
|
215 | } |
|
216 |
|
216 | ||
|
217 | static void |
|
217 | static void |
|
218 | flush_line(void) |
|
218 | flush_line(void) |
|
219 | { |
|
219 | { |
|
220 | if (partial_line) |
|
220 | if (partial_line) |
|
221 | fputc('\n', stderr); |
|
221 | fputc('\n', stderr); |
|
222 | partial_line = 0; |
|
222 | partial_line = 0; |
|
223 | } |
|
223 | } |
|
224 |
|
224 | ||
|
225 | /* Report an error of the sandbox itself */ |
|
225 | /* Report an error of the sandbox itself */ |
|
226 | static void NONRET __attribute__((format(printf,1,2))) |
|
226 | static void NONRET __attribute__((format(printf,1,2))) |
|
227 | die(char *msg, ...) |
|
227 | die(char *msg, ...) |
|
228 | { |
|
228 | { |
|
229 | va_list args; |
|
229 | va_list args; |
|
230 | va_start(args, msg); |
|
230 | va_start(args, msg); |
|
231 | flush_line(); |
|
231 | flush_line(); |
|
232 | char buf[1024]; |
|
232 | char buf[1024]; |
|
233 | vsnprintf(buf, sizeof(buf), msg, args); |
|
233 | vsnprintf(buf, sizeof(buf), msg, args); |
|
234 | meta_printf("status:XX\nmessage:%s\n", buf); |
|
234 | meta_printf("status:XX\nmessage:%s\n", buf); |
|
235 | fputs(buf, stderr); |
|
235 | fputs(buf, stderr); |
|
236 | fputc('\n', stderr); |
|
236 | fputc('\n', stderr); |
|
237 | box_exit(2); |
|
237 | box_exit(2); |
|
238 | } |
|
238 | } |
|
239 |
|
239 | ||
|
240 | /* Report an error of the program inside the sandbox */ |
|
240 | /* Report an error of the program inside the sandbox */ |
|
241 | static void NONRET __attribute__((format(printf,1,2))) |
|
241 | static void NONRET __attribute__((format(printf,1,2))) |
|
242 | err(char *msg, ...) |
|
242 | err(char *msg, ...) |
|
243 | { |
|
243 | { |
|
244 | va_list args; |
|
244 | va_list args; |
|
245 | va_start(args, msg); |
|
245 | va_start(args, msg); |
|
246 | flush_line(); |
|
246 | flush_line(); |
|
247 | if (msg[0] && msg[1] && msg[2] == ':' && msg[3] == ' ') |
|
247 | if (msg[0] && msg[1] && msg[2] == ':' && msg[3] == ' ') |
|
248 | { |
|
248 | { |
|
249 | meta_printf("status:%c%c\n", msg[0], msg[1]); |
|
249 | meta_printf("status:%c%c\n", msg[0], msg[1]); |
|
250 | msg += 4; |
|
250 | msg += 4; |
|
251 | } |
|
251 | } |
|
252 | char buf[1024]; |
|
252 | char buf[1024]; |
|
253 | vsnprintf(buf, sizeof(buf), msg, args); |
|
253 | vsnprintf(buf, sizeof(buf), msg, args); |
|
254 | meta_printf("message:%s\n", buf); |
|
254 | meta_printf("message:%s\n", buf); |
|
255 | fputs(buf, stderr); |
|
255 | fputs(buf, stderr); |
|
256 | fputc('\n', stderr); |
|
256 | fputc('\n', stderr); |
|
257 | box_exit(1); |
|
257 | box_exit(1); |
|
258 | } |
|
258 | } |
|
259 |
|
259 | ||
|
260 | /* Write a message, but only if in verbose mode */ |
|
260 | /* Write a message, but only if in verbose mode */ |
|
261 | static void __attribute__((format(printf,1,2))) |
|
261 | static void __attribute__((format(printf,1,2))) |
|
262 | msg(char *msg, ...) |
|
262 | msg(char *msg, ...) |
|
263 | { |
|
263 | { |
|
264 | va_list args; |
|
264 | va_list args; |
|
265 | va_start(args, msg); |
|
265 | va_start(args, msg); |
|
266 | if (verbose) |
|
266 | if (verbose) |
|
267 | { |
|
267 | { |
|
268 | int len = strlen(msg); |
|
268 | int len = strlen(msg); |
|
269 | if (len > 0) |
|
269 | if (len > 0) |
|
270 | partial_line = (msg[len-1] != '\n'); |
|
270 | partial_line = (msg[len-1] != '\n'); |
|
271 | vfprintf(stderr, msg, args); |
|
271 | vfprintf(stderr, msg, args); |
|
272 | fflush(stderr); |
|
272 | fflush(stderr); |
|
273 | } |
|
273 | } |
|
274 | va_end(args); |
|
274 | va_end(args); |
|
275 | } |
|
275 | } |
|
276 |
|
276 | ||
|
277 | static void * |
|
277 | static void * |
|
278 | xmalloc(size_t size) |
|
278 | xmalloc(size_t size) |
|
279 | { |
|
279 | { |
|
280 | void *p = malloc(size); |
|
280 | void *p = malloc(size); |
|
281 | if (!p) |
|
281 | if (!p) |
|
282 | die("Out of memory"); |
|
282 | die("Out of memory"); |
|
283 | return p; |
|
283 | return p; |
|
284 | } |
|
284 | } |
|
285 |
|
285 | ||
|
286 | /*** Syscall rules ***/ |
|
286 | /*** Syscall rules ***/ |
|
287 |
|
287 | ||
|
288 | static const char * const syscall_names[] = { |
|
288 | static const char * const syscall_names[] = { |
|
289 |
|
289 | ||
|
290 | /* Syscall table automatically generated by mk-syscall-table */ |
|
290 | /* Syscall table automatically generated by mk-syscall-table */ |
|
291 |
|
291 | ||
|
292 | /* 0 */ [ __NR_read ] = "read", |
|
292 | /* 0 */ [ __NR_read ] = "read", |
|
293 | /* 1 */ [ __NR_write ] = "write", |
|
293 | /* 1 */ [ __NR_write ] = "write", |
|
294 | /* 2 */ [ __NR_open ] = "open", |
|
294 | /* 2 */ [ __NR_open ] = "open", |
|
295 | /* 3 */ [ __NR_close ] = "close", |
|
295 | /* 3 */ [ __NR_close ] = "close", |
|
296 | /* 4 */ [ __NR_stat ] = "stat", |
|
296 | /* 4 */ [ __NR_stat ] = "stat", |
|
297 | /* 5 */ [ __NR_fstat ] = "fstat", |
|
297 | /* 5 */ [ __NR_fstat ] = "fstat", |
|
298 | /* 6 */ [ __NR_lstat ] = "lstat", |
|
298 | /* 6 */ [ __NR_lstat ] = "lstat", |
|
299 | /* 7 */ [ __NR_poll ] = "poll", |
|
299 | /* 7 */ [ __NR_poll ] = "poll", |
|
300 | /* 8 */ [ __NR_lseek ] = "lseek", |
|
300 | /* 8 */ [ __NR_lseek ] = "lseek", |
|
301 | /* 9 */ [ __NR_mmap ] = "mmap", |
|
301 | /* 9 */ [ __NR_mmap ] = "mmap", |
|
302 | /* 10 */ [ __NR_mprotect ] = "mprotect", |
|
302 | /* 10 */ [ __NR_mprotect ] = "mprotect", |
|
303 | /* 11 */ [ __NR_munmap ] = "munmap", |
|
303 | /* 11 */ [ __NR_munmap ] = "munmap", |
|
304 | /* 12 */ [ __NR_brk ] = "brk", |
|
304 | /* 12 */ [ __NR_brk ] = "brk", |
|
305 | /* 13 */ [ __NR_rt_sigaction ] = "rt_sigaction", |
|
305 | /* 13 */ [ __NR_rt_sigaction ] = "rt_sigaction", |
|
306 | /* 14 */ [ __NR_rt_sigprocmask ] = "rt_sigprocmask", |
|
306 | /* 14 */ [ __NR_rt_sigprocmask ] = "rt_sigprocmask", |
|
307 | /* 15 */ [ __NR_rt_sigreturn ] = "rt_sigreturn", |
|
307 | /* 15 */ [ __NR_rt_sigreturn ] = "rt_sigreturn", |
|
308 | /* 16 */ [ __NR_ioctl ] = "ioctl", |
|
308 | /* 16 */ [ __NR_ioctl ] = "ioctl", |
|
309 | /* 17 */ [ __NR_pread64 ] = "pread64", |
|
309 | /* 17 */ [ __NR_pread64 ] = "pread64", |
|
310 | /* 18 */ [ __NR_pwrite64 ] = "pwrite64", |
|
310 | /* 18 */ [ __NR_pwrite64 ] = "pwrite64", |
|
311 | /* 19 */ [ __NR_readv ] = "readv", |
|
311 | /* 19 */ [ __NR_readv ] = "readv", |
|
312 | /* 20 */ [ __NR_writev ] = "writev", |
|
312 | /* 20 */ [ __NR_writev ] = "writev", |
|
313 | /* 21 */ [ __NR_access ] = "access", |
|
313 | /* 21 */ [ __NR_access ] = "access", |
|
314 | /* 22 */ [ __NR_pipe ] = "pipe", |
|
314 | /* 22 */ [ __NR_pipe ] = "pipe", |
|
315 | /* 23 */ [ __NR_select ] = "select", |
|
315 | /* 23 */ [ __NR_select ] = "select", |
|
316 | /* 24 */ [ __NR_sched_yield ] = "sched_yield", |
|
316 | /* 24 */ [ __NR_sched_yield ] = "sched_yield", |
|
317 | /* 25 */ [ __NR_mremap ] = "mremap", |
|
317 | /* 25 */ [ __NR_mremap ] = "mremap", |
|
318 | /* 26 */ [ __NR_msync ] = "msync", |
|
318 | /* 26 */ [ __NR_msync ] = "msync", |
|
319 | /* 27 */ [ __NR_mincore ] = "mincore", |
|
319 | /* 27 */ [ __NR_mincore ] = "mincore", |
|
320 | /* 28 */ [ __NR_madvise ] = "madvise", |
|
320 | /* 28 */ [ __NR_madvise ] = "madvise", |
|
321 | /* 29 */ [ __NR_shmget ] = "shmget", |
|
321 | /* 29 */ [ __NR_shmget ] = "shmget", |
|
322 | /* 30 */ [ __NR_shmat ] = "shmat", |
|
322 | /* 30 */ [ __NR_shmat ] = "shmat", |
|
323 | /* 31 */ [ __NR_shmctl ] = "shmctl", |
|
323 | /* 31 */ [ __NR_shmctl ] = "shmctl", |
|
324 | /* 32 */ [ __NR_dup ] = "dup", |
|
324 | /* 32 */ [ __NR_dup ] = "dup", |
|
325 | /* 33 */ [ __NR_dup2 ] = "dup2", |
|
325 | /* 33 */ [ __NR_dup2 ] = "dup2", |
|
326 | /* 34 */ [ __NR_pause ] = "pause", |
|
326 | /* 34 */ [ __NR_pause ] = "pause", |
|
327 | /* 35 */ [ __NR_nanosleep ] = "nanosleep", |
|
327 | /* 35 */ [ __NR_nanosleep ] = "nanosleep", |
|
328 | /* 36 */ [ __NR_getitimer ] = "getitimer", |
|
328 | /* 36 */ [ __NR_getitimer ] = "getitimer", |
|
329 | /* 37 */ [ __NR_alarm ] = "alarm", |
|
329 | /* 37 */ [ __NR_alarm ] = "alarm", |
|
330 | /* 38 */ [ __NR_setitimer ] = "setitimer", |
|
330 | /* 38 */ [ __NR_setitimer ] = "setitimer", |
|
331 | /* 39 */ [ __NR_getpid ] = "getpid", |
|
331 | /* 39 */ [ __NR_getpid ] = "getpid", |
|
332 | /* 40 */ [ __NR_sendfile ] = "sendfile", |
|
332 | /* 40 */ [ __NR_sendfile ] = "sendfile", |
|
333 | /* 41 */ [ __NR_socket ] = "socket", |
|
333 | /* 41 */ [ __NR_socket ] = "socket", |
|
334 | /* 42 */ [ __NR_connect ] = "connect", |
|
334 | /* 42 */ [ __NR_connect ] = "connect", |
|
335 | /* 43 */ [ __NR_accept ] = "accept", |
|
335 | /* 43 */ [ __NR_accept ] = "accept", |
|
336 | /* 44 */ [ __NR_sendto ] = "sendto", |
|
336 | /* 44 */ [ __NR_sendto ] = "sendto", |
|
337 | /* 45 */ [ __NR_recvfrom ] = "recvfrom", |
|
337 | /* 45 */ [ __NR_recvfrom ] = "recvfrom", |
|
338 | /* 46 */ [ __NR_sendmsg ] = "sendmsg", |
|
338 | /* 46 */ [ __NR_sendmsg ] = "sendmsg", |
|
339 | /* 47 */ [ __NR_recvmsg ] = "recvmsg", |
|
339 | /* 47 */ [ __NR_recvmsg ] = "recvmsg", |
|
340 | /* 48 */ [ __NR_shutdown ] = "shutdown", |
|
340 | /* 48 */ [ __NR_shutdown ] = "shutdown", |
|
341 | /* 49 */ [ __NR_bind ] = "bind", |
|
341 | /* 49 */ [ __NR_bind ] = "bind", |
|
342 | /* 50 */ [ __NR_listen ] = "listen", |
|
342 | /* 50 */ [ __NR_listen ] = "listen", |
|
343 | /* 51 */ [ __NR_getsockname ] = "getsockname", |
|
343 | /* 51 */ [ __NR_getsockname ] = "getsockname", |
|
344 | /* 52 */ [ __NR_getpeername ] = "getpeername", |
|
344 | /* 52 */ [ __NR_getpeername ] = "getpeername", |
|
345 | /* 53 */ [ __NR_socketpair ] = "socketpair", |
|
345 | /* 53 */ [ __NR_socketpair ] = "socketpair", |
|
346 | /* 54 */ [ __NR_setsockopt ] = "setsockopt", |
|
346 | /* 54 */ [ __NR_setsockopt ] = "setsockopt", |
|
347 | /* 55 */ [ __NR_getsockopt ] = "getsockopt", |
|
347 | /* 55 */ [ __NR_getsockopt ] = "getsockopt", |
|
348 | /* 56 */ [ __NR_clone ] = "clone", |
|
348 | /* 56 */ [ __NR_clone ] = "clone", |
|
349 | /* 57 */ [ __NR_fork ] = "fork", |
|
349 | /* 57 */ [ __NR_fork ] = "fork", |
|
350 | /* 58 */ [ __NR_vfork ] = "vfork", |
|
350 | /* 58 */ [ __NR_vfork ] = "vfork", |
|
351 | /* 59 */ [ __NR_execve ] = "execve", |
|
351 | /* 59 */ [ __NR_execve ] = "execve", |
|
352 | /* 60 */ [ __NR_exit ] = "exit", |
|
352 | /* 60 */ [ __NR_exit ] = "exit", |
|
353 | /* 61 */ [ __NR_wait4 ] = "wait4", |
|
353 | /* 61 */ [ __NR_wait4 ] = "wait4", |
|
354 | /* 62 */ [ __NR_kill ] = "kill", |
|
354 | /* 62 */ [ __NR_kill ] = "kill", |
|
355 | /* 63 */ [ __NR_uname ] = "uname", |
|
355 | /* 63 */ [ __NR_uname ] = "uname", |
|
356 | /* 64 */ [ __NR_semget ] = "semget", |
|
356 | /* 64 */ [ __NR_semget ] = "semget", |
|
357 | /* 65 */ [ __NR_semop ] = "semop", |
|
357 | /* 65 */ [ __NR_semop ] = "semop", |
|
358 | /* 66 */ [ __NR_semctl ] = "semctl", |
|
358 | /* 66 */ [ __NR_semctl ] = "semctl", |
|
359 | /* 67 */ [ __NR_shmdt ] = "shmdt", |
|
359 | /* 67 */ [ __NR_shmdt ] = "shmdt", |
|
360 | /* 68 */ [ __NR_msgget ] = "msgget", |
|
360 | /* 68 */ [ __NR_msgget ] = "msgget", |
|
361 | /* 69 */ [ __NR_msgsnd ] = "msgsnd", |
|
361 | /* 69 */ [ __NR_msgsnd ] = "msgsnd", |
|
362 | /* 70 */ [ __NR_msgrcv ] = "msgrcv", |
|
362 | /* 70 */ [ __NR_msgrcv ] = "msgrcv", |
|
363 | /* 71 */ [ __NR_msgctl ] = "msgctl", |
|
363 | /* 71 */ [ __NR_msgctl ] = "msgctl", |
|
364 | /* 72 */ [ __NR_fcntl ] = "fcntl", |
|
364 | /* 72 */ [ __NR_fcntl ] = "fcntl", |
|
365 | /* 73 */ [ __NR_flock ] = "flock", |
|
365 | /* 73 */ [ __NR_flock ] = "flock", |
|
366 | /* 74 */ [ __NR_fsync ] = "fsync", |
|
366 | /* 74 */ [ __NR_fsync ] = "fsync", |
|
367 | /* 75 */ [ __NR_fdatasync ] = "fdatasync", |
|
367 | /* 75 */ [ __NR_fdatasync ] = "fdatasync", |
|
368 | /* 76 */ [ __NR_truncate ] = "truncate", |
|
368 | /* 76 */ [ __NR_truncate ] = "truncate", |
|
369 | /* 77 */ [ __NR_ftruncate ] = "ftruncate", |
|
369 | /* 77 */ [ __NR_ftruncate ] = "ftruncate", |
|
370 | /* 78 */ [ __NR_getdents ] = "getdents", |
|
370 | /* 78 */ [ __NR_getdents ] = "getdents", |
|
371 | /* 79 */ [ __NR_getcwd ] = "getcwd", |
|
371 | /* 79 */ [ __NR_getcwd ] = "getcwd", |
|
372 | /* 80 */ [ __NR_chdir ] = "chdir", |
|
372 | /* 80 */ [ __NR_chdir ] = "chdir", |
|
373 | /* 81 */ [ __NR_fchdir ] = "fchdir", |
|
373 | /* 81 */ [ __NR_fchdir ] = "fchdir", |
|
374 | /* 82 */ [ __NR_rename ] = "rename", |
|
374 | /* 82 */ [ __NR_rename ] = "rename", |
|
375 | /* 83 */ [ __NR_mkdir ] = "mkdir", |
|
375 | /* 83 */ [ __NR_mkdir ] = "mkdir", |
|
376 | /* 84 */ [ __NR_rmdir ] = "rmdir", |
|
376 | /* 84 */ [ __NR_rmdir ] = "rmdir", |
|
377 | /* 85 */ [ __NR_creat ] = "creat", |
|
377 | /* 85 */ [ __NR_creat ] = "creat", |
|
378 | /* 86 */ [ __NR_link ] = "link", |
|
378 | /* 86 */ [ __NR_link ] = "link", |
|
379 | /* 87 */ [ __NR_unlink ] = "unlink", |
|
379 | /* 87 */ [ __NR_unlink ] = "unlink", |
|
380 | /* 88 */ [ __NR_symlink ] = "symlink", |
|
380 | /* 88 */ [ __NR_symlink ] = "symlink", |
|
381 | /* 89 */ [ __NR_readlink ] = "readlink", |
|
381 | /* 89 */ [ __NR_readlink ] = "readlink", |
|
382 | /* 90 */ [ __NR_chmod ] = "chmod", |
|
382 | /* 90 */ [ __NR_chmod ] = "chmod", |
|
383 | /* 91 */ [ __NR_fchmod ] = "fchmod", |
|
383 | /* 91 */ [ __NR_fchmod ] = "fchmod", |
|
384 | /* 92 */ [ __NR_chown ] = "chown", |
|
384 | /* 92 */ [ __NR_chown ] = "chown", |
|
385 | /* 93 */ [ __NR_fchown ] = "fchown", |
|
385 | /* 93 */ [ __NR_fchown ] = "fchown", |
|
386 | /* 94 */ [ __NR_lchown ] = "lchown", |
|
386 | /* 94 */ [ __NR_lchown ] = "lchown", |
|
387 | /* 95 */ [ __NR_umask ] = "umask", |
|
387 | /* 95 */ [ __NR_umask ] = "umask", |
|
388 | /* 96 */ [ __NR_gettimeofday ] = "gettimeofday", |
|
388 | /* 96 */ [ __NR_gettimeofday ] = "gettimeofday", |
|
389 | /* 97 */ [ __NR_getrlimit ] = "getrlimit", |
|
389 | /* 97 */ [ __NR_getrlimit ] = "getrlimit", |
|
390 | /* 98 */ [ __NR_getrusage ] = "getrusage", |
|
390 | /* 98 */ [ __NR_getrusage ] = "getrusage", |
|
391 | /* 99 */ [ __NR_sysinfo ] = "sysinfo", |
|
391 | /* 99 */ [ __NR_sysinfo ] = "sysinfo", |
|
392 | /* 100 */ [ __NR_times ] = "times", |
|
392 | /* 100 */ [ __NR_times ] = "times", |
|
393 | /* 101 */ [ __NR_ptrace ] = "ptrace", |
|
393 | /* 101 */ [ __NR_ptrace ] = "ptrace", |
|
394 | /* 102 */ [ __NR_getuid ] = "getuid", |
|
394 | /* 102 */ [ __NR_getuid ] = "getuid", |
|
395 | /* 103 */ [ __NR_syslog ] = "syslog", |
|
395 | /* 103 */ [ __NR_syslog ] = "syslog", |
|
396 | /* 104 */ [ __NR_getgid ] = "getgid", |
|
396 | /* 104 */ [ __NR_getgid ] = "getgid", |
|
397 | /* 105 */ [ __NR_setuid ] = "setuid", |
|
397 | /* 105 */ [ __NR_setuid ] = "setuid", |
|
398 | /* 106 */ [ __NR_setgid ] = "setgid", |
|
398 | /* 106 */ [ __NR_setgid ] = "setgid", |
|
399 | /* 107 */ [ __NR_geteuid ] = "geteuid", |
|
399 | /* 107 */ [ __NR_geteuid ] = "geteuid", |
|
400 | /* 108 */ [ __NR_getegid ] = "getegid", |
|
400 | /* 108 */ [ __NR_getegid ] = "getegid", |
|
401 | /* 109 */ [ __NR_setpgid ] = "setpgid", |
|
401 | /* 109 */ [ __NR_setpgid ] = "setpgid", |
|
402 | /* 110 */ [ __NR_getppid ] = "getppid", |
|
402 | /* 110 */ [ __NR_getppid ] = "getppid", |
|
403 | /* 111 */ [ __NR_getpgrp ] = "getpgrp", |
|
403 | /* 111 */ [ __NR_getpgrp ] = "getpgrp", |
|
404 | /* 112 */ [ __NR_setsid ] = "setsid", |
|
404 | /* 112 */ [ __NR_setsid ] = "setsid", |
@@ -1,106 +1,108 | |||||
|
1 | #!/usr/bin/env ruby |
|
1 | #!/usr/bin/env ruby |
|
2 |
|
2 | ||
|
3 | CORRECT_MARK = 'P' |
|
3 | CORRECT_MARK = 'P' |
|
4 | INCORRECT_MARK = '-' |
|
4 | INCORRECT_MARK = '-' |
|
5 | TIMEOUT_MARK = 'T' |
|
5 | TIMEOUT_MARK = 'T' |
|
6 | RUN_ERROR_MARK = 'x' |
|
6 | RUN_ERROR_MARK = 'x' |
|
7 |
|
7 | ||
|
8 | def log(str='') |
|
8 | def log(str='') |
|
9 | if ENV['TALKATIVE']!=nil |
|
9 | if ENV['TALKATIVE']!=nil |
|
10 | puts str |
|
10 | puts str |
|
11 | end |
|
11 | end |
|
12 | if ENV['GRADER_LOGGING']!=nil |
|
12 | if ENV['GRADER_LOGGING']!=nil |
|
13 | log_fname = ENV['GRADER_LOGGING'] |
|
13 | log_fname = ENV['GRADER_LOGGING'] |
|
14 | fp = File.open(log_fname,"a") |
|
14 | fp = File.open(log_fname,"a") |
|
15 | fp.puts("grade: #{Time.new.strftime("%H:%M")} #{str}") |
|
15 | fp.puts("grade: #{Time.new.strftime("%H:%M")} #{str}") |
|
16 | fp.close |
|
16 | fp.close |
|
17 | end |
|
17 | end |
|
18 | end |
|
18 | end |
|
19 |
|
19 | ||
|
20 | def char_comment(comment) |
|
20 | def char_comment(comment) |
|
21 | if comment =~ /[Ii]ncorrect/ |
|
21 | if comment =~ /[Ii]ncorrect/ |
|
22 | INCORRECT_MARK |
|
22 | INCORRECT_MARK |
|
23 | elsif comment =~ /[Cc]orrect/ |
|
23 | elsif comment =~ /[Cc]orrect/ |
|
24 | CORRECT_MARK |
|
24 | CORRECT_MARK |
|
25 | elsif comment =~ /[Tt]ime/ |
|
25 | elsif comment =~ /[Tt]ime/ |
|
26 | TIMEOUT_MARK |
|
26 | TIMEOUT_MARK |
|
27 | elsif res = /^[Cc]omment:(.*)$/.match(comment) |
|
27 | elsif res = /^[Cc]omment:(.*)$/.match(comment) |
|
28 | res[1] |
|
28 | res[1] |
|
29 | else |
|
29 | else |
|
30 | RUN_ERROR_MARK # these are run time errors |
|
30 | RUN_ERROR_MARK # these are run time errors |
|
31 | end |
|
31 | end |
|
32 | end |
|
32 | end |
|
33 |
|
33 | ||
|
34 | problem_home = ENV['PROBLEM_HOME'] |
|
34 | problem_home = ENV['PROBLEM_HOME'] |
|
35 | require "#{problem_home}/script/test_dsl.rb" |
|
35 | require "#{problem_home}/script/test_dsl.rb" |
|
36 | load "#{problem_home}/test_cases/all_tests.cfg" |
|
36 | load "#{problem_home}/test_cases/all_tests.cfg" |
|
37 | problem = Problem.get_instance |
|
37 | problem = Problem.get_instance |
|
38 |
|
38 | ||
|
39 | if problem.well_formed? == false |
|
39 | if problem.well_formed? == false |
|
40 | log "The problem specification is not well formed." |
|
40 | log "The problem specification is not well formed." |
|
41 | exit(127) |
|
41 | exit(127) |
|
42 | end |
|
42 | end |
|
43 |
|
43 | ||
|
44 | all_score = 0 |
|
44 | all_score = 0 |
|
45 | all_comment = '' |
|
45 | all_comment = '' |
|
46 | (1..(problem.runs.length-1)).each do |k| |
|
46 | (1..(problem.runs.length-1)).each do |k| |
|
47 | log "grade run #{k}" |
|
47 | log "grade run #{k}" |
|
48 | run = problem.runs[k] |
|
48 | run = problem.runs[k] |
|
49 | run_score = nil |
|
49 | run_score = nil |
|
50 | run_comment = '' |
|
50 | run_comment = '' |
|
51 | run_comment_short = '' |
|
51 | run_comment_short = '' |
|
52 | run.tests.each do |test_num| |
|
52 | run.tests.each do |test_num| |
|
53 | result_file_name = "#{test_num}/result" |
|
53 | result_file_name = "#{test_num}/result" |
|
54 | if not File.exists?(result_file_name) |
|
54 | if not File.exists?(result_file_name) |
|
55 | run_comment += "result file for test #{test_num} not found\n" |
|
55 | run_comment += "result file for test #{test_num} not found\n" |
|
56 | run_comment_short += RUN_ERROR_MARK |
|
56 | run_comment_short += RUN_ERROR_MARK |
|
57 | log "Cannot find the file #{test_num}/result!" |
|
57 | log "Cannot find the file #{test_num}/result!" |
|
58 | else |
|
58 | else |
|
59 | result_file = File.new(result_file_name, "r") |
|
59 | result_file = File.new(result_file_name, "r") |
|
60 | result_file_lines = result_file.readlines |
|
60 | result_file_lines = result_file.readlines |
|
61 | if result_file_lines.length>=2 |
|
61 | if result_file_lines.length>=2 |
|
62 | current_run_score = result_file_lines[1].to_i |
|
62 | current_run_score = result_file_lines[1].to_i |
|
63 | run_comment += result_file_lines[0] |
|
63 | run_comment += result_file_lines[0] |
|
64 | run_comment_short += char_comment(result_file_lines[0].chomp) |
|
64 | run_comment_short += char_comment(result_file_lines[0].chomp) |
|
65 | else |
|
65 | else |
|
66 | current_run_score = 0 |
|
66 | current_run_score = 0 |
|
67 | run_comment += "result file for test #{test_num} error\n" |
|
67 | run_comment += "result file for test #{test_num} error\n" |
|
68 | run_comment_short += RUN_ERROR_MARK |
|
68 | run_comment_short += RUN_ERROR_MARK |
|
69 | log "Error in #{test_num}/result!" |
|
69 | log "Error in #{test_num}/result!" |
|
70 | end |
|
70 | end |
|
71 |
|
71 | ||
|
72 | # the score of this run should be the minimum of the score for |
|
72 | # the score of this run should be the minimum of the score for |
|
73 | # each test case |
|
73 | # each test case |
|
74 | if (run_score==nil) or (run_score>current_run_score) |
|
74 | if (run_score==nil) or (run_score>current_run_score) |
|
75 | run_score = current_run_score |
|
75 | run_score = current_run_score |
|
76 | end |
|
76 | end |
|
77 | result_file.close |
|
77 | result_file.close |
|
78 | end |
|
78 | end |
|
79 | end |
|
79 | end |
|
80 |
|
80 | ||
|
81 | run_result_file = File.new("result-#{k}", "w") |
|
81 | run_result_file = File.new("result-#{k}", "w") |
|
82 | run_result_file.write run_score |
|
82 | run_result_file.write run_score |
|
83 | run_result_file.write "\n" |
|
83 | run_result_file.write "\n" |
|
84 | run_result_file.close |
|
84 | run_result_file.close |
|
85 |
|
85 | ||
|
86 | run_comment_file = File.new("comment-#{k}", "w") |
|
86 | run_comment_file = File.new("comment-#{k}", "w") |
|
87 | run_comment_file.write "#{run_comment}\n" |
|
87 | run_comment_file.write "#{run_comment}\n" |
|
88 | run_comment_file.close |
|
88 | run_comment_file.close |
|
89 |
|
89 | ||
|
90 | all_score = all_score + run_score |
|
90 | all_score = all_score + run_score |
|
91 |
|
91 | ||
|
92 | # append comment for test run with many test cases |
|
92 | # append comment for test run with many test cases |
|
93 | if run.tests.length > 1 |
|
93 | if run.tests.length > 1 |
|
94 | run_comment_short = '[' + run_comment_short + ']' |
|
94 | run_comment_short = '[' + run_comment_short + ']' |
|
95 | end |
|
95 | end |
|
96 | all_comment += run_comment_short |
|
96 | all_comment += run_comment_short |
|
97 | end |
|
97 | end |
|
98 |
|
98 | ||
|
99 | result_file = File.new("result", "w") |
|
99 | result_file = File.new("result", "w") |
|
100 | result_file.write all_score |
|
100 | result_file.write all_score |
|
101 | result_file.write "\n" |
|
101 | result_file.write "\n" |
|
102 | result_file.close |
|
102 | result_file.close |
|
103 |
|
103 | ||
|
104 | comment_file = File.new("comment", "w") |
|
104 | comment_file = File.new("comment", "w") |
|
105 | comment_file.write "#{all_comment}\n" |
|
105 | comment_file.write "#{all_comment}\n" |
|
106 | comment_file.close |
|
106 | comment_file.close |
|
|
107 | + | ||
|
|
108 | + log "score = #{all_score} comment = #{all_comment}" |
You need to be logged in to leave comments.
Login now