diff --git a/criu/crtools.c b/criu/crtools.c index 37c14ed8c..88699bc80 100644 --- a/criu/crtools.c +++ b/criu/crtools.c @@ -206,6 +206,17 @@ int add_external(char *key) return 0; } +bool deprecated_ok(char *what) +{ + if (opts.deprecated_ok) + return true; + + pr_err("Deprecated functionality (%s) rejected.\n", what); + pr_err("Use the --deprecated option or set CRIU_DEPRECATED environment.\n"); + pr_err("For details visit https://criu.org/Deprecation\n"); + return false; +} + int main(int argc, char *argv[], char *envp[]) { pid_t pid = 0, tree_id = 0; @@ -279,6 +290,7 @@ int main(int argc, char *argv[], char *envp[]) { "cgroup-props-file", required_argument, 0, 1081 }, { "cgroup-dump-controller", required_argument, 0, 1082 }, { SK_INFLIGHT_PARAM, no_argument, 0, 1083 }, + { "deprecated", no_argument, 0, 1084 }, { }, }; @@ -587,6 +599,10 @@ int main(int argc, char *argv[], char *envp[]) pr_msg("Will skip in-flight TCP connections\n"); opts.tcp_skip_in_flight = true; break; + case 1084: + pr_msg("Turn deprecated stuff ON\n"); + opts.deprecated_ok = true; + break; case 'V': pr_msg("Version: %s\n", CRIU_VERSION); if (strcmp(CRIU_GITID, "0")) @@ -600,6 +616,11 @@ int main(int argc, char *argv[], char *envp[]) } } + if (getenv("CRIU_DEPRECATED")) { + pr_msg("Turn deprecated stuff ON via env\n"); + opts.deprecated_ok = true; + } + if (check_namespace_opts()) { pr_msg("Error: namespace flags confict\n"); return 1; @@ -674,6 +695,8 @@ int main(int argc, char *argv[], char *envp[]) return 1; pr_debug("Version: %s (gitid %s)\n", CRIU_VERSION, CRIU_GITID); + if (opts.deprecated_ok) + pr_debug("DEPRECATED ON\n"); if (!list_empty(&opts.inherit_fds)) { if (strcmp(argv[optind], "restore")) { diff --git a/criu/include/cr_options.h b/criu/include/cr_options.h index a969977da..181636935 100644 --- a/criu/include/cr_options.h +++ b/criu/include/cr_options.h @@ -111,6 +111,14 @@ struct cr_options { unsigned int empty_ns; bool tcp_skip_in_flight; char *work_dir; + + /* + * When we scheduler for removal some functionality we first + * deprecate it and it sits in criu for some time. By default + * the deprecated stuff is not working, but it's still possible + * to turn one ON while the code is in. + */ + bool deprecated_ok; }; extern struct cr_options opts; diff --git a/criu/include/crtools.h b/criu/include/crtools.h index 0b1186475..f2714c3d0 100644 --- a/criu/include/crtools.h +++ b/criu/include/crtools.h @@ -15,7 +15,7 @@ extern int check_img_inventory(void); extern int write_img_inventory(InventoryEntry *he); extern int prepare_inventory(InventoryEntry *he); extern int add_post_prepare_cb(int (*actor)(void *data), void *data); - +extern bool deprecated_ok(char *what); extern int cr_dump_tasks(pid_t pid); extern int cr_pre_dump_tasks(pid_t pid); extern int cr_restore_tasks(void);