static int run(struct iperf_test *test) { int consecutive_errors; /* Termination signals. */ iperf_catch_sigend(sigend_handler); if (setjmp(sigend_jmp_buf)) iperf_got_sigend(test); switch (test->role) { case 's': if (test->daemon) { int rc = daemon(0, 0); if (rc < 0) { i_errno = IEDAEMON; iperf_errexit(test, "error - %s", iperf_strerror(i_errno)); } } consecutive_errors = 0; if (iperf_create_pidfile(test) < 0) { i_errno = IEPIDFILE; iperf_errexit(test, "error - %s", iperf_strerror(i_errno)); } for (;;) { if (iperf_run_server(test) < 0) { iperf_err(test, "error - %s", iperf_strerror(i_errno)); ++consecutive_errors; if (consecutive_errors >= 5) { iperf_errexit(test, "too many errors, exiting"); break; } } else consecutive_errors = 0; iperf_reset_test(test); if (iperf_get_test_one_off(test)) break; } iperf_delete_pidfile(test); break; case 'c': if (iperf_run_client(test) < 0) iperf_errexit(test, "error - %s", iperf_strerror(i_errno)); break; default: usage(); break; } iperf_catch_sigend(SIG_DFL); return 0; }
static int run(struct iperf_test *test) { int consecutive_errors; switch (test->role) { case 's': if (test->daemon) { int rc = daemon(0, 0); if (rc < 0) { i_errno = IEDAEMON; iperf_errexit(test, "error - %s", iperf_strerror(i_errno)); } } consecutive_errors = 0; if (iperf_create_pidfile(test) < 0) { i_errno = IEPIDFILE; iperf_errexit(test, "error - %s", iperf_strerror(i_errno)); } for (;;) { if (iperf_run_server(test) < 0) { iperf_err(test, "error - %s", iperf_strerror(i_errno)); fprintf(stderr, "\n"); ++consecutive_errors; if (consecutive_errors >= 5) { fprintf(stderr, "too many errors, exiting\n"); break; } } else consecutive_errors = 0; iperf_reset_test(test); if (iperf_get_test_one_off(test)) break; } iperf_delete_pidfile(test); break; case 'c': if (iperf_run_client(test) < 0) iperf_errexit(test, "error - %s", iperf_strerror(i_errno)); break; default: usage(); break; } return 0; }
/* Do a printf to stderr or log file as appropriate, then exit. */ void iperf_errexit(struct iperf_test *test, const char *format, ...) { va_list argp; char str[1000]; va_start(argp, format); vsnprintf(str, sizeof(str), format, argp); if (test != NULL && test->json_output && test->json_top != NULL) { cJSON_AddStringToObject(test->json_top, "error", str); iperf_json_finish(test); } else if (test && test->outfile) { fprintf(test->outfile, "iperf3: %s\n", str); } else { fprintf(stderr, "iperf3: %s\n", str); } va_end(argp); iperf_delete_pidfile(test); exit(1); }