static int accf_dataready_modcmd(modcmd_t cmd, void *arg) { switch (cmd) { case MODULE_CMD_INIT: return accept_filt_add(&accf_data_filter); case MODULE_CMD_FINI: return accept_filt_del(&accf_data_filter); default: return ENOTTY; } }
int accept_filt_generic_mod_event(module_t mod, int event, void *data) { struct accept_filter *p; struct accept_filter *accfp = (struct accept_filter *) data; int error; switch (event) { case MOD_LOAD: MALLOC(p, struct accept_filter *, sizeof(*p), M_ACCF, M_WAITOK); bcopy(accfp, p, sizeof(*p)); crit_enter(); error = accept_filt_add(p); crit_exit(); break; case MOD_UNLOAD: /* * Do not support unloading yet. we don't keep track of refcounts * and unloading an accept filter callback and then having it called * is a bad thing. A simple fix would be to track the refcount * in the struct accept_filter. */ if (unloadable != 0) { crit_enter(); error = accept_filt_del(accfp->accf_name); crit_exit(); } else error = EOPNOTSUPP; break; case MOD_SHUTDOWN: error = 0; break; default: error = EOPNOTSUPP; break; } return (error); }