示例#1
0
static int
command_boot(int argc, char *argv[])
{
    struct preloaded_file	*fp;

    /*
     * See if the user has specified an explicit kernel to boot.
     */
    if ((argc > 1) && (argv[1][0] != '-')) {

	/* XXX maybe we should discard everything and start again? */
	if (file_findfile(NULL, NULL) != NULL) {
	    snprintf(command_errbuf, sizeof(command_errbuf),
		"can't boot '%s', kernel module already loaded", argv[1]);
	    return(CMD_ERROR);
	}

	/* find/load the kernel module */
	if (mod_loadkld(argv[1], argc - 2, argv + 2) != 0)
	    return(CMD_ERROR);
	/* we have consumed all arguments */
	argc = 1;
    }

    /*
     * See if there is a kernel module already loaded
     */
    if (file_findfile(NULL, NULL) == NULL)
	if (loadakernel(0, argc - 1, argv + 1))
	    /* we have consumed all arguments */
	    argc = 1;

    /*
     * Loaded anything yet?
     */
    if ((fp = file_findfile(NULL, NULL)) == NULL) {
	command_errmsg = "no bootable kernel";
	return(CMD_ERROR);
    }

    /*
     * If we were given arguments, discard any previous.
     * XXX should we merge arguments?  Hard to DWIM.
     */
    if (argc > 1) {
	if (fp->f_args != NULL)
	    free(fp->f_args);
	fp->f_args = unargv(argc - 1, argv + 1);
    }

    /* Hook for platform-specific autoloading of modules */
    if (archsw.arch_autoload() != 0)
	return(CMD_ERROR);

    /* Call the exec handler from the loader matching the kernel */
    file_formats[fp->f_loader]->l_exec(fp);
    return(CMD_ERROR);
}
示例#2
0
文件: module.c 项目: alek-p/openzfs
static int
command_load(int argc, char *argv[])
{
    char	*typestr;
    int		dofile, dokld, ch, error;
    
    dokld = dofile = 0;
    optind = 1;
    optreset = 1;
    typestr = NULL;
    if (argc == 1) {
	command_errmsg = "no filename specified";
	return (CMD_CRIT);
    }
    while ((ch = getopt(argc, argv, "kt:")) != -1) {
	switch(ch) {
	case 'k':
	    dokld = 1;
	    break;
	case 't':
	    typestr = optarg;
	    dofile = 1;
	    break;
	case '?':
	default:
	    /* getopt has already reported an error */
	    return (CMD_OK);
	}
    }
    argv += (optind - 1);
    argc -= (optind - 1);

    printf("Loading %s...\n", argv[1]);
    /*
     * Request to load a raw file?
     */
    if (dofile) {
	if ((typestr == NULL) || (*typestr == 0)) {
	    command_errmsg = "invalid load type";
	    return (CMD_CRIT);
	}

	if (file_findfile(argv[1], typestr) != NULL) {
		snprintf(command_errbuf, sizeof (command_errbuf),
		    "warning: file '%s' already loaded", argv[1]);
		return (CMD_WARN);
	}

	if (file_loadraw(argv[1], typestr, argc - 2, argv + 2, 1) != NULL)
		return (CMD_OK);

	/* Failing to load mfs_root is never going to end well! */
	if (strcmp("mfs_root", typestr) == 0)
		return (CMD_FATAL);

	return (CMD_ERROR);
    }
    /*
     * Do we have explicit KLD load ?
     */
    if (dokld || file_havepath(argv[1])) {
	error = mod_loadkld(argv[1], argc - 2, argv + 2);
	if (error == EEXIST) {
	    snprintf(command_errbuf, sizeof (command_errbuf),
		"warning: KLD '%s' already loaded", argv[1]);
	    return (CMD_WARN);
	}
	
	return (error == 0 ? CMD_OK : CMD_CRIT);
    }
    /*
     * Looks like a request for a module.
     */
    error = mod_load(argv[1], NULL, argc - 2, argv + 2);
    if (error == EEXIST) {
	snprintf(command_errbuf, sizeof (command_errbuf),
	    "warning: module '%s' already loaded", argv[1]);
	return (CMD_WARN);
    }

    return (error == 0 ? CMD_OK : CMD_CRIT);
}
示例#3
0
文件: boot.c 项目: zrj-rimwis/blub
static int
command_boot(int argc, char *argv[])
{
    struct preloaded_file	*fp;
    char *local_module_path;
    char *exported_module_path;

    /*
     * See if the user has specified an explicit kernel to boot.
     */
    if ((argc > 1) && (argv[1][0] != '-')) {

	/* XXX maybe we should discard everything and start again? */
	if (file_findfile(NULL, NULL) != NULL) {
	    sprintf(command_errbuf, "can't boot '%s', kernel module already loaded", argv[1]);
	    return(CMD_ERROR);
	}

	/* find/load the kernel module */
	if (mod_loadkld(argv[1], argc - 2, argv + 2) != 0)
	    return(CMD_ERROR);
	/* we have consumed all arguments */
	argc = 1;
    }

    /*
     * See if there is a kernel module already loaded
     */
    if (file_findfile(NULL, NULL) == NULL)
	if (loadakernel(0, argc - 1, argv + 1))
	    /* we have consumed all arguments */
	    argc = 1;

    /*
     * Loaded anything yet?
     */
    if ((fp = file_findfile(NULL, NULL)) == NULL) {
	command_errmsg = "no bootable kernel";
	return(CMD_ERROR);
    }

    /*
     * If we were given arguments, discard any previous.
     * XXX should we merge arguments?  Hard to DWIM.
     */
    if (argc > 1) {
	if (fp->f_args != NULL)
	    free(fp->f_args);
	fp->f_args = unargv(argc - 1, argv + 1);
    }

    /* Hook for platform-specific autoloading of modules */
    if (archsw.arch_autoload() != 0)
	return(CMD_ERROR);

    /*
     * Exec the kernel.  We have to shift our exported_module_path
     * (which has the correct /boot prefix for the kernel) over to
     * module_path.  If the exec fails we switch it back.
     */
    exported_module_path = getenv("exported_module_path");
    if (exported_module_path) {
	    exported_module_path = strdup(exported_module_path);
	    local_module_path = getenv("module_path");
	    if (local_module_path)
		local_module_path = strdup(local_module_path);
	    setenv("module_path", exported_module_path, 1);
	    unsetenv("exported_module_path");
    }

    /* Call the exec handler from the loader matching the kernel */
    file_formats[fp->f_loader]->l_exec(fp);

    if (exported_module_path) {
	    if (local_module_path) {
		setenv("module_path", local_module_path, 1);
		free(local_module_path);
	    } else {
		unsetenv("module_path");
	    }
	    setenv("exported_module_path", exported_module_path, 1);
	    free(exported_module_path);
    }
    return(CMD_ERROR);
}