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; 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; }