Changeset View
Changeset View
Standalone View
Standalone View
head/sys/boot/common/module.c
Show First 20 Lines • Show All 137 Lines • ▼ Show 20 Lines | default: | ||||
if (dofile) { | if (dofile) { | ||||
if ((argc != 2) || (typestr == NULL) || (*typestr == 0)) { | if ((argc != 2) || (typestr == NULL) || (*typestr == 0)) { | ||||
command_errmsg = "invalid load type"; | command_errmsg = "invalid load type"; | ||||
return (CMD_CRIT); | return (CMD_CRIT); | ||||
} | } | ||||
fp = file_findfile(argv[1], typestr); | fp = file_findfile(argv[1], typestr); | ||||
if (fp) { | if (fp) { | ||||
sprintf(command_errbuf, "warning: file '%s' already loaded", argv[1]); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"warning: file '%s' already loaded", argv[1]); | |||||
return (CMD_WARN); | return (CMD_WARN); | ||||
} | } | ||||
if (file_loadraw(argv[1], typestr, 1) != NULL) | if (file_loadraw(argv[1], typestr, 1) != NULL) | ||||
return (CMD_OK); | return (CMD_OK); | ||||
/* Failing to load mfs_root is never going to end well! */ | /* Failing to load mfs_root is never going to end well! */ | ||||
if (strcmp("mfs_root", typestr) == 0) | if (strcmp("mfs_root", typestr) == 0) | ||||
return (CMD_FATAL); | return (CMD_FATAL); | ||||
return (CMD_ERROR); | return (CMD_ERROR); | ||||
} | } | ||||
/* | /* | ||||
* Do we have explicit KLD load ? | * Do we have explicit KLD load ? | ||||
*/ | */ | ||||
if (dokld || file_havepath(argv[1])) { | if (dokld || file_havepath(argv[1])) { | ||||
error = mod_loadkld(argv[1], argc - 2, argv + 2); | error = mod_loadkld(argv[1], argc - 2, argv + 2); | ||||
if (error == EEXIST) { | if (error == EEXIST) { | ||||
sprintf(command_errbuf, "warning: KLD '%s' already loaded", argv[1]); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"warning: KLD '%s' already loaded", argv[1]); | |||||
return (CMD_WARN); | return (CMD_WARN); | ||||
} | } | ||||
return (error == 0 ? CMD_OK : CMD_CRIT); | return (error == 0 ? CMD_OK : CMD_CRIT); | ||||
} | } | ||||
/* | /* | ||||
* Looks like a request for a module. | * Looks like a request for a module. | ||||
*/ | */ | ||||
error = mod_load(argv[1], NULL, argc - 2, argv + 2); | error = mod_load(argv[1], NULL, argc - 2, argv + 2); | ||||
if (error == EEXIST) { | if (error == EEXIST) { | ||||
sprintf(command_errbuf, "warning: module '%s' already loaded", argv[1]); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"warning: module '%s' already loaded", argv[1]); | |||||
return (CMD_WARN); | return (CMD_WARN); | ||||
} | } | ||||
return (error == 0 ? CMD_OK : CMD_CRIT); | return (error == 0 ? CMD_OK : CMD_CRIT); | ||||
} | } | ||||
COMMAND_SET(load_geli, "load_geli", "load a geli key", command_load_geli); | COMMAND_SET(load_geli, "load_geli", "load a geli key", command_load_geli); | ||||
Show All 12 Lines | command_load_geli(int argc, char *argv[]) | ||||
num = 0; | num = 0; | ||||
optind = 1; | optind = 1; | ||||
optreset = 1; | optreset = 1; | ||||
while ((ch = getopt(argc, argv, "n:")) != -1) { | while ((ch = getopt(argc, argv, "n:")) != -1) { | ||||
switch(ch) { | switch(ch) { | ||||
case 'n': | case 'n': | ||||
num = strtol(optarg, &cp, 0); | num = strtol(optarg, &cp, 0); | ||||
if (cp == optarg) { | if (cp == optarg) { | ||||
sprintf(command_errbuf, "bad key index '%s'", optarg); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"bad key index '%s'", optarg); | |||||
return(CMD_ERROR); | return(CMD_ERROR); | ||||
} | } | ||||
break; | break; | ||||
case '?': | case '?': | ||||
default: | default: | ||||
/* getopt has already reported an error */ | /* getopt has already reported an error */ | ||||
return(CMD_OK); | return(CMD_OK); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 115 Lines • ▼ Show 20 Lines | if (error == 0) { | ||||
i = -1; | i = -1; | ||||
last_file_format = 0; | last_file_format = 0; | ||||
fp = NULL; | fp = NULL; | ||||
continue; | continue; | ||||
} | } | ||||
if (error == EFTYPE) | if (error == EFTYPE) | ||||
continue; /* Unknown to this handler? */ | continue; /* Unknown to this handler? */ | ||||
if (error) { | if (error) { | ||||
sprintf(command_errbuf, "can't load file '%s': %s", | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
filename, strerror(error)); | "can't load file '%s': %s", filename, strerror(error)); | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
file_load_dependencies(struct preloaded_file *base_file) | file_load_dependencies(struct preloaded_file *base_file) | ||||
Show All 19 Lines | if (file_findmodule(NULL, dmodname, verinfo) == NULL) { | ||||
break; | break; | ||||
/* | /* | ||||
* If module loaded via kld name which isn't listed | * If module loaded via kld name which isn't listed | ||||
* in the linker.hints file, we should check if it have | * in the linker.hints file, we should check if it have | ||||
* required version. | * required version. | ||||
*/ | */ | ||||
mp = file_findmodule(NULL, dmodname, verinfo); | mp = file_findmodule(NULL, dmodname, verinfo); | ||||
if (mp == NULL) { | if (mp == NULL) { | ||||
sprintf(command_errbuf, "module '%s' exists but with wrong version", | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
dmodname); | "module '%s' exists but with wrong version", dmodname); | ||||
error = ENOENT; | error = ENOENT; | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
md = metadata_next(md, MODINFOMD_DEPLIST); | md = metadata_next(md, MODINFOMD_DEPLIST); | ||||
} while (md); | } while (md); | ||||
if (!error) | if (!error) | ||||
return (0); | return (0); | ||||
Show All 22 Lines | file_loadraw(const char *fname, char *type, int insert) | ||||
if ((file_findfile(NULL, NULL)) == NULL) { | if ((file_findfile(NULL, NULL)) == NULL) { | ||||
command_errmsg = "can't load file before kernel"; | command_errmsg = "can't load file before kernel"; | ||||
return(NULL); | return(NULL); | ||||
} | } | ||||
/* locate the file on the load path */ | /* locate the file on the load path */ | ||||
name = file_search(fname, NULL); | name = file_search(fname, NULL); | ||||
if (name == NULL) { | if (name == NULL) { | ||||
sprintf(command_errbuf, "can't find '%s'", fname); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"can't find '%s'", fname); | |||||
return(NULL); | return(NULL); | ||||
} | } | ||||
if ((fd = open(name, O_RDONLY)) < 0) { | if ((fd = open(name, O_RDONLY)) < 0) { | ||||
sprintf(command_errbuf, "can't open '%s': %s", name, strerror(errno)); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"can't open '%s': %s", name, strerror(errno)); | |||||
free(name); | free(name); | ||||
return(NULL); | return(NULL); | ||||
} | } | ||||
if (archsw.arch_loadaddr != NULL) | if (archsw.arch_loadaddr != NULL) | ||||
loadaddr = archsw.arch_loadaddr(LOAD_RAW, name, loadaddr); | loadaddr = archsw.arch_loadaddr(LOAD_RAW, name, loadaddr); | ||||
printf("%s ", name); | printf("%s ", name); | ||||
laddr = loadaddr; | laddr = loadaddr; | ||||
for (;;) { | for (;;) { | ||||
/* read in 4k chunks; size is not really important */ | /* read in 4k chunks; size is not really important */ | ||||
got = archsw.arch_readin(fd, laddr, 4096); | got = archsw.arch_readin(fd, laddr, 4096); | ||||
if (got == 0) /* end of file */ | if (got == 0) /* end of file */ | ||||
break; | break; | ||||
if (got < 0) { /* error */ | if (got < 0) { /* error */ | ||||
sprintf(command_errbuf, "error reading '%s': %s", name, strerror(errno)); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"error reading '%s': %s", name, strerror(errno)); | |||||
free(name); | free(name); | ||||
close(fd); | close(fd); | ||||
return(NULL); | return(NULL); | ||||
} | } | ||||
laddr += got; | laddr += got; | ||||
} | } | ||||
printf("size=%#jx\n", (uintmax_t)(laddr - loadaddr)); | printf("size=%#jx\n", (uintmax_t)(laddr - loadaddr)); | ||||
Show All 37 Lines | return (mod_loadkld(modname, argc, argv)); | ||||
/* see if module is already loaded */ | /* see if module is already loaded */ | ||||
mp = file_findmodule(NULL, modname, verinfo); | mp = file_findmodule(NULL, modname, verinfo); | ||||
if (mp) { | if (mp) { | ||||
#ifdef moduleargs | #ifdef moduleargs | ||||
if (mp->m_args) | if (mp->m_args) | ||||
free(mp->m_args); | free(mp->m_args); | ||||
mp->m_args = unargv(argc, argv); | mp->m_args = unargv(argc, argv); | ||||
#endif | #endif | ||||
sprintf(command_errbuf, "warning: module '%s' already loaded", mp->m_name); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"warning: module '%s' already loaded", mp->m_name); | |||||
return (0); | return (0); | ||||
} | } | ||||
/* locate file with the module on the search path */ | /* locate file with the module on the search path */ | ||||
filename = mod_searchmodule(modname, verinfo); | filename = mod_searchmodule(modname, verinfo); | ||||
if (filename == NULL) { | if (filename == NULL) { | ||||
sprintf(command_errbuf, "can't find '%s'", modname); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"can't find '%s'", modname); | |||||
return (ENOENT); | return (ENOENT); | ||||
} | } | ||||
err = mod_loadkld(filename, argc, argv); | err = mod_loadkld(filename, argc, argv); | ||||
return (err); | return (err); | ||||
} | } | ||||
/* | /* | ||||
* Load specified KLD. If path is omitted, then try to locate it via | * Load specified KLD. If path is omitted, then try to locate it via | ||||
* search path. | * search path. | ||||
*/ | */ | ||||
int | int | ||||
mod_loadkld(const char *kldname, int argc, char *argv[]) | mod_loadkld(const char *kldname, int argc, char *argv[]) | ||||
{ | { | ||||
struct preloaded_file *fp, *last_file; | struct preloaded_file *fp, *last_file; | ||||
int err; | int err; | ||||
char *filename; | char *filename; | ||||
/* | /* | ||||
* Get fully qualified KLD name | * Get fully qualified KLD name | ||||
*/ | */ | ||||
filename = file_search(kldname, kld_ext_list); | filename = file_search(kldname, kld_ext_list); | ||||
if (filename == NULL) { | if (filename == NULL) { | ||||
sprintf(command_errbuf, "can't find '%s'", kldname); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"can't find '%s'", kldname); | |||||
return (ENOENT); | return (ENOENT); | ||||
} | } | ||||
/* | /* | ||||
* Check if KLD already loaded | * Check if KLD already loaded | ||||
*/ | */ | ||||
fp = file_findfile(filename, NULL); | fp = file_findfile(filename, NULL); | ||||
if (fp) { | if (fp) { | ||||
sprintf(command_errbuf, "warning: KLD '%s' already loaded", filename); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"warning: KLD '%s' already loaded", filename); | |||||
free(filename); | free(filename); | ||||
return (0); | return (0); | ||||
} | } | ||||
for (last_file = preloaded_files; | for (last_file = preloaded_files; | ||||
last_file != NULL && last_file->f_next != NULL; | last_file != NULL && last_file->f_next != NULL; | ||||
last_file = last_file->f_next) | last_file = last_file->f_next) | ||||
; | ; | ||||
do { | do { | ||||
err = file_load(filename, loadaddr, &fp); | err = file_load(filename, loadaddr, &fp); | ||||
if (err) | if (err) | ||||
break; | break; | ||||
fp->f_args = unargv(argc, argv); | fp->f_args = unargv(argc, argv); | ||||
loadaddr = fp->f_addr + fp->f_size; | loadaddr = fp->f_addr + fp->f_size; | ||||
file_insert_tail(fp); /* Add to the list of loaded files */ | file_insert_tail(fp); /* Add to the list of loaded files */ | ||||
if (file_load_dependencies(fp) != 0) { | if (file_load_dependencies(fp) != 0) { | ||||
err = ENOENT; | err = ENOENT; | ||||
last_file->f_next = NULL; | last_file->f_next = NULL; | ||||
loadaddr = last_file->f_addr + last_file->f_size; | loadaddr = last_file->f_addr + last_file->f_size; | ||||
fp = NULL; | fp = NULL; | ||||
break; | break; | ||||
} | } | ||||
} while(0); | } while(0); | ||||
if (err == EFTYPE) | if (err == EFTYPE) { | ||||
sprintf(command_errbuf, "don't know how to load module '%s'", filename); | snprintf(command_errbuf, sizeof(command_errbuf), | ||||
"don't know how to load module '%s'", filename); | |||||
} | |||||
if (err && fp) | if (err && fp) | ||||
file_discard(fp); | file_discard(fp); | ||||
free(filename); | free(filename); | ||||
return (err); | return (err); | ||||
} | } | ||||
/* | /* | ||||
* Find a file matching (name) and (type). | * Find a file matching (name) and (type). | ||||
▲ Show 20 Lines • Show All 498 Lines • Show Last 20 Lines |