void module_register_init(const void *arg) { const moduledata_t* data = (const moduledata_t*) arg; int error; module_t mod; mod = module_lookupbyname(data->name); if (mod == NULL) { #if 0 panic("module_register_init: module named %s not found", data->name); #else /* temporary kludge until kernel `file' attachment registers modules */ error = module_register(data, linker_kernel_file); if (error) panic("module_register_init: register of module failed! %d", error); mod = module_lookupbyname(data->name); if (mod == NULL) panic("module_register_init: module STILL not found!"); #endif } error = MOD_EVENT(mod, MOD_LOAD); if (error) { module_unload(mod); /* ignore error */ module_release(mod); kprintf("module_register_init: MOD_LOAD (%s, %lx, %p) error %d\n", data->name, (u_long)(uintfptr_t)data->evhand, data->priv, error); } }
int module_register(const moduledata_t *data, linker_file_t container) { size_t namelen; module_t newmod; newmod = module_lookupbyname(data->name); if (newmod != NULL) { kprintf("module_register: module %s already exists!\n", data->name); return EEXIST; } namelen = strlen(data->name) + 1; newmod = (module_t) kmalloc(sizeof(struct module) + namelen, M_MODULE, M_WAITOK); newmod->refs = 1; newmod->id = nextid++; newmod->name = (char *) (newmod + 1); strcpy(newmod->name, data->name); newmod->handler = data->evhand ? data->evhand : modevent_nop; newmod->arg = data->priv; bzero(&newmod->data, sizeof(newmod->data)); TAILQ_INSERT_TAIL(&modules, newmod, link); if (container == NULL) container = linker_current_file; if (container) TAILQ_INSERT_TAIL(&container->modules, newmod, flink); newmod->file = container; return 0; }
int modfind(struct proc* p, struct modfind_args* uap) { int error = 0; char name[MAXMODNAME]; module_t mod; if ((error = copyinstr(SCARG(uap, name), name, sizeof name, 0)) != 0) goto out; mod = module_lookupbyname(name); if (!mod) error = ENOENT; else p->p_retval[0] = mod->id; out: return error; }
/* * MPALMOSTSAFE */ int sys_modfind(struct modfind_args *uap) { int error; char name[MAXMODNAME]; module_t mod; lwkt_gettoken(&mod_token); if ((error = copyinstr(uap->name, name, sizeof name, 0)) != 0) goto out; mod = module_lookupbyname(name); if (!mod) error = ENOENT; else uap->sysmsg_result = mod->id; out: lwkt_reltoken(&mod_token); return error; }