static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new_params *params) { struct instance *o = vo; o->i = i; // check arguments NCDValRef type_arg; NCDValRef name_arg; if (!NCDVal_ListRead(params->args, 2, &type_arg, &name_arg)) { ModuleLog(o->i, BLOG_ERROR, "wrong arity"); goto fail0; } if (!NCDVal_IsString(type_arg) || !NCDVal_IsStringNoNulls(name_arg)) { ModuleLog(o->i, BLOG_ERROR, "wrong type"); goto fail0; } // null terminate name NCDValNullTermString name_nts; if (!NCDVal_StringNullTerminate(name_arg, &name_nts)) { ModuleLog(o->i, BLOG_ERROR, "NCDVal_StringNullTerminate failed"); goto fail0; } if (NCDVal_StringEquals(type_arg, "index")) { if (sscanf(name_nts.data, "%"SCNu32, &o->index) != 1) { ModuleLog(o->i, BLOG_ERROR, "wrong index argument"); goto fail1; } } else if (NCDVal_StringEquals(type_arg, "wlan")) { if (!find_wlan_rfill(name_nts.data, &o->index)) { ModuleLog(o->i, BLOG_ERROR, "failed to find rfkill for wlan interface"); goto fail1; } } else { ModuleLog(o->i, BLOG_ERROR, "unknown type argument"); goto fail1; } // init monitor if (!NCDRfkillMonitor_Init(&o->monitor, o->i->params->iparams->reactor, (NCDRfkillMonitor_handler)monitor_handler, o)) { ModuleLog(o->i, BLOG_ERROR, "monitor failed"); goto fail1; } // set not up o->up = 0; // free name nts NCDValNullTermString_Free(&name_nts); return; fail1: NCDValNullTermString_Free(&name_nts); fail0: NCDModuleInst_Backend_DeadError(i); }
int NCDBProcessOpts_Init2 (NCDBProcessOpts *o, NCDValRef opts_arg, NCDBProcessOpts_func_unknown func_unknown, void *func_unknown_user, NCDModuleInst *i, int blog_channel, int *out_keep_stdout, int *out_keep_stderr) { if (!NCDVal_IsInvalid(opts_arg) && !NCDVal_IsMap(opts_arg)) { NCDModuleInst_Backend_Log(i, blog_channel, BLOG_ERROR, "options must be a map"); goto fail0; } o->username = NULL; o->do_setsid = 0; int keep_stdout = 0; int keep_stderr = 0; if (!NCDVal_IsInvalid(opts_arg)) { for (NCDValMapElem me = NCDVal_MapFirst(opts_arg); !NCDVal_MapElemInvalid(me); me = NCDVal_MapNext(opts_arg, me)) { NCDValRef key = NCDVal_MapElemKey(opts_arg, me); NCDValRef val = NCDVal_MapElemVal(opts_arg, me); if (NCDVal_IsString(key) && NCDVal_StringEquals(key, "keep_stdout")) { keep_stdout = ncd_read_boolean(val); } else if (NCDVal_IsString(key) && NCDVal_StringEquals(key, "keep_stderr")) { keep_stderr = ncd_read_boolean(val); } else if (NCDVal_IsString(key) && NCDVal_StringEquals(key, "do_setsid")) { o->do_setsid = ncd_read_boolean(val); } else if (NCDVal_IsString(key) && NCDVal_StringEquals(key, "username")) { if (!NCDVal_IsStringNoNulls(val)) { NCDModuleInst_Backend_Log(i, blog_channel, BLOG_ERROR, "username must be a string without nulls"); goto fail1; } b_cstring cstr = NCDVal_StringCstring(val); o->username = b_cstring_strdup(cstr, 0, cstr.length); if (!o->username) { NCDModuleInst_Backend_Log(i, blog_channel, BLOG_ERROR, "b_cstring_strdup failed"); goto fail1; } } else { if (!func_unknown || !func_unknown(func_unknown_user, key, val)) { NCDModuleInst_Backend_Log(i, blog_channel, BLOG_ERROR, "unknown option"); goto fail1; } } } } o->nfds = 0; if (keep_stdout) { o->fds[o->nfds] = 1; o->fds_map[o->nfds++] = 1; } if (keep_stderr) { o->fds[o->nfds] = 2; o->fds_map[o->nfds++] = 2; } o->fds[o->nfds] = -1; if (out_keep_stdout) { *out_keep_stdout = keep_stdout; } if (out_keep_stderr) { *out_keep_stderr = keep_stderr; } return 1; fail1: if (o->username) { BFree(o->username); } fail0: return 0; }
static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new_params *params) { struct instance *o = vo; o->i = i; // check arguments NCDValRef ifname_arg; NCDValRef opts_arg = NCDVal_NewInvalid(); if (!NCDVal_ListRead(params->args, 1, &ifname_arg) && !NCDVal_ListRead(params->args, 2, &ifname_arg, &opts_arg)) { ModuleLog(o->i, BLOG_ERROR, "wrong arity"); goto fail0; } if (!NCDVal_IsStringNoNulls(ifname_arg) || (!NCDVal_IsInvalid(opts_arg) && !NCDVal_IsList(opts_arg))) { ModuleLog(o->i, BLOG_ERROR, "wrong type"); goto fail0; } NCDValNullTermString hostname_nts = NCDValNullTermString_NewDummy(); NCDValNullTermString vendorclassid_nts = NCDValNullTermString_NewDummy(); struct BDHCPClient_opts opts = {}; // read options size_t count = NCDVal_IsInvalid(opts_arg) ? 0 : NCDVal_ListCount(opts_arg); for (size_t j = 0; j < count; j++) { NCDValRef opt = NCDVal_ListGet(opts_arg, j); // read name if (!NCDVal_IsString(opt)) { ModuleLog(o->i, BLOG_ERROR, "wrong option name type"); goto fail1; } if (NCDVal_StringEquals(opt, "hostname") || NCDVal_StringEquals(opt, "vendorclassid")) { int is_hostname = NCDVal_StringEquals(opt, "hostname"); // read value if (j == count) { ModuleLog(o->i, BLOG_ERROR, "option value missing"); goto fail1; } NCDValRef val = NCDVal_ListGet(opts_arg, j + 1); if (!NCDVal_IsStringNoNulls(val)) { ModuleLog(o->i, BLOG_ERROR, "wrong option value type"); goto fail1; } // null terminate NCDValNullTermString nts; if (!NCDVal_StringNullTerminate(val, &nts)) { ModuleLog(o->i, BLOG_ERROR, "NCDVal_StringNullTerminate failed"); goto fail1; } NCDValNullTermString *nts_ptr = (is_hostname ? &hostname_nts : &vendorclassid_nts); NCDValNullTermString_Free(nts_ptr); *nts_ptr = nts; if (is_hostname) { opts.hostname = nts.data; } else { opts.vendorclassid = nts.data; } j++; } else if (NCDVal_StringEquals(opt, "auto_clientid")) { opts.auto_clientid = 1; } else { ModuleLog(o->i, BLOG_ERROR, "unknown option name"); goto fail1; } } // null terminate ifname NCDValNullTermString ifname_nts; if (!NCDVal_StringNullTerminate(ifname_arg, &ifname_nts)) { ModuleLog(i, BLOG_ERROR, "NCDVal_StringNullTerminate failed"); goto fail1; } // init DHCP int res = BDHCPClient_Init(&o->dhcp, ifname_nts.data, opts, o->i->params->iparams->reactor, o->i->params->iparams->random2, (BDHCPClient_handler)dhcp_handler, o); NCDValNullTermString_Free(&ifname_nts); if (!res) { ModuleLog(o->i, BLOG_ERROR, "BDHCPClient_Init failed"); goto fail1; } // set not up o->up = 0; // free options nts's NCDValNullTermString_Free(&hostname_nts); NCDValNullTermString_Free(&vendorclassid_nts); return; fail1: NCDValNullTermString_Free(&hostname_nts); NCDValNullTermString_Free(&vendorclassid_nts); fail0: NCDModuleInst_Backend_DeadError(i); }
static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new_params *params) { struct instance *o = vo; o->i = i; // read arguments NCDValRef dest_arg; NCDValRef dest_prefix_arg = NCDVal_NewInvalid(); NCDValRef gateway_arg; NCDValRef metric_arg; NCDValRef ifname_arg; if (!NCDVal_ListRead(params->args, 4, &dest_arg, &gateway_arg, &metric_arg, &ifname_arg) && !NCDVal_ListRead(params->args, 5, &dest_arg, &dest_prefix_arg, &gateway_arg, &metric_arg, &ifname_arg) ) { ModuleLog(o->i, BLOG_ERROR, "wrong arity"); goto fail0; } if (!NCDVal_IsString(dest_arg) || !NCDVal_IsString(gateway_arg) || !NCDVal_IsStringNoNulls(ifname_arg) || (!NCDVal_IsInvalid(dest_prefix_arg) && !NCDVal_IsString(dest_prefix_arg)) ) { ModuleLog(o->i, BLOG_ERROR, "wrong type"); goto fail0; } // read dest if (NCDVal_IsInvalid(dest_prefix_arg)) { if (!ipaddr6_parse_ipv6_ifaddr_bin(NCDVal_StringData(dest_arg), NCDVal_StringLength(dest_arg), &o->dest)) { ModuleLog(o->i, BLOG_ERROR, "wrong CIDR notation dest"); goto fail0; } } else { if (!ipaddr6_parse_ipv6_addr_bin(NCDVal_StringData(dest_arg), NCDVal_StringLength(dest_arg), &o->dest.addr)) { ModuleLog(o->i, BLOG_ERROR, "wrong dest addr"); goto fail0; } if (!ipaddr6_parse_ipv6_prefix_bin(NCDVal_StringData(dest_prefix_arg), NCDVal_StringLength(dest_prefix_arg), &o->dest.prefix)) { ModuleLog(o->i, BLOG_ERROR, "wrong dest prefix"); goto fail0; } } // read gateway and choose type if (NCDVal_StringEquals(gateway_arg, "none")) { o->type = TYPE_IFONLY; } else if (NCDVal_StringEquals(gateway_arg, "blackhole")) { o->type = TYPE_BLACKHOLE; } else { if (!ipaddr6_parse_ipv6_addr_bin(NCDVal_StringData(gateway_arg), NCDVal_StringLength(gateway_arg), &o->gateway)) { ModuleLog(o->i, BLOG_ERROR, "wrong gateway"); goto fail0; } o->type = TYPE_NORMAL; } // read metric uintmax_t metric; if (!ncd_read_uintmax(metric_arg, &metric) || metric > INT_MAX) { ModuleLog(i, BLOG_ERROR, "bad metric"); goto fail0; } o->metric = metric; // null terminate ifname if (!NCDVal_StringNullTerminate(ifname_arg, &o->ifname_nts)) { ModuleLog(i, BLOG_ERROR, "NCDVal_StringNullTerminate failed"); goto fail0; } // add route int res = 0; // to remove warning switch (o->type) { case TYPE_NORMAL: res = NCDIfConfig_add_ipv6_route(o->dest, &o->gateway, o->metric, o->ifname_nts.data); break; case TYPE_IFONLY: res = NCDIfConfig_add_ipv6_route(o->dest, NULL, o->metric, o->ifname_nts.data); break; case TYPE_BLACKHOLE: res = NCDIfConfig_add_ipv6_blackhole_route(o->dest, o->metric); break; default: ASSERT(0); } if (!res) { ModuleLog(o->i, BLOG_ERROR, "failed to add route"); goto fail1; } // signal up NCDModuleInst_Backend_Up(o->i); return; fail1: NCDValNullTermString_Free(&o->ifname_nts); fail0: NCDModuleInst_Backend_DeadError(i); }