static void client_handler (struct instance *o, char *devpath, int have_map, BStringMap map) { if (o->devpath && !strcmp(devpath, o->devpath) && !NCDUdevManager_Query(o->i->params->iparams->umanager, o->devpath)) { // free devpath free(o->devpath); // set no devpath o->devpath = NULL; // signal down NCDModuleInst_Backend_Down(o->i); } else { const BStringMap *cache_map = NCDUdevManager_Query(o->i->params->iparams->umanager, devpath); if (!cache_map) { goto out; } int match_res = regexec(&o->reg, devpath, 0, NULL, 0); const char *interface = BStringMap_Get(cache_map, "INTERFACE"); const char *ifindex_str = BStringMap_Get(cache_map, "IFINDEX"); uintmax_t ifindex; if (!(!match_res && interface && MemRef_Equal(MemRef_MakeCstr(interface), o->ifname) && ifindex_str && parse_unsigned_integer(MemRef_MakeCstr(ifindex_str), &ifindex))) { goto out; } if (o->devpath && (strcmp(o->devpath, devpath) || o->ifindex != ifindex)) { // free devpath free(o->devpath); // set no devpath o->devpath = NULL; // signal down NCDModuleInst_Backend_Down(o->i); } if (!o->devpath) { // grab devpath o->devpath = devpath; devpath = NULL; // remember ifindex o->ifindex = ifindex; // signal up NCDModuleInst_Backend_Up(o->i); } } out: free(devpath); if (have_map) { BStringMap_Free(&map); } }
static void arpprobe_handler (struct instance *o, int event) { switch (event) { case BARPPROBE_EVENT_EXIST: { ASSERT(o->state == STATE_UNKNOWN || o->state == STATE_NOEXIST) ModuleLog(o->i, BLOG_INFO, "exist"); if (o->state == STATE_NOEXIST) { // signal down NCDModuleInst_Backend_Down(o->i); } // signal up NCDModuleInst_Backend_Up(o->i); // set state exist o->state = STATE_EXIST; } break; case BARPPROBE_EVENT_NOEXIST: { ASSERT(o->state == STATE_UNKNOWN || o->state == STATE_EXIST) ModuleLog(o->i, BLOG_INFO, "noexist"); if (o->state == STATE_EXIST) { // signal down NCDModuleInst_Backend_Down(o->i); } // signal up NCDModuleInst_Backend_Up(o->i); // set state noexist o->state = STATE_NOEXIST; } break; case BARPPROBE_EVENT_ERROR: { ModuleLog(o->i, BLOG_ERROR, "error"); // die instance_free(o, 1); return; } break; default: ASSERT(0); } }
static void process_handler_event (struct instance *o, int event) { switch (event) { case NCDMODULEPROCESS_EVENT_UP: { ASSERT(o->state == STATE_WORKING) // signal up NCDModuleInst_Backend_Up(o->i); // set state up o->state = STATE_UP; } break; case NCDMODULEPROCESS_EVENT_DOWN: { ASSERT(o->state == STATE_UP) // signal down NCDModuleInst_Backend_Down(o->i); // set state waiting o->state = STATE_WAITING; } break; case NCDMODULEPROCESS_EVENT_TERMINATED: { ASSERT(o->state == STATE_TERMINATING) // die finally instance_free(o); return; } break; default: ASSERT(0); } }
static void monitor_handler (struct instance *o, struct rfkill_event event) { if (event.idx != o->index) { return; } int was_up = o->up; o->up = (event.op != RFKILL_OP_DEL && !event.soft && !event.hard); if (o->up && !was_up) { NCDModuleInst_Backend_Up(o->i); } else if (!o->up && was_up) { NCDModuleInst_Backend_Down(o->i); } }
static void dhcp_handler (struct instance *o, int event) { switch (event) { case BDHCPCLIENT_EVENT_UP: { ASSERT(!o->up) o->up = 1; NCDModuleInst_Backend_Up(o->i); } break; case BDHCPCLIENT_EVENT_DOWN: { ASSERT(o->up) o->up = 0; NCDModuleInst_Backend_Down(o->i); } break; case BDHCPCLIENT_EVENT_ERROR: { instance_free(o, 1); return; } break; default: ASSERT(0); } }