| // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| // Force .lib-file creation on Windows, make ninja happy with zero-build. |
| #if defined(_WIN32) |
| extern "C" __declspec(dllexport) void dummy() {} |
| #endif |
| |
| #if defined(__has_feature) |
| #if __has_feature(undefined_behavior_sanitizer) |
| __attribute__((no_sanitize("undefined"))) |
| #endif |
| #endif |
| void Crash() { |
| int* segfault = NULL; |
| *segfault = 1; |
| } |
| |
| /* |
| * Run ./process_test <outstream> <echocount> <exitcode> <crash> |
| * <outstream>: 0 = stdout, 1 = stderr, 2 = stdout and stderr |
| * <echocount>: program terminates after <echocount> replies |
| * <exitcode>: program terminates with exit code <exitcode> |
| * <crash>: 0 = program terminates regularly, 1 = program segfaults |
| */ |
| int main(int argc, char* argv[]) { |
| if (argc != 5) { |
| fprintf(stderr, |
| "./process_test <outstream> <echocount> <exitcode> <crash>\n"); |
| exit(1); |
| } |
| |
| int outstream = atoi(argv[1]); |
| if (outstream < 0 || outstream > 2) { |
| fprintf(stderr, "unknown outstream"); |
| exit(1); |
| } |
| |
| int echo_counter = 0; |
| int echo_count = atoi(argv[2]); |
| int exit_code = atoi(argv[3]); |
| int crash = atoi(argv[4]); |
| |
| if (crash == 1) { |
| Crash(); |
| } |
| |
| const int kLineSize = 128; |
| char line[kLineSize]; |
| |
| while ((echo_count != echo_counter) && |
| (fgets(line, kLineSize, stdin) != NULL)) { |
| if (outstream == 0) { |
| fprintf(stdout, "%s", line); |
| fflush(stdout); |
| } else if (outstream == 1) { |
| fprintf(stderr, "%s", line); |
| fflush(stderr); |
| } else if (outstream == 2) { |
| fprintf(stdout, "%s", line); |
| fprintf(stderr, "%s", line); |
| fflush(stdout); |
| fflush(stderr); |
| } |
| echo_counter++; |
| } |
| |
| return exit_code; |
| } |