void __noreturn start_barebox(void) { initcall_t *initcall; int result; struct stat s; if (!IS_ENABLED(CONFIG_SHELL_NONE)) barebox_main = run_shell; for (initcall = __barebox_initcalls_start; initcall < __barebox_initcalls_end; initcall++) { pr_debug("initcall-> %pS\n", *initcall); result = (*initcall)(); if (result) pr_err("initcall %pS failed: %s\n", *initcall, strerror(-result)); } pr_debug("initcalls done\n"); if (IS_ENABLED(CONFIG_ENV_HANDLING)) { int ret; ret = envfs_load(default_environment_path, "/env", 0); if (ret && IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT)) { pr_err("no valid environment found on %s. " "Using default environment\n", default_environment_path); envfs_load("/dev/defaultenv", "/env", 0); } } if (IS_ENABLED(CONFIG_COMMAND_SUPPORT)) { pr_info("running /env/bin/init...\n"); if (!stat("/env/bin/init", &s)) { run_command("source /env/bin/init", 0); } else { pr_err("/env/bin/init not found\n"); if (IS_ENABLED(CONFIG_CMD_LOGIN)) while(run_command("login -t 0", 0)); } } if (!barebox_main) { pr_err("No main function! aborting.\n"); hang(); } /* main_loop() can return to retry autoboot, if so just run it again. */ for (;;) barebox_main(); /* NOTREACHED - no way out of command loop except booting */ }
int main(int argc, char *argv[]) { int opt; int save = 0, load = 0, pad = 0, fd; char *filename = NULL, *dirname = NULL; while((opt = getopt(argc, argv, "slp:")) != -1) { switch (opt) { case 's': save = 1; break; case 'l': load = 1; break; case 'p': pad = strtoul(optarg, NULL, 0); break; } } if (optind + 1 >= argc) { usage(argv[0]); exit(1); } dirname = argv[optind]; filename = argv[optind + 1]; if ((!load && !save) || (load && save) || !filename || !dirname) { usage(argv[0]); exit(1); } if (save) { fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, 0644); if (fd < 0) { perror("open"); exit(1); } close(fd); } if (save && pad) { if (truncate(filename, pad)) { perror("truncate"); exit(1); } } if (load) { printf("loading env from file %s to %s\n", filename, dirname); envfs_load(filename, dirname); } if (save) { printf("saving contents of %s to file %s\n", dirname, filename); envfs_save(filename, dirname); } exit(0); }
static int do_loadenv(int argc, char *argv[]) { char *filename = NULL, *dirname; unsigned flags = 0; int opt; int scrub = 0; int defaultenv = 0; while ((opt = getopt(argc, argv, "nsd")) > 0) { switch (opt) { case 'n': flags |= ENV_FLAG_NO_OVERWRITE; break; case 's': scrub = 1; break; case 'd': defaultenv = 1; break; default: return COMMAND_ERROR_USAGE; } } if (argc - optind < 2) dirname = "/env"; else dirname = argv[optind + 1]; if (argc - optind < 1) { filename = default_environment_path_get(); } else { char *str = normalise_path(argv[optind]); /* * /dev/defaultenv use to contain the defaultenvironment. * we do not have this file anymore, but maintain compatibility * to the 'loadenv -s /dev/defaultenv' command to restore the * default environment for some time. */ if (!strcmp(str, "/dev/defaultenv")) defaultenv = 1; else filename = argv[optind]; free(str); } if (scrub) { int ret; ret = unlink_recursive(dirname, NULL); if (ret && ret != -ENOENT) { eprintf("cannot remove %s: %s\n", dirname, strerror(-ret)); return 1; } ret = mkdir(dirname, 0); if (ret) { eprintf("cannot create %s: %s\n", dirname, strerror(-ret)); return ret; } } printf("loading environment from %s\n", defaultenv ? "defaultenv" : filename); if (defaultenv) return defaultenv_load(dirname, flags); else return envfs_load(filename, dirname, flags); }