X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=wireless.c;h=c19d12c073df92d418c379839a37bae740b8fc43;hp=7a03ce85cc337ab04ec2e9674eb451cdd9521533;hb=cc30a45f85a647921bc5eff0ae947c9aa786ce4b;hpb=0f4d91e3a3c53c3e40a2ad53d95a1fd00f06d210 diff --git a/wireless.c b/wireless.c index 7a03ce8..c19d12c 100644 --- a/wireless.c +++ b/wireless.c @@ -167,6 +167,7 @@ wireless_device_free_state(struct wireless_device *wdev) { struct wireless_interface *vif; + uloop_timeout_cancel(&wdev->timeout); wireless_complete_kill_request(wdev); free(wdev->data); wdev->data = NULL; @@ -197,6 +198,7 @@ wireless_device_setup_cancel(struct wireless_device *wdev) if (wdev->cancel) return; + D(WIRELESS, "Cancel wireless device '%s' setup\n", wdev->name); wdev->cancel = true; uloop_timeout_set(&wdev->timeout, 10 * 1000); } @@ -257,6 +259,7 @@ wireless_device_mark_down(struct wireless_device *wdev) wireless_process_kill_all(wdev, SIGTERM, true); + wdev->cancel = false; wdev->state = IFS_DOWN; wireless_device_free_state(wdev); @@ -352,7 +355,10 @@ wireless_device_free(struct wireless_device *wdev) static void wdev_handle_config_change(struct wireless_device *wdev) { - switch(wdev->config_state) { + enum interface_config_state state = wdev->config_state; + + wdev->config_state = IFC_NORMAL; + switch(state) { case IFC_NORMAL: break; case IFC_RELOAD: @@ -706,6 +712,7 @@ wireless_device_add_process(struct wireless_device *wdev, struct blob_attr *data struct blob_attr *tb[__PROC_ATTR_MAX]; struct wireless_process *proc; char *name; + int pid; if (!data) return UBUS_STATUS_INVALID_ARGUMENT; @@ -714,10 +721,14 @@ wireless_device_add_process(struct wireless_device *wdev, struct blob_attr *data if (!tb[PROC_ATTR_PID] || !tb[PROC_ATTR_EXE]) return UBUS_STATUS_INVALID_ARGUMENT; + pid = blobmsg_get_u32(tb[PROC_ATTR_PID]); + if (pid < 2) + return UBUS_STATUS_INVALID_ARGUMENT; + proc = calloc_a(sizeof(*proc), &name, strlen(blobmsg_data(tb[PROC_ATTR_EXE])) + 1); - proc->pid = blobmsg_get_u32(tb[PROC_ATTR_PID]); + proc->pid = pid; proc->exe = strcpy(name, blobmsg_data(tb[PROC_ATTR_EXE])); if (tb[PROC_ATTR_REQUIRED]) @@ -754,7 +765,7 @@ wireless_device_process_kill_all(struct wireless_device *wdev, struct blob_attr signal = blobmsg_get_u32(cur); if ((cur = tb[KILL_ATTR_IMMEDIATE])) - immediate = blobmsg_get_u32(cur); + immediate = blobmsg_get_bool(cur); if (wdev->state != IFS_TEARDOWN || wdev->kill_request) return UBUS_STATUS_PERMISSION_DENIED;