int main(int argc, char *argv[]) { program_name = os_GetBasename(argv[0]); logger_set_level(-1, LOG_WARNING); if (argc < 1) die("not enough parameters"); if (argc == 2) { if (!strcmp(argv[1], "--help")) { write_help(); } else if (!strcmp(argv[1], "--version")) { write_version(); } } #if defined EJUDGE_XML_PATH if (!ejudge_xml_path) ejudge_xml_path = EJUDGE_XML_PATH; #endif /* EJUDGE_XML_PATH */ if (!ejudge_xml_path) die("ejudge.xml path is not specified"); if (!(ejudge_config = ejudge_cfg_parse(ejudge_xml_path, 1))) return 1; if (!ejudge_config->contests_dir) die("<contests_dir> tag is not set!"); if (contests_set_directory(ejudge_config->contests_dir) < 0) die("contests directory is invalid"); load_mysql_plugin(); /* consult the main compilation configuration */ compile_cfg_path[0] = 0; if (ejudge_config->compile_home_dir) { snprintf(compile_cfg_path, sizeof(compile_cfg_path), "%s/conf/compile.cfg", ejudge_config->compile_home_dir); } if (!compile_cfg_path[0] && ejudge_config->contests_home_dir) { snprintf(compile_cfg_path, sizeof(compile_cfg_path), "%s/compile/conf/compile.cfg", ejudge_config->contests_home_dir); } #if defined EJUDGE_CONTESTS_HOME_DIR if (!compile_cfg_path[0]) { snprintf(compile_cfg_path, sizeof(compile_cfg_path), "%s/compile/conf/compile.cfg", EJUDGE_CONTESTS_HOME_DIR); } #endif cs_config = prepare_parse_config_file(compile_cfg_path, 0); if (!cs_config) { die("failed to parse compilation configuration file %s", compile_cfg_path); } handle_cs_config(); process_all_contests(); return 0; }
int main(int argc, char *argv[]) { int i = 1, r = 0; const char *command = 0; const char *ejudge_xml_path = 0; struct ejudge_cfg *config = 0; int cmd = 0; int super_serve_fd = -1; int signum = 0; const unsigned char *signame = ""; int pid; program_name = os_GetBasename(argv[0]); if (argc < 2) startup_error("not enough parameters"); if (!strcmp(argv[i], "--help")) { write_help(); } else if (!strcmp(argv[i], "--version")) { write_version(); } command = argv[i]; i++; if (i < argc) { ejudge_xml_path = argv[i]; i++; } if (i < argc) startup_error("too many parameters"); #if defined EJUDGE_XML_PATH if (!ejudge_xml_path) ejudge_xml_path = EJUDGE_XML_PATH; #endif /* EJUDGE_XML_PATH */ if (!ejudge_xml_path) startup_error("ejudge.xml path is not specified"); if (!(config = ejudge_cfg_parse(ejudge_xml_path))) return 1; if (!strcmp(command, "stop")) { cmd = SSERV_CMD_STOP; signum = START_STOP; signame = "TERM"; } else if (!strcmp(command, "restart")) { cmd = SSERV_CMD_RESTART; signum = START_RESTART; signame = "HUP"; } else { startup_error("invalid command"); } (void) signame; (void) signum; if (!(pid = start_find_process("ej-super-server", 0))) { op_error("ej-super-server is not running"); } else if (pid > 0) { /* fprintf(stderr, "%s: ej-super-server is running as pid %d\n", program_name, pid); fprintf(stderr, "%s: sending it the %s signal\n", program_name, signame); if (start_kill(pid, signum) < 0) op_error("failed: %s", os_ErrorMsg()); return 0; */ } if ((super_serve_fd = super_clnt_open(config->super_serve_socket)) < 0) op_error("ej-super-server is not running"); r = super_clnt_control(super_serve_fd, cmd); if (r < 0) op_error("%s", super_proto_strerror(-r)); return 0; }
int main(int argc, char *argv[]) { int i, j = 0; int create_flag = 0; const unsigned char *user = 0, *group = 0, *workdir = 0; int restart_flag = 0; char **argv_restart = 0; int pid; time_t server_start_time = 0; hr_set_symbolic_action_table(NEW_SRV_ACTION_LAST, ns_symbolic_action_table, ns_submit_button_labels, 0); time(&server_start_time); start_set_self_args(argc, argv); /* certain options should be removed for restart */ XCALLOC(argv_restart, argc + 2); argv_restart[j++] = argv[0]; params.program_name = argv[0]; for (i = 1; i < argc; ) { if (!strcmp(argv[i], "-D")) { params.daemon_mode_flag = 1; i++; } else if (!strcmp(argv[i], "-f")) { params.force_socket_flag = 1; argv_restart[j++] = argv[i]; i++; } else if (!strcmp(argv[i], "--create")) { create_flag = 1; i++; } else if (!strcmp(argv[i], "-u")) { if (++i >= argc) startup_error("invalid usage"); user = argv[i++]; } else if (!strcmp(argv[i], "-g")) { if (++i >= argc) startup_error("invalid usage"); group = argv[i++]; } else if (!strcmp(argv[i], "-C")) { if (++i >= argc) startup_error("invalid usage"); workdir = argv[i++]; } else if (!strcmp(argv[i], "-R")) { params.restart_mode_flag = 1; ++i; } else if (!strcmp(argv[i], "--")) { argv_restart[j++] = argv[i]; i++; break; } else if (argv[i][0] == '-') { startup_error("invalid option `%s'", argv[i]); } else break; } argv_restart[j++] = "-R"; if (i < argc) { argv_restart[j++] = argv[i]; ejudge_xml_path = argv[i++]; } if (i != argc) startup_error("invalid number of parameters"); argv_restart[j] = 0; start_set_args(argv_restart); if (!(pid = start_find_process("ej-contests", 0))) { params.force_socket_flag = 1; } else if (pid > 0) { fprintf(stderr, "%s: is already running as pid %d\n", argv[0], pid); return 1; } if (start_prepare(user, group, workdir) < 0) return 1; if (workdir && *workdir) { if (chdir(workdir) < 0) { err("cannot change directory to %s", workdir); return 1; } } #if defined EJUDGE_XML_PATH if (!ejudge_xml_path) ejudge_xml_path = EJUDGE_XML_PATH; #endif /* EJUDGE_XML_PATH */ if (!ejudge_xml_path) startup_error("configuration file is not specified"); ejudge_config = ejudge_cfg_parse(ejudge_xml_path, 0); if (!ejudge_config) return 1; if (contests_set_directory(ejudge_config->contests_dir) < 0) return 1; l10n_prepare(ejudge_config->l10n, ejudge_config->l10n_dir); if (!strcasecmp(EJUDGE_CHARSET, "UTF-8")) utf8_mode = 1; #if defined EJUDGE_NEW_SERVER_SOCKET if (!ejudge_config->new_server_socket) ejudge_config->new_server_socket = xstrdup(EJUDGE_NEW_SERVER_SOCKET); #endif if (!ejudge_config->new_server_socket) ejudge_config->new_server_socket=xstrdup(EJUDGE_NEW_SERVER_SOCKET_DEFAULT); #if defined EJUDGE_CONTESTS_HOME_DIR if (!ejudge_config->contests_home_dir) ejudge_config->contests_home_dir = xstrdup(EJUDGE_CONTESTS_HOME_DIR); #endif setup_log_file(); info("ej-contests %s, compiled %s", compile_version, compile_date); params.socket_path = ejudge_config->new_server_socket; params.log_path = ejudge_config->new_server_log; if (load_plugins() < 0) return 1; // initialize the default plugin if (nsdb_default->iface->open(nsdb_default->data) < 0) { startup_error("default plugin failed to open its connection"); return 1; } if (create_flag) { if (nsdb_default->iface->create(nsdb_default->data) < 0) { startup_error("database creation failed"); return 1; } if (nsdb_default->iface->close(nsdb_default->data) < 0) { startup_error("database closing failed"); return 1; } return 0; } if (nsdb_default->iface->check(nsdb_default->data) <= 0) { startup_error("default plugin failed to check its data"); return 1; } if (!(state = nsf_init(¶ms, 0, server_start_time))) return 1; if (nsf_prepare(state) < 0) return 1; nsf_main_loop(state); restart_flag = nsf_is_restart_requested(state); ns_unload_contests(); nsf_cleanup(state); nsdb_default->iface->close(nsdb_default->data); if (restart_flag) start_restart(); return 0; }
int main(int argc, char *argv[]) { path_t cpp_opts = { 0 }; int p_flags = 0; int i = 1; unsigned char *user = 0, *group = 0, *workdir = 0; const struct section_global_data *global = 0; time_t contest_finish_time = 0; start_set_self_args(argc, argv); if (argc == 1) goto print_usage; while (i < argc) { if (!strncmp(argv[i], "-D", 2)) { if (cpp_opts[0]) pathcat(cpp_opts, " "); pathcat(cpp_opts, argv[i++]); } else if (!strcmp(argv[i], "-f")) { i++; forced_mode = 1; } else if (!strcmp(argv[i], "-i")) { i++; initialize_mode = 1; } else if (!strncmp(argv[i], "-S", 2)) { int x = 0, n = 0; if (sscanf(argv[i] + 2, "%d%n", &x, &n) != 1 || argv[i][n+2] || x < 0 || x > 10000) { err("invalid parameter for -S"); return 1; } i++; cmdline_socket_fd = x; } else if (!strcmp(argv[i], "-u")) { if (++i >= argc) goto print_usage; user = argv[i++]; } else if (!strcmp(argv[i], "-g")) { if (++i >= argc) goto print_usage; group = argv[i++]; } else if (!strcmp(argv[i], "-C")) { if (++i >= argc) goto print_usage; workdir = argv[i++]; } else break; } if (i >= argc) goto print_usage; if (!initialize_mode) { err("this program now supports only initialize mode"); return 1; } if (start_prepare(user, group, workdir) < 0) return 1; #if defined EJUDGE_XML_PATH if (!ejudge_xml_path) ejudge_xml_path = EJUDGE_XML_PATH; #endif /* EJUDGE_XML_PATH */ if (!ejudge_xml_path) { err("configuration file is not specified"); return 1; } config = ejudge_cfg_parse(ejudge_xml_path, 1); if (!config) return 1; if (contests_set_directory(config->contests_dir) < 0) return 1; // initialize the current time to avoid some asserts serve_state.current_time = time(0); if (prepare(NULL, &serve_state, argv[i], p_flags, PREPARE_SERVE, cpp_opts, (cmdline_socket_fd >= 0), 0, 0) < 0) return 1; if (prepare_serve_defaults(NULL, &serve_state, &cur_contest) < 0) return 1; global = serve_state.global; l10n_prepare(global->enable_l10n, global->l10n_dir); if (create_dirs(&serve_state, PREPARE_SERVE) < 0) return 1; serve_state.teamdb_state = teamdb_init(cur_contest->id); serve_state.xuser_state = team_extra_open(config, cur_contest, global, NULL, 0); if (!serve_state.xuser_state) { err("xuser plugin failed to load"); return 1; } if (!initialize_mode) { if (teamdb_open_client(serve_state.teamdb_state, global->socket_path, cur_contest->id) < 0) return 1; } serve_state.runlog_state = run_init(serve_state.teamdb_state); if (global->contest_finish_time > 0) { contest_finish_time = global->contest_finish_time; } if (contest_finish_time > 0 && contest_finish_time <= serve_state.current_time) { contest_finish_time = 0; } if (run_open(serve_state.runlog_state, config, cur_contest, global, 0, 0, global->contest_time, cur_contest->sched_time, contest_finish_time) < 0) return 1; if (global->is_virtual && global->score_system != SCORE_ACM) { err("invalid score system for virtual contest"); return 1; } serve_state.clarlog_state = clar_init(); if (clar_open(serve_state.clarlog_state, config, cur_contest, global, 0, 0) < 0) return 1; serve_load_status_file(&serve_state); serve_build_compile_dirs(&serve_state); serve_build_run_dirs(&serve_state, cur_contest); if (serve_create_symlinks(&serve_state) < 0) return 1; serve_state.current_time = time(0); serve_update_status_file(&serve_state, 1); if (serve_state.xuser_state) { serve_state.xuser_state->vt->flush(serve_state.xuser_state); } return 0; print_usage: printf("Usage: %s [ OPTS ] config-file\n", argv[0]); printf(" -T - print configuration and exit\n"); printf(" -SSOCK - set a socket fd\n"); printf(" -DDEF - define a symbol for preprocessor\n"); return 0; }
int main(int argc, char *argv[]) { int i = 1, j = 0; char *key = 0; path_t cpp_opts = {0}; int code = 0; int prepare_flags = 0; unsigned char *user = 0, *group = 0, *workdir = 0; #if HAVE_SETSID - 0 path_t log_path; #endif /* HAVE_SETSID */ int pid = -1; char **argv_restart = 0; unsigned char *ejudge_xml_path = 0; unsigned char *compile_cfg_path = 0; path_t compile_cfg_buf = { 0 }; path_t contests_home_dir = { 0 }; path_t compile_home_dir = { 0 }; #if HAVE_OPEN_MEMSTREAM - 0 FILE *lang_log_f = 0; char *lang_log_t = 0; size_t lang_log_z = 0; #endif /* HAVE_OPEN_MEMSTREAM */ path_t tmp_path; int tmp_len; #if defined __WIN32__ path_t tmp_dir = { 0 }; path_t std_compile_home_dir = { 0 }; #endif enum { SUBST_SIZE = 16 }; const unsigned char *subst_src[SUBST_SIZE]; const unsigned char *subst_dst[SUBST_SIZE]; const unsigned char **subst_src_ptr = 0; const unsigned char **subst_dst_ptr = 0; start_set_self_args(argc, argv); XCALLOC(argv_restart, argc + 2); argv_restart[j++] = argv[0]; //if (argc == 1) goto print_usage; code = 1; while (i < argc) { if (!strcmp(argv[i], "-i")) { initialize_mode = 1; i++; } else if (!strcmp(argv[i], "-k")) { if (++i >= argc) goto print_usage; argv_restart[j++] = argv[i]; key = argv[i++]; } else if (!strcmp(argv[i], "-D")) { daemon_mode = 1; i++; } else if (!strcmp(argv[i], "-R")) { restart_mode = 1; i++; } else if (!strncmp(argv[i], "-D", 2)) { if (cpp_opts[0]) pathcat(cpp_opts, " "); argv_restart[j++] = argv[i]; pathcat(cpp_opts, argv[i++]); } else if (!strcmp(argv[i], "-u")) { if (++i >= argc) goto print_usage; user = argv[i++]; } else if (!strcmp(argv[i], "-g")) { if (++i >= argc) goto print_usage; group = argv[i++]; } else if (!strcmp(argv[i], "-C")) { if (++i >= argc) goto print_usage; workdir = argv[i++]; } else if (!strcmp(argv[i], "-d")) { daemon_mode = 1; i++; } else if (!strcmp(argv[i], "-r")) { if (++i >= argc) goto print_usage; snprintf(contests_home_dir, sizeof(contests_home_dir), "%s", argv[i++]); } else if (!strcmp(argv[i], "-c")) { if (++i >= argc) goto print_usage; snprintf(compile_home_dir, sizeof(compile_home_dir), "%s", argv[i++]); } else if (!strcmp(argv[i], "-x")) { if (++i >= argc) goto print_usage; ejudge_xml_path = argv[i++]; argv_restart[j++] = "-x"; argv_restart[j++] = ejudge_xml_path; } else if (!strcmp(argv[i], "--help")) { code = 0; goto print_usage; } else break; } argv_restart[j++] = "-R"; if (i < argc) { compile_cfg_path = argv[i]; argv_restart[j++] = argv[i++]; } if (i < argc) goto print_usage; argv_restart[j] = 0; start_set_args(argv_restart); if ((pid = start_find_process("ej-compile", 0)) > 0) { fprintf(stderr, "%s: is already running as pid %d\n", argv[0], pid); return 1; } #if defined EJUDGE_XML_PATH if (!ejudge_xml_path) ejudge_xml_path = EJUDGE_XML_PATH; #endif /* EJUDGE_XML_PATH */ if (!ejudge_xml_path) { fprintf(stderr, "%s: ejudge.xml configuration file is not specified\n", argv[0]); return 1; } #if defined EJUDGE_CONTESTS_HOME_DIR if (contests_home_dir[0]) { tmp_len = strlen(EJUDGE_CONTESTS_HOME_DIR); if (!strncmp(ejudge_xml_path, EJUDGE_CONTESTS_HOME_DIR, tmp_len)) { snprintf(tmp_path, sizeof(tmp_path), "%s%s", contests_home_dir, ejudge_xml_path + tmp_len); ejudge_xml_path = xstrdup(tmp_path); } } #endif #ifndef __WIN32__ ejudge_config = ejudge_cfg_parse(ejudge_xml_path); if (!ejudge_config) { fprintf(stderr, "%s: ejudge.xml is invalid\n", argv[0]); return 1; } #endif #ifdef __WIN32__ if (!compile_home_dir[0] && contests_home_dir[0]) { snprintf(compile_home_dir, sizeof(compile_home_dir), "%s/win32_compile", contests_home_dir); } if (!compile_cfg_path && compile_home_dir[0]) { snprintf(compile_cfg_buf, sizeof(compile_cfg_buf), "%s/conf/compile.cfg", compile_home_dir); compile_cfg_path = xstrdup(compile_cfg_buf); } if (!compile_cfg_path && contests_home_dir[0]) { snprintf(compile_cfg_buf, sizeof(compile_cfg_buf), "%s/win32_compile/conf/compile.cfg", contests_home_dir); compile_cfg_path = xstrdup(compile_cfg_buf); } if (!compile_cfg_path && ejudge_config && ejudge_config->compile_home_dir) { snprintf(compile_cfg_buf, sizeof(compile_cfg_buf), "%s/conf/compile.cfg", ejudge_config->compile_home_dir); compile_cfg_path = compile_cfg_buf; } if (!compile_cfg_path && ejudge_config && ejudge_config->contests_home_dir) { snprintf(compile_cfg_buf, sizeof(compile_cfg_buf), "%s/win32_compile/conf/compile.cfg", ejudge_config->contests_home_dir); compile_cfg_path = compile_cfg_buf; } #if defined EJUDGE_CONTESTS_HOME_DIR if (!compile_cfg_path) { snprintf(compile_cfg_buf, sizeof(compile_cfg_buf), "%s/compile/conf/win32_compile.cfg", EJUDGE_CONTESTS_HOME_DIR); compile_cfg_path = compile_cfg_buf; } #endif /* EJUDGE_CONTESTS_HOME_DIR */ if (!compile_cfg_path) { fprintf(stderr, "%s: compile.cfg is not specified\n", argv[0]); return 1; } #else if (!compile_cfg_path && ejudge_config && ejudge_config->compile_home_dir) { snprintf(compile_cfg_buf, sizeof(compile_cfg_buf), "%s/conf/compile.cfg", ejudge_config->compile_home_dir); compile_cfg_path = compile_cfg_buf; } if (!compile_cfg_path && ejudge_config && ejudge_config->contests_home_dir) { snprintf(compile_cfg_buf, sizeof(compile_cfg_buf), "%s/compile/conf/compile.cfg", ejudge_config->contests_home_dir); compile_cfg_path = compile_cfg_buf; } #if defined EJUDGE_CONTESTS_HOME_DIR if (!compile_cfg_path) { snprintf(compile_cfg_buf, sizeof(compile_cfg_buf), "%s/compile/conf/compile.cfg", EJUDGE_CONTESTS_HOME_DIR); compile_cfg_path = compile_cfg_buf; } #endif /* EJUDGE_CONTESTS_HOME_DIR */ if (!compile_cfg_path) { fprintf(stderr, "%s: compile.cfg is not specified\n", argv[0]); return 1; } #endif /* __WIN32__ */ if (start_prepare(user, group, workdir) < 0) return 1; memset(subst_src, 0, sizeof(subst_src)); memset(subst_dst, 0, sizeof(subst_dst)); #ifdef __WIN32__ int subst_idx = 0; if (compile_home_dir[0]) { if (ejudge_config) { subst_src[subst_idx] = ejudge_config->compile_home_dir; subst_dst[subst_idx] = compile_home_dir; subst_idx++; } else { snprintf(std_compile_home_dir, sizeof(std_compile_home_dir), "%s/compile", EJUDGE_CONTESTS_HOME_DIR); subst_src[subst_idx] = std_compile_home_dir; subst_dst[subst_idx] = compile_home_dir; subst_idx++; } } if (contests_home_dir[0]) { subst_src[subst_idx] = EJUDGE_CONTESTS_HOME_DIR; subst_dst[subst_idx] = contests_home_dir; subst_idx++; } if (compile_home_dir[0]) { subst_src[subst_idx] = "/COMPILE_HOME_DIR"; subst_dst[subst_idx] = compile_home_dir; subst_idx++; } if (contests_home_dir[0]) { subst_src[subst_idx] = "/CONTESTS_HOME_DIR"; subst_dst[subst_idx] = contests_home_dir; subst_idx++; } subst_src[subst_idx] = "/TMPDIR"; subst_dst[subst_idx] = get_tmp_dir(tmp_dir, sizeof(tmp_dir)); subst_idx++; fprintf(stderr, "Win32 substitutions:\n"); for (int j = 0; subst_src[j]; ++j) { fprintf(stderr, "%s -> %s\n", subst_src[j], subst_dst[j]); } subst_src_ptr = subst_src; subst_dst_ptr = subst_dst; #endif if (prepare(&serve_state, compile_cfg_path, prepare_flags, PREPARE_COMPILE, cpp_opts, 0, subst_src_ptr, subst_dst_ptr) < 0) return 1; #if HAVE_OPEN_MEMSTREAM - 0 if (!(lang_log_f = open_memstream(&lang_log_t, &lang_log_z))) return 1; if (lang_config_configure(lang_log_f, serve_state.global->lang_config_dir, serve_state.max_lang, serve_state.langs) < 0) { fclose(lang_log_f); lang_log_f = 0; fprintf(stderr, "%s", lang_log_t); return 1; } close_memstream(lang_log_f); lang_log_f = 0; #else if (lang_config_configure(stderr, serve_state.global->lang_config_dir, serve_state.max_lang, serve_state.langs) < 0) return 1; #endif /* HAVE_OPEN_MEMSTREAM */ if (key && filter_languages(key) < 0) return 1; if (create_dirs(&serve_state, PREPARE_COMPILE) < 0) return 1; if (check_config() < 0) return 1; if (initialize_mode) return 0; #if HAVE_SETSID - 0 log_path[0] = 0; #if defined EJUDGE_CONTESTS_HOME_DIR if (!log_path[0]) { snprintf(log_path, sizeof(log_path), "%s/var/ej-compile.log", EJUDGE_CONTESTS_HOME_DIR); } #endif if (!log_path[0]) { snprintf(log_path, sizeof(log_path), "%s/ej-compile.log", serve_state.global->var_dir); } if (daemon_mode) { // daemonize itself if (start_open_log(log_path) < 0) return 1; if ((pid = fork()) < 0) return 1; if (pid > 0) _exit(0); if (setsid() < 0) return 1; #if HAVE_OPEN_MEMSTREAM - 0 == 1 fprintf(stderr, "%s", lang_log_t); #endif /* HAVE_OPEN_MEMSTREAM */ } else if (restart_mode) { if (start_open_log(log_path) < 0) return 1; } #endif /* HAVE_SETSID */ #if HAVE_OPEN_MEMSTREAM - 0 == 1 xfree(lang_log_t); lang_log_t = 0; lang_log_z = 0; #endif /* HAVE_OPEN_MEMSTREAM */ if (do_loop() < 0) return 1; if (interrupt_restart_requested()) start_restart(); return 0; print_usage: printf("Usage: %s [ OPTS ] [config-file]\n", argv[0]); printf(" -k key - specify language key\n"); printf(" -DDEF - define a symbol for preprocessor\n"); printf(" -D - start in daemon mode\n"); printf(" -i - initialize mode: create all dirs and exit\n"); printf(" -k KEY - specify a language filter key\n"); printf(" -u U - start as user U (only as root)\n"); printf(" -g G - start as group G (only as root)\n"); printf(" -C D - change directory to D\n"); printf(" -x X - specify a path to ejudge.xml file\n"); printf(" -r S - substitute ${CONTESTS_HOME_DIR} for S in the config\n"); printf(" -c C - substitute ${COMPILE_HOME_DIR} for C in the config\n"); return code; }
int main(int argc, char *argv[]) { int i = 1; char *eptr = 0; int total_clars, clar_id; struct clar_entry_v2 clar; unsigned char *text = 0; size_t size = 0; program_name = os_GetBasename(argv[0]); if (argc <= 1) die("not enough parameters"); if (!strcmp(argv[1], "--help")) { write_help(); } else if (!strcmp(argv[1], "--version")) { write_version(); } i = 1; while (i < argc) { if (!strcmp(argv[i], "-f")) { if (i + 1 >= argc) die("argument expected for `-f'"); ejudge_xml_path = argv[i + 1]; i += 2; } else if (!strcmp(argv[i], "--")) { i++; break; } else if (argv[i][0] == '-') { die("invalid option `%s'", argv[i]); } else { break; } } #if defined EJUDGE_XML_PATH if (!ejudge_xml_path) ejudge_xml_path = EJUDGE_XML_PATH; #endif /* EJUDGE_XML_PATH */ if (!ejudge_xml_path) die("ejudge.xml path is not specified"); if (!(config = ejudge_cfg_parse(ejudge_xml_path))) return 1; if (!config->contests_dir) die("<contests_dir> tag is not set!"); if (contests_set_directory(config->contests_dir) < 0) die("contests directory is invalid"); if (i >= argc) die("contest-id is expected"); if (!argv[i][0]) die("contest-id is not specified"); errno = 0; contest_id = strtol(argv[i], &eptr, 10); if (*eptr || errno || contest_id <= 0 || contest_id > EJ_MAX_CONTEST_ID) die("contest-id is invalid"); i++; if (i >= argc) die("source plugin name is expected"); src_plugin_name = argv[i]; i++; if (i >= argc) die("destination plugin name is expected"); dst_plugin_name = argv[i]; i++; if (i < argc) die("extra parameters"); if (!src_plugin_name || !*src_plugin_name) src_plugin_name = "file"; if (!dst_plugin_name || !*dst_plugin_name) dst_plugin_name = "file"; if (!strcmp(src_plugin_name, dst_plugin_name)) die("plugins are the same"); if (contests_get(contest_id, &cnts) < 0 || !cnts) die("cannot load contest %d", contest_id); if (!(src_clarlog = clar_init())) die("cannot open the source clarlog"); if (!(dst_clarlog = clar_init())) die("cannot open the destination clarlog"); if (clar_open(src_clarlog, config, cnts, 0, src_plugin_name, 0) < 0) die("cannot open the source clarlog"); if (clar_open(dst_clarlog, config, cnts, 0, dst_plugin_name, 0) < 0) die("cannot open the destination clarlog"); total_clars = clar_get_total(src_clarlog); for (clar_id = 0; clar_id < total_clars; clar_id++) { if (clar_get_record(src_clarlog, clar_id, &clar) < 0) continue; if (clar.id < 0) continue; if (!ej_uuid_is_nonempty(clar.uuid)) { ej_uuid_generate(&clar.uuid); } clar_put_record(dst_clarlog, clar_id, &clar); if (clar_get_raw_text(src_clarlog, clar_id, &text, &size) < 0) continue; clar_add_text(dst_clarlog, clar_id, &clar.uuid, text, size); xfree(text); text = 0; size = 0; } return 0; }