static char * capture_vsctl_valist(const char *arg0, va_list args) { char *stdout_log, *stderr_log; enum vlog_level log_level; struct svec argv; int status; char *msg; /* Compose arguments. */ svec_init(&argv); svec_add(&argv, arg0); for (;;) { const char *arg = va_arg(args, const char *); if (!arg) { break; } svec_add(&argv, arg); } svec_terminate(&argv); /* Run process. */ if (process_run_capture(argv.names, &stdout_log, &stderr_log, SIZE_MAX, &status)) { svec_destroy(&argv); return NULL; } /* Log results. */ if (WIFEXITED(status)) { int code = WEXITSTATUS(status); log_level = code == 0 ? VLL_DBG : code == 1 ? VLL_WARN : VLL_ERR; } else { log_level = VLL_ERR; } msg = process_status_msg(status); VLOG(log_level, "ovs-vsctl exited (%s)", msg); if (stdout_log && *stdout_log) { VLOG(log_level, "ovs-vsctl wrote to stdout:\n%s\n", stdout_log); } if (stderr_log && *stderr_log) { VLOG(log_level, "ovs-vsctl wrote to stderr:\n%s\n", stderr_log); } free(msg); svec_destroy(&argv); free(stderr_log); if (WIFEXITED(status) && !WEXITSTATUS(status)) { return stdout_log; } else { free(stdout_log); return NULL; } }
int main(void) { extern struct vlog_module VLM_reconnect; struct reconnect_stats prev; unsigned int old_max_tries; int old_time; char line[128]; vlog_set_levels(&VLM_reconnect, VLF_ANY_FACILITY, VLL_OFF); now = 1000; reconnect = reconnect_create(now); reconnect_set_name(reconnect, "remote"); reconnect_get_stats(reconnect, now, &prev); printf("### t=%d ###\n", now); old_time = now; old_max_tries = reconnect_get_max_tries(reconnect); while (fgets(line, sizeof line, stdin)) { struct reconnect_stats cur; struct svec args; fputs(line, stdout); if (line[0] == '#') { continue; } svec_init(&args); svec_parse_words(&args, line); svec_terminate(&args); if (!svec_is_empty(&args)) { run_command(args.n, args.names, commands); } svec_destroy(&args); if (old_time != now) { printf("\n### t=%d ###\n", now); } reconnect_get_stats(reconnect, now, &cur); diff_stats(&prev, &cur, now - old_time); prev = cur; if (reconnect_get_max_tries(reconnect) != old_max_tries) { old_max_tries = reconnect_get_max_tries(reconnect); printf(" %u tries left\n", old_max_tries); } old_time = now; } return 0; }