From 1960395a60db3a2c0667415bf26840680be06a5f Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Thu, 9 May 2024 16:15:18 +0300 Subject: [PATCH 01/11] add default_disable config var --- include/ejudge/prepare.h | 4 ++++ lib/prepare.c | 2 ++ lib/prepare_out.c | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/include/ejudge/prepare.h b/include/ejudge/prepare.h index 0a0a17482..94c9b4f81 100644 --- a/include/ejudge/prepare.h +++ b/include/ejudge/prepare.h @@ -1395,6 +1395,10 @@ struct section_language_data ejintbool_t enable_ejudge_env; /** to preserve the original line numbers in scripts */ ejintbool_t preserve_line_numbers; + /** disable this language by the default import */ + ejintbool_t default_disabled; + /** enable this language (overrides default_disabled) */ + ejintbool_t enabled; /** max virtual size limit */ ej_size64_t max_vm_size; diff --git a/lib/prepare.c b/lib/prepare.c index a080ddf2e..2d2224866 100644 --- a/lib/prepare.c +++ b/lib/prepare.c @@ -627,6 +627,8 @@ static const struct config_parse_info section_language_params[] = LANGUAGE_PARAM(enable_custom, "d"), LANGUAGE_PARAM(enable_ejudge_env, "d"), LANGUAGE_PARAM(preserve_line_numbers, "d"), + LANGUAGE_PARAM(default_disabled, "d"), + LANGUAGE_PARAM(enabled, "d"), LANGUAGE_PARAM(max_vm_size, "E"), LANGUAGE_PARAM(max_stack_size, "E"), LANGUAGE_PARAM(max_file_size, "E"), diff --git a/lib/prepare_out.c b/lib/prepare_out.c index eb2630a25..f28e4a94a 100644 --- a/lib/prepare_out.c +++ b/lib/prepare_out.c @@ -927,6 +927,10 @@ prepare_unparse_lang( unparse_bool(f, "enable_ejudge_env", lang->enable_ejudge_env); if (lang->preserve_line_numbers > 0) unparse_bool(f, "preserve_line_numbers", lang->preserve_line_numbers); + if (lang->default_disabled > 0) + unparse_bool(f, "default_disabled", lang->default_disabled); + if (lang->enabled > 0) + unparse_bool(f, "enabled", lang->enabled); if (lang->content_type && lang->content_type[0]) { fprintf(f, "content_type = \"%s\"\n", CARMOR(lang->content_type)); } From 2588a4309bd8729389c89388eda453339769bcc5 Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Thu, 9 May 2024 16:16:54 +0300 Subject: [PATCH 02/11] generated --- gen/prepare_meta.c | 4 ++++ include/ejudge/meta/prepare_meta.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/gen/prepare_meta.c b/gen/prepare_meta.c index f67e225bf..77779ee3b 100644 --- a/gen/prepare_meta.c +++ b/gen/prepare_meta.c @@ -1980,6 +1980,8 @@ static struct meta_info_item meta_info_section_language_data_data[] = [CNTSLANG_enable_custom] = { CNTSLANG_enable_custom, 'B', XSIZE(struct section_language_data, enable_custom), "enable_custom", XOFFSET(struct section_language_data, enable_custom) }, [CNTSLANG_enable_ejudge_env] = { CNTSLANG_enable_ejudge_env, 'B', XSIZE(struct section_language_data, enable_ejudge_env), "enable_ejudge_env", XOFFSET(struct section_language_data, enable_ejudge_env) }, [CNTSLANG_preserve_line_numbers] = { CNTSLANG_preserve_line_numbers, 'B', XSIZE(struct section_language_data, preserve_line_numbers), "preserve_line_numbers", XOFFSET(struct section_language_data, preserve_line_numbers) }, + [CNTSLANG_default_disabled] = { CNTSLANG_default_disabled, 'B', XSIZE(struct section_language_data, default_disabled), "default_disabled", XOFFSET(struct section_language_data, default_disabled) }, + [CNTSLANG_enabled] = { CNTSLANG_enabled, 'B', XSIZE(struct section_language_data, enabled), "enabled", XOFFSET(struct section_language_data, enabled) }, [CNTSLANG_max_vm_size] = { CNTSLANG_max_vm_size, 'E', XSIZE(struct section_language_data, max_vm_size), "max_vm_size", XOFFSET(struct section_language_data, max_vm_size) }, [CNTSLANG_max_stack_size] = { CNTSLANG_max_stack_size, 'E', XSIZE(struct section_language_data, max_stack_size), "max_stack_size", XOFFSET(struct section_language_data, max_stack_size) }, [CNTSLANG_max_file_size] = { CNTSLANG_max_file_size, 'E', XSIZE(struct section_language_data, max_file_size), "max_file_size", XOFFSET(struct section_language_data, max_file_size) }, @@ -2090,6 +2092,8 @@ void cntslang_copy(struct section_language_data *dst, const struct section_langu dst->enable_custom = src->enable_custom; dst->enable_ejudge_env = src->enable_ejudge_env; dst->preserve_line_numbers = src->preserve_line_numbers; + dst->default_disabled = src->default_disabled; + dst->enabled = src->enabled; dst->max_vm_size = src->max_vm_size; dst->max_stack_size = src->max_stack_size; dst->max_file_size = src->max_file_size; diff --git a/include/ejudge/meta/prepare_meta.h b/include/ejudge/meta/prepare_meta.h index 74d59ca95..d6cd256a8 100644 --- a/include/ejudge/meta/prepare_meta.h +++ b/include/ejudge/meta/prepare_meta.h @@ -624,6 +624,8 @@ enum CNTSLANG_enable_custom, CNTSLANG_enable_ejudge_env, CNTSLANG_preserve_line_numbers, + CNTSLANG_default_disabled, + CNTSLANG_enabled, CNTSLANG_max_vm_size, CNTSLANG_max_stack_size, CNTSLANG_max_file_size, From c71e1bd12c2dda962a56b9f54ed7ba96d656465c Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Thu, 9 May 2024 16:26:37 +0300 Subject: [PATCH 03/11] set default_disabled property --- scripts/custom-version.in | 3 ++- scripts/postgres-version.in | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/custom-version.in b/scripts/custom-version.in index 22cdd669e..1ea33fb20 100755 --- a/scripts/custom-version.in +++ b/scripts/custom-version.in @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 2023 Alexander Chernov +# Copyright (c) 2023-2024 Alexander Chernov # compiler script interface is as follows # -version [OPTION] @@ -22,6 +22,7 @@ common_config() { echo 'long_name="Custom"' echo 'src_sfx=".txt"' echo 'enable_custom=1' + echo 'default_disabled=1' } failure() { diff --git a/scripts/postgres-version.in b/scripts/postgres-version.in index e40be9211..dd80f5866 100755 --- a/scripts/postgres-version.in +++ b/scripts/postgres-version.in @@ -1,5 +1,5 @@ #! /bin/bash -# Copyright (c) 2023 Alexander Chernov +# Copyright (c) 2023-2024 Alexander Chernov prefix="@prefix@" exec_prefix="@exec_prefix@" @@ -13,6 +13,7 @@ common_config() { echo 'long_name="PostgreSQL"' echo 'src_sfx=".sql"' echo 'arch="linux-shared"' + echo 'default_disabled=1' } failure() { From fe6c6d93a0ce7b2c6174183d419b8373636ed2b7 Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Thu, 9 May 2024 18:44:10 +0300 Subject: [PATCH 04/11] handle default_disabled --- lib/lang_config_vis.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/lang_config_vis.c b/lib/lang_config_vis.c index bb7c3fa10..27d3ff010 100644 --- a/lib/lang_config_vis.c +++ b/lib/lang_config_vis.c @@ -1,6 +1,6 @@ /* -*- mode: c -*- */ -/* Copyright (C) 2008-2023 Alexander Chernov */ +/* Copyright (C) 2008-2024 Alexander Chernov */ /* * This program is free software; you can redistribute it and/or modify @@ -1221,6 +1221,9 @@ lang_config_generate_compile_cfg( if ((s = shellconfig_get(p->cfg, "enable_ejudge_env"))) { fprintf(f, "enable_ejudge_env\n"); } + if ((s = shellconfig_get(p->cfg, "default_disabled"))) { + fprintf(f, "default_disabled\n"); + } if (!(s = shellconfig_get(p->cfg, "cmd"))) s = p->lang; fprintf(f, "cmd = \"%s\"\n", s); if ((s = shellconfig_get(p->cfg, "arch"))) { From 1c876c2da5ef4fd17d17e4714f8ca1c2d8897f93 Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Thu, 9 May 2024 19:24:11 +0300 Subject: [PATCH 05/11] preserve old script --- lib/lang_config_vis.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/lang_config_vis.c b/lib/lang_config_vis.c index 27d3ff010..4e69cb22d 100644 --- a/lib/lang_config_vis.c +++ b/lib/lang_config_vis.c @@ -496,6 +496,8 @@ update_language_script( size_t in_z = 0, out_z = 0; FILE *f = 0; char buf[1024]; + char old_path[PATH_MAX]; + __attribute__((unused)) int _; // read the source file if (!(f = fopen(script_in, "r"))) { @@ -530,6 +532,13 @@ update_language_script( xfree(out_t); out_t = 0; } + // preserve the old output file + _ = snprintf(old_path, sizeof(old_path), "%s.old", script_out); + if (rename(script_out, old_path) < 0) { + log_printf(err_f, win, "error: cannot rename `%s'\n", script_out); + goto cleanup; + } + // write the output file if (!(f = fopen(script_out, "w"))) { log_printf(err_f, win, "error: cannot open `%s' for writing\n", From 918838de51ebe3b0f5e46796cd13e56f6820461f Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Thu, 9 May 2024 19:49:26 +0300 Subject: [PATCH 06/11] add version language parameter --- include/ejudge/prepare.h | 5 ++++- lib/prepare.c | 1 + lib/prepare_out.c | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/ejudge/prepare.h b/include/ejudge/prepare.h index 94c9b4f81..a360e8a54 100644 --- a/include/ejudge/prepare.h +++ b/include/ejudge/prepare.h @@ -1334,7 +1334,7 @@ struct section_problem_data } xml META_ATTRIB((meta_hidden)); }; -/* sizeof(struct section_language_data) == 312/400 */ +/* sizeof(struct section_language_data) == ?/472 */ struct section_language_data { struct generic_section_config g META_ATTRIB((meta_hidden)); @@ -1446,6 +1446,9 @@ struct section_language_data /** additional clean_up environment in file */ unsigned char *clean_up_env_file; + /** compiler version */ + unsigned char *version; + unsigned char *unhandled_vars; /** disabled by configuration script */ int disabled_by_config META_ATTRIB((meta_private)); diff --git a/lib/prepare.c b/lib/prepare.c index 2d2224866..bc9eb67c4 100644 --- a/lib/prepare.c +++ b/lib/prepare.c @@ -650,6 +650,7 @@ static const struct config_parse_info section_language_params[] = LANGUAGE_PARAM(clean_up_cmd, "S"), LANGUAGE_PARAM(run_env_file, "S"), LANGUAGE_PARAM(clean_up_env_file, "S"), + LANGUAGE_PARAM(version, "S"), { 0, 0, 0, 0 } }; diff --git a/lib/prepare_out.c b/lib/prepare_out.c index f28e4a94a..0acfc5ecc 100644 --- a/lib/prepare_out.c +++ b/lib/prepare_out.c @@ -996,6 +996,9 @@ prepare_unparse_lang( if (lang->clean_up_env_file && *lang->clean_up_env_file) { fprintf(f, "clean_up_env_file = \"%s\"\n", CARMOR(lang->clean_up_env_file)); } + if (lang->version && *lang->version) { + fprintf(f, "version = \"%s\"\n", CARMOR(lang->version)); + } fprintf(f, "\n"); if (lang->unhandled_vars) fprintf(f, "%s\n", lang->unhandled_vars); From b4826f1b18c97a35c1d55cf3f362c18f191a925f Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Thu, 9 May 2024 19:49:38 +0300 Subject: [PATCH 07/11] regenerated --- gen/prepare_meta.c | 5 +++++ include/ejudge/meta/prepare_meta.h | 1 + 2 files changed, 6 insertions(+) diff --git a/gen/prepare_meta.c b/gen/prepare_meta.c index 77779ee3b..42026576b 100644 --- a/gen/prepare_meta.c +++ b/gen/prepare_meta.c @@ -2004,6 +2004,7 @@ static struct meta_info_item meta_info_section_language_data_data[] = [CNTSLANG_clean_up_cmd] = { CNTSLANG_clean_up_cmd, 's', XSIZE(struct section_language_data, clean_up_cmd), "clean_up_cmd", XOFFSET(struct section_language_data, clean_up_cmd) }, [CNTSLANG_run_env_file] = { CNTSLANG_run_env_file, 's', XSIZE(struct section_language_data, run_env_file), "run_env_file", XOFFSET(struct section_language_data, run_env_file) }, [CNTSLANG_clean_up_env_file] = { CNTSLANG_clean_up_env_file, 's', XSIZE(struct section_language_data, clean_up_env_file), "clean_up_env_file", XOFFSET(struct section_language_data, clean_up_env_file) }, + [CNTSLANG_version] = { CNTSLANG_version, 's', XSIZE(struct section_language_data, version), "version", XOFFSET(struct section_language_data, version) }, [CNTSLANG_unhandled_vars] = { CNTSLANG_unhandled_vars, 's', XSIZE(struct section_language_data, unhandled_vars), "unhandled_vars", XOFFSET(struct section_language_data, unhandled_vars) }, [CNTSLANG_disabled_by_config] = { CNTSLANG_disabled_by_config, 'i', XSIZE(struct section_language_data, disabled_by_config), NULL, XOFFSET(struct section_language_data, disabled_by_config) }, }; @@ -2142,6 +2143,9 @@ void cntslang_copy(struct section_language_data *dst, const struct section_langu if (src->clean_up_env_file) { dst->clean_up_env_file = strdup(src->clean_up_env_file); } + if (src->version) { + dst->version = strdup(src->version); + } if (src->unhandled_vars) { dst->unhandled_vars = strdup(src->unhandled_vars); } @@ -2174,6 +2178,7 @@ void cntslang_free(struct section_language_data *ptr) free(ptr->clean_up_cmd); free(ptr->run_env_file); free(ptr->clean_up_env_file); + free(ptr->version); free(ptr->unhandled_vars); // private disabled_by_config } diff --git a/include/ejudge/meta/prepare_meta.h b/include/ejudge/meta/prepare_meta.h index d6cd256a8..8b86fd72d 100644 --- a/include/ejudge/meta/prepare_meta.h +++ b/include/ejudge/meta/prepare_meta.h @@ -648,6 +648,7 @@ enum CNTSLANG_clean_up_cmd, CNTSLANG_run_env_file, CNTSLANG_clean_up_env_file, + CNTSLANG_version, CNTSLANG_unhandled_vars, CNTSLANG_disabled_by_config, From e14d4efc8e8c1d6c834a38759dc24025374c33a5 Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Thu, 9 May 2024 19:52:16 +0300 Subject: [PATCH 08/11] add version to the config file --- lib/lang_config_vis.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/lang_config_vis.c b/lib/lang_config_vis.c index 4e69cb22d..3b802213d 100644 --- a/lib/lang_config_vis.c +++ b/lib/lang_config_vis.c @@ -1198,11 +1198,10 @@ lang_config_generate_compile_cfg( s = shellconfig_get(p->cfg, "long_name"); if (!s) s = ""; fprintf(f, "long_name = \"%s\"\n", s); - /* s = shellconfig_get(p->cfg, "version"); - if (!s) s = ""; - fprintf(f, "%s\"\n", s); - */ + if (s && *s) { + fprintf(f, "version = \"%s\"\n", s); + } if ((s = shellconfig_get(p->cfg, "src_sfx"))) { fprintf(f, "src_sfx = \"%s\"\n", s); } From 78a0f503b4a4cc37fcb41bfc94d33276dfa8d87b Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Fri, 10 May 2024 00:51:02 +0300 Subject: [PATCH 09/11] implement support for script lock --- lib/lang_config_vis.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/lang_config_vis.c b/lib/lang_config_vis.c index 3b802213d..93278346f 100644 --- a/lib/lang_config_vis.c +++ b/lib/lang_config_vis.c @@ -497,6 +497,8 @@ update_language_script( FILE *f = 0; char buf[1024]; char old_path[PATH_MAX]; + char lock_path[PATH_MAX]; + char new_script_out[PATH_MAX]; __attribute__((unused)) int _; // read the source file @@ -532,11 +534,18 @@ update_language_script( xfree(out_t); out_t = 0; } - // preserve the old output file - _ = snprintf(old_path, sizeof(old_path), "%s.old", script_out); - if (rename(script_out, old_path) < 0) { - log_printf(err_f, win, "error: cannot rename `%s'\n", script_out); - goto cleanup; + // check the lock file + _ = snprintf(lock_path, sizeof(lock_path), "%s.lock", script_out); + if (access(lock_path, F_OK) >= 0) { + _ = snprintf(new_script_out, sizeof(new_script_out), "%s.new", script_out); + script_out = new_script_out; + } else { + // preserve the old output file + _ = snprintf(old_path, sizeof(old_path), "%s.old", script_out); + if (rename(script_out, old_path) < 0) { + log_printf(err_f, win, "error: cannot rename `%s'\n", script_out); + goto cleanup; + } } // write the output file From 02095a42d1138cea89a41907e47e6955d36c1021 Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Fri, 10 May 2024 01:16:08 +0300 Subject: [PATCH 10/11] undebug --- scripts/node.in | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/node.in b/scripts/node.in index 240fc0d30..eab6a78b8 100755 --- a/scripts/node.in +++ b/scripts/node.in @@ -45,8 +45,6 @@ then mv "$1" "${EJUDGE_SOLUTION_FILE}.js" tar cfz "$2" . echo '{ "is_archive": true, "start_cmd": "'${NODEPATH}'", "start_args": ["'${NODEPATH}'"'${extra_args}',"'${EJUDGE_START_FILE}'.js"] }' > "$3" - ls -l . - cat $3 exit 0 fi From ddff212ba620f93d09be2f23c7dc69de07c84bdb Mon Sep 17 00:00:00 2001 From: Alexander Chernov Date: Fri, 10 May 2024 01:50:00 +0300 Subject: [PATCH 11/11] do not touch unchanged files --- lib/lang_config_vis.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/lang_config_vis.c b/lib/lang_config_vis.c index 93278346f..81725487c 100644 --- a/lib/lang_config_vis.c +++ b/lib/lang_config_vis.c @@ -524,11 +524,11 @@ update_language_script( fclose(f); f = 0; if (!strcmp(out_t, in_t)) { // no difference, but update the modtime - if (utime(script_out, 0) < 0) { - log_printf(err_f, win, "error: cannot change mod time for `%s'\n", - script_out); - // error - } + //if (utime(script_out, 0) < 0) { + // log_printf(err_f, win, "error: cannot change mod time for `%s'\n", + // script_out); + // // error + //} goto cleanup; } xfree(out_t); out_t = 0;