Lines Matching +full:ctrl +full:- +full:len

2  * WPA Supplicant / UNIX domain socket -based control interface
3 * Copyright (c) 2004-2020, Jouni Malinen <j@w1.fi>
32 /* Per-interface ctrl_iface */
59 size_t len; member
67 size_t len,
77 size_t len) in wpas_ctrl_sock_debug() argument
84 if (len >= 5 && os_strncmp(buf, "PONG\n", 5) == 0) in wpas_ctrl_sock_debug()
90 sndbuf = -1; in wpas_ctrl_sock_debug()
93 outq = -1; in wpas_ctrl_sock_debug()
96 "CTRL-DEBUG: %s: sock=%d sndbuf=%d outq=%d send_len=%d", in wpas_ctrl_sock_debug()
97 title, sock, sndbuf, outq, (int) len); in wpas_ctrl_sock_debug()
125 return ctrl_iface_level(&priv->ctrl_dst, from, fromlen, level); in wpa_supplicant_ctrl_iface_level()
161 if (wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst, &from, in wpa_supplicant_ctrl_iface_receive()
169 if (wpa_supplicant_ctrl_iface_detach(&priv->ctrl_dst, &from, in wpa_supplicant_ctrl_iface_receive()
205 wpas_ctrl_sock_debug("ctrl_sock-sendto", sock, reply, in wpa_supplicant_ctrl_iface_receive()
211 "ctrl_iface sendto failed: %d - %s", in wpa_supplicant_ctrl_iface_receive()
228 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to send response to ATTACH - detaching"); in wpa_supplicant_ctrl_iface_receive()
231 &priv->ctrl_dst, &from, fromlen); in wpa_supplicant_ctrl_iface_receive()
239 eapol_sm_notify_ctrl_attached(wpa_s->eapol); in wpa_supplicant_ctrl_iface_receive()
246 size_t len; in wpa_supplicant_ctrl_iface_path() local
250 if (wpa_s->conf->ctrl_interface == NULL) in wpa_supplicant_ctrl_iface_path()
253 pbuf = os_strdup(wpa_s->conf->ctrl_interface); in wpa_supplicant_ctrl_iface_path()
265 len = os_strlen(dir) + os_strlen(wpa_s->ifname) + 2; in wpa_supplicant_ctrl_iface_path()
266 buf = os_malloc(len); in wpa_supplicant_ctrl_iface_path()
272 res = os_snprintf(buf, len, "%s/%s", dir, wpa_s->ifname); in wpa_supplicant_ctrl_iface_path()
273 if (os_snprintf_error(len, res)) { in wpa_supplicant_ctrl_iface_path()
281 * as a file name - convert invalid chars to underscores */ in wpa_supplicant_ctrl_iface_path()
319 gpriv = global->ctrl_iface; in wpas_ctrl_msg_send_pending_global()
320 while (gpriv && !dl_list_empty(&gpriv->msg_queue) && in wpas_ctrl_msg_send_pending_global()
321 !wpas_ctrl_iface_throttle(gpriv->sock)) { in wpas_ctrl_msg_send_pending_global()
322 msg = dl_list_first(&gpriv->msg_queue, struct ctrl_iface_msg, in wpas_ctrl_msg_send_pending_global()
326 dl_list_del(&msg->list); in wpas_ctrl_msg_send_pending_global()
328 msg->wpa_s, in wpas_ctrl_msg_send_pending_global()
329 msg->type != WPA_MSG_PER_INTERFACE ? in wpas_ctrl_msg_send_pending_global()
330 NULL : msg->wpa_s->ifname, in wpas_ctrl_msg_send_pending_global()
331 gpriv->sock, &gpriv->ctrl_dst, msg->level, in wpas_ctrl_msg_send_pending_global()
332 msg->txt, msg->len, NULL, gpriv); in wpas_ctrl_msg_send_pending_global()
343 priv = wpa_s->ctrl_iface; in wpas_ctrl_msg_send_pending_iface()
344 while (priv && !dl_list_empty(&priv->msg_queue) && in wpas_ctrl_msg_send_pending_iface()
345 !wpas_ctrl_iface_throttle(priv->sock)) { in wpas_ctrl_msg_send_pending_iface()
346 msg = dl_list_first(&priv->msg_queue, struct ctrl_iface_msg, in wpas_ctrl_msg_send_pending_iface()
350 dl_list_del(&msg->list); in wpas_ctrl_msg_send_pending_iface()
351 wpa_supplicant_ctrl_iface_send(wpa_s, NULL, priv->sock, in wpas_ctrl_msg_send_pending_iface()
352 &priv->ctrl_dst, msg->level, in wpas_ctrl_msg_send_pending_iface()
353 msg->txt, msg->len, priv, NULL); in wpas_ctrl_msg_send_pending_iface()
364 int sock = -1, gsock = -1; in wpas_ctrl_msg_queue_timeout()
366 wpas_ctrl_msg_send_pending_global(wpa_s->global); in wpas_ctrl_msg_queue_timeout()
369 priv = wpa_s->ctrl_iface; in wpas_ctrl_msg_queue_timeout()
370 if (priv && !dl_list_empty(&priv->msg_queue)) in wpas_ctrl_msg_queue_timeout()
371 sock = priv->sock; in wpas_ctrl_msg_queue_timeout()
373 gpriv = wpa_s->global->ctrl_iface; in wpas_ctrl_msg_queue_timeout()
374 if (gpriv && !dl_list_empty(&gpriv->msg_queue)) in wpas_ctrl_msg_queue_timeout()
375 gsock = gpriv->sock; in wpas_ctrl_msg_queue_timeout()
377 if (sock > -1 || gsock > -1) { in wpas_ctrl_msg_queue_timeout()
380 "CTRL: Had to throttle pending event message transmission for (sock %d gsock %d)", in wpas_ctrl_msg_queue_timeout()
391 const char *txt, size_t len) in wpas_ctrl_msg_queue() argument
395 msg = os_zalloc(sizeof(*msg) + len); in wpas_ctrl_msg_queue()
399 msg->wpa_s = wpa_s; in wpas_ctrl_msg_queue()
400 msg->level = level; in wpas_ctrl_msg_queue()
401 msg->type = type; in wpas_ctrl_msg_queue()
402 os_memcpy(msg + 1, txt, len); in wpas_ctrl_msg_queue()
403 msg->txt = (const char *) (msg + 1); in wpas_ctrl_msg_queue()
404 msg->len = len; in wpas_ctrl_msg_queue()
405 dl_list_add_tail(queue, &msg->list); in wpas_ctrl_msg_queue()
421 wpa_printf(MSG_DEBUG, "CTRL: Dropped oldest pending message"); in wpas_ctrl_msg_queue_limit()
422 dl_list_del(&msg->list); in wpas_ctrl_msg_queue_limit()
430 const char *txt, size_t len) in wpa_supplicant_ctrl_iface_msg_cb() argument
439 gpriv = wpa_s->global->ctrl_iface; in wpa_supplicant_ctrl_iface_msg_cb()
442 !dl_list_empty(&gpriv->ctrl_dst)) { in wpa_supplicant_ctrl_iface_msg_cb()
443 if (!dl_list_empty(&gpriv->msg_queue) || in wpa_supplicant_ctrl_iface_msg_cb()
444 wpas_ctrl_iface_throttle(gpriv->sock)) { in wpa_supplicant_ctrl_iface_msg_cb()
445 if (gpriv->throttle_count == 0) { in wpa_supplicant_ctrl_iface_msg_cb()
447 "CTRL: Had to throttle global event message for sock %d", in wpa_supplicant_ctrl_iface_msg_cb()
448 gpriv->sock); in wpa_supplicant_ctrl_iface_msg_cb()
450 gpriv->throttle_count++; in wpa_supplicant_ctrl_iface_msg_cb()
451 wpas_ctrl_msg_queue_limit(gpriv->throttle_count, in wpa_supplicant_ctrl_iface_msg_cb()
452 &gpriv->msg_queue); in wpa_supplicant_ctrl_iface_msg_cb()
453 wpas_ctrl_msg_queue(&gpriv->msg_queue, wpa_s, level, in wpa_supplicant_ctrl_iface_msg_cb()
454 type, txt, len); in wpa_supplicant_ctrl_iface_msg_cb()
456 if (gpriv->throttle_count) { in wpa_supplicant_ctrl_iface_msg_cb()
458 "CTRL: Had to throttle %u global event message(s) for sock %d", in wpa_supplicant_ctrl_iface_msg_cb()
459 gpriv->throttle_count, gpriv->sock); in wpa_supplicant_ctrl_iface_msg_cb()
461 gpriv->throttle_count = 0; in wpa_supplicant_ctrl_iface_msg_cb()
465 NULL : wpa_s->ifname, in wpa_supplicant_ctrl_iface_msg_cb()
466 gpriv->sock, &gpriv->ctrl_dst, level, in wpa_supplicant_ctrl_iface_msg_cb()
467 txt, len, NULL, gpriv); in wpa_supplicant_ctrl_iface_msg_cb()
471 priv = wpa_s->ctrl_iface; in wpa_supplicant_ctrl_iface_msg_cb()
474 if (!dl_list_empty(&priv->msg_queue) || in wpa_supplicant_ctrl_iface_msg_cb()
475 wpas_ctrl_iface_throttle(priv->sock)) { in wpa_supplicant_ctrl_iface_msg_cb()
476 if (priv->throttle_count == 0) { in wpa_supplicant_ctrl_iface_msg_cb()
478 "CTRL: Had to throttle event message for sock %d", in wpa_supplicant_ctrl_iface_msg_cb()
479 priv->sock); in wpa_supplicant_ctrl_iface_msg_cb()
481 priv->throttle_count++; in wpa_supplicant_ctrl_iface_msg_cb()
482 wpas_ctrl_msg_queue_limit(priv->throttle_count, in wpa_supplicant_ctrl_iface_msg_cb()
483 &priv->msg_queue); in wpa_supplicant_ctrl_iface_msg_cb()
484 wpas_ctrl_msg_queue(&priv->msg_queue, wpa_s, level, in wpa_supplicant_ctrl_iface_msg_cb()
485 type, txt, len); in wpa_supplicant_ctrl_iface_msg_cb()
487 if (priv->throttle_count) { in wpa_supplicant_ctrl_iface_msg_cb()
489 "CTRL: Had to throttle %u event message(s) for sock %d", in wpa_supplicant_ctrl_iface_msg_cb()
490 priv->throttle_count, priv->sock); in wpa_supplicant_ctrl_iface_msg_cb()
492 priv->throttle_count = 0; in wpa_supplicant_ctrl_iface_msg_cb()
493 wpa_supplicant_ctrl_iface_send(wpa_s, NULL, priv->sock, in wpa_supplicant_ctrl_iface_msg_cb()
494 &priv->ctrl_dst, level, in wpa_supplicant_ctrl_iface_msg_cb()
495 txt, len, priv, NULL); in wpa_supplicant_ctrl_iface_msg_cb()
517 buf = os_strdup(wpa_s->conf->ctrl_interface); in wpas_ctrl_iface_open_sock()
522 wpa_s->conf->ctrl_interface); in wpas_ctrl_iface_open_sock()
523 priv->sock = android_get_control_socket(addr.sun_path); in wpas_ctrl_iface_open_sock()
524 if (priv->sock >= 0) { in wpas_ctrl_iface_open_sock()
525 priv->android_control_socket = 1; in wpas_ctrl_iface_open_sock()
538 gid_str = wpa_s->conf->ctrl_interface_group; in wpas_ctrl_iface_open_sock()
556 * directory without group access. This breaks things since Wi-Fi in wpas_ctrl_iface_open_sock()
562 wpa_printf(MSG_ERROR, "CTRL: Could not chmod directory: %s", in wpas_ctrl_iface_open_sock()
571 gid = grp->gr_gid; in wpas_ctrl_iface_open_sock()
577 /* Group name not found - try to parse this as gid */ in wpas_ctrl_iface_open_sock()
580 wpa_printf(MSG_ERROR, "CTRL: Invalid group " in wpas_ctrl_iface_open_sock()
590 if (gid_set && lchown(dir, -1, gid) < 0) { in wpas_ctrl_iface_open_sock()
599 wpa_printf(MSG_ERROR, "CTRL: chmod[ctrl_interface]: %s", in wpas_ctrl_iface_open_sock()
604 if (os_strlen(dir) + 1 + os_strlen(wpa_s->ifname) >= in wpas_ctrl_iface_open_sock()
610 priv->sock = socket(PF_UNIX, SOCK_DGRAM, 0); in wpas_ctrl_iface_open_sock()
611 if (priv->sock < 0) { in wpas_ctrl_iface_open_sock()
625 if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { in wpas_ctrl_iface_open_sock()
628 if (connect(priv->sock, (struct sockaddr *) &addr, in wpas_ctrl_iface_open_sock()
631 " allow connections - assuming it was left" in wpas_ctrl_iface_open_sock()
639 if (bind(priv->sock, (struct sockaddr *) &addr, in wpas_ctrl_iface_open_sock()
641 wpa_printf(MSG_ERROR, "supp-ctrl-iface-init: bind(PF_UNIX): %s", in wpas_ctrl_iface_open_sock()
649 "be in use - cannot override it"); in wpas_ctrl_iface_open_sock()
658 if (gid_set && lchown(fname, -1, gid) < 0) { in wpas_ctrl_iface_open_sock()
676 * Make socket non-blocking so that we don't hang forever if in wpas_ctrl_iface_open_sock()
679 flags = fcntl(priv->sock, F_GETFL); in wpas_ctrl_iface_open_sock()
682 if (fcntl(priv->sock, F_SETFL, flags) < 0) { in wpas_ctrl_iface_open_sock()
683 wpa_printf(MSG_INFO, "fcntl(ctrl, O_NONBLOCK): %s", in wpas_ctrl_iface_open_sock()
693 if (getsockopt(priv->sock, SOL_SOCKET, SO_SNDBUF, &optval, &optlen) == -1) { in wpas_ctrl_iface_open_sock()
695 priv->sock, strerror(errno)); in wpas_ctrl_iface_open_sock()
698 if (setsockopt(priv->sock, SOL_SOCKET, SO_SNDBUF, &optval, in wpas_ctrl_iface_open_sock()
699 sizeof(optval)) == -1) in wpas_ctrl_iface_open_sock()
701 "sock=%d: %s", priv->sock, strerror(errno)); in wpas_ctrl_iface_open_sock()
705 eloop_register_read_sock(priv->sock, wpa_supplicant_ctrl_iface_receive, in wpas_ctrl_iface_open_sock()
713 if (priv->sock >= 0) { in wpas_ctrl_iface_open_sock()
714 close(priv->sock); in wpas_ctrl_iface_open_sock()
715 priv->sock = -1; in wpas_ctrl_iface_open_sock()
722 return -1; in wpas_ctrl_iface_open_sock()
734 dl_list_init(&priv->ctrl_dst); in wpa_supplicant_ctrl_iface_init()
735 dl_list_init(&priv->msg_queue); in wpa_supplicant_ctrl_iface_init()
736 priv->wpa_s = wpa_s; in wpa_supplicant_ctrl_iface_init()
737 priv->sock = -1; in wpa_supplicant_ctrl_iface_init()
739 if (wpa_s->conf->ctrl_interface == NULL) in wpa_supplicant_ctrl_iface_init()
743 if (wpa_s->global->params.ctrl_interface) { in wpa_supplicant_ctrl_iface_init()
746 if (wpa_s->global->params.ctrl_interface[0] == '/') { in wpa_supplicant_ctrl_iface_init()
747 if (os_strcmp(wpa_s->global->params.ctrl_interface, in wpa_supplicant_ctrl_iface_init()
748 wpa_s->conf->ctrl_interface) == 0) in wpa_supplicant_ctrl_iface_init()
750 } else if (os_strncmp(wpa_s->global->params.ctrl_interface, in wpa_supplicant_ctrl_iface_init()
752 os_strncmp(wpa_s->global->params.ctrl_interface, in wpa_supplicant_ctrl_iface_init()
758 * convention for the global ctrl interface. This logic in wpa_supplicant_ctrl_iface_init()
762 pos = os_strchr(wpa_s->global->params.ctrl_interface, in wpa_supplicant_ctrl_iface_init()
766 wpa_s->conf->ctrl_interface) == 0) in wpa_supplicant_ctrl_iface_init()
775 * process, do not open the per-interface ctrl_iface in wpa_supplicant_ctrl_iface_init()
777 * was set from the command line since the Wi-Fi in wpa_supplicant_ctrl_iface_init()
781 … "global ctrl interface %s matches ctrl interface %s - do not open per-interface ctrl interface", in wpa_supplicant_ctrl_iface_init()
782 wpa_s->global->params.ctrl_interface, in wpa_supplicant_ctrl_iface_init()
783 wpa_s->conf->ctrl_interface); in wpa_supplicant_ctrl_iface_init()
803 if (priv->sock <= 0) in wpas_ctrl_iface_reinit()
804 return -1; in wpas_ctrl_iface_reinit()
809 * service. Such a socket is maintained as a key-value pair in in wpas_ctrl_iface_reinit()
813 if (priv->android_control_socket) in wpas_ctrl_iface_reinit()
814 return priv->sock; in wpas_ctrl_iface_reinit()
816 eloop_unregister_read_sock(priv->sock); in wpas_ctrl_iface_reinit()
817 close(priv->sock); in wpas_ctrl_iface_reinit()
818 priv->sock = -1; in wpas_ctrl_iface_reinit()
821 return -1; in wpas_ctrl_iface_reinit()
822 return priv->sock; in wpas_ctrl_iface_reinit()
834 if (!global || !global->ctrl_iface) in wpas_global_ctrl_iface_flush_queued_msg()
837 gpriv = global->ctrl_iface; in wpas_global_ctrl_iface_flush_queued_msg()
838 dl_list_for_each_safe(msg, prev_msg, &gpriv->msg_queue, in wpas_global_ctrl_iface_flush_queued_msg()
840 if (msg->wpa_s == wpa_s) { in wpas_global_ctrl_iface_flush_queued_msg()
842 dl_list_del(&msg->list); in wpas_global_ctrl_iface_flush_queued_msg()
849 "CTRL: Dropped %u pending message(s) for interface that is being removed", in wpas_global_ctrl_iface_flush_queued_msg()
867 wpas_global_ctrl_iface_flush_queued_msg(wpa_s->global, wpa_s); in wpa_supplicant_ctrl_iface_deinit()
872 if (priv->sock > -1) { in wpa_supplicant_ctrl_iface_deinit()
875 eloop_unregister_read_sock(priv->sock); in wpa_supplicant_ctrl_iface_deinit()
876 if (!dl_list_empty(&priv->ctrl_dst)) { in wpa_supplicant_ctrl_iface_deinit()
886 close(priv->sock); in wpa_supplicant_ctrl_iface_deinit()
887 priv->sock = -1; in wpa_supplicant_ctrl_iface_deinit()
888 fname = wpa_supplicant_ctrl_iface_path(priv->wpa_s); in wpa_supplicant_ctrl_iface_deinit()
894 if (priv->wpa_s->conf->ctrl_interface == NULL) in wpa_supplicant_ctrl_iface_deinit()
896 buf = os_strdup(priv->wpa_s->conf->ctrl_interface); in wpa_supplicant_ctrl_iface_deinit()
911 "directory not empty - leaving it " in wpa_supplicant_ctrl_iface_deinit()
923 dl_list_for_each_safe(dst, prev, &priv->ctrl_dst, struct wpa_ctrl_dst, in wpa_supplicant_ctrl_iface_deinit()
925 dl_list_del(&dst->list); in wpa_supplicant_ctrl_iface_deinit()
928 dl_list_for_each_safe(msg, prev_msg, &priv->msg_queue, in wpa_supplicant_ctrl_iface_deinit()
930 dl_list_del(&msg->list); in wpa_supplicant_ctrl_iface_deinit()
933 gpriv = priv->wpa_s->global->ctrl_iface; in wpa_supplicant_ctrl_iface_deinit()
935 dl_list_for_each_safe(msg, prev_msg, &gpriv->msg_queue, in wpa_supplicant_ctrl_iface_deinit()
937 if (msg->wpa_s == priv->wpa_s) { in wpa_supplicant_ctrl_iface_deinit()
938 dl_list_del(&msg->list); in wpa_supplicant_ctrl_iface_deinit()
943 wpas_global_ctrl_iface_flush_queued_msg(wpa_s->global, wpa_s); in wpa_supplicant_ctrl_iface_deinit()
944 eloop_cancel_timeout(wpas_ctrl_msg_queue_timeout, priv->wpa_s, NULL); in wpa_supplicant_ctrl_iface_deinit()
950 * wpa_supplicant_ctrl_iface_send - Send a control interface packet to monitors
956 * @len: Message length
964 size_t len, in wpa_supplicant_ctrl_iface_send() argument
996 io[idx].iov_len = len; in wpa_supplicant_ctrl_iface_send()
1006 if (level < dst->debug_level) in wpa_supplicant_ctrl_iface_send()
1009 msg.msg_name = (void *) &dst->addr; in wpa_supplicant_ctrl_iface_send()
1010 msg.msg_namelen = dst->addrlen; in wpa_supplicant_ctrl_iface_send()
1011 wpas_ctrl_sock_debug("ctrl_sock-sendmsg", sock, buf, len); in wpa_supplicant_ctrl_iface_send()
1015 &dst->addr, dst->addrlen); in wpa_supplicant_ctrl_iface_send()
1016 dst->errors = 0; in wpa_supplicant_ctrl_iface_send()
1023 sockaddr_print(MSG_DEBUG, txt, &dst->addr, dst->addrlen); in wpa_supplicant_ctrl_iface_send()
1024 dst->errors++; in wpa_supplicant_ctrl_iface_send()
1026 if (dst->errors > 10 || _errno == ENOENT || _errno == EPERM) { in wpa_supplicant_ctrl_iface_send()
1028 &dst->addr, dst->addrlen); in wpa_supplicant_ctrl_iface_send()
1029 wpa_supplicant_ctrl_iface_detach(ctrl_dst, &dst->addr, in wpa_supplicant_ctrl_iface_send()
1030 dst->addrlen); in wpa_supplicant_ctrl_iface_send()
1045 wpa_s->global, gp); in wpa_supplicant_ctrl_iface_send()
1065 if (priv->sock == -1) in wpa_supplicant_ctrl_iface_wait()
1069 wpa_printf(MSG_DEBUG, "CTRL_IFACE - %s - wait for monitor to " in wpa_supplicant_ctrl_iface_wait()
1070 "attach", priv->wpa_s->ifname); in wpa_supplicant_ctrl_iface_wait()
1071 eloop_wait_for_read_sock(priv->sock); in wpa_supplicant_ctrl_iface_wait()
1073 res = recvfrom(priv->sock, buf, sizeof(buf) - 1, 0, in wpa_supplicant_ctrl_iface_wait()
1084 if (!wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst, in wpa_supplicant_ctrl_iface_wait()
1087 if (sendto(priv->sock, "OK\n", 3, 0, in wpa_supplicant_ctrl_iface_wait()
1096 if (sendto(priv->sock, "FAIL\n", 5, 0, in wpa_supplicant_ctrl_iface_wait()
1105 if (sendto(priv->sock, "FAIL\n", 5, 0, in wpa_supplicant_ctrl_iface_wait()
1149 if (wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst, &from, in wpa_supplicant_global_ctrl_iface_receive()
1155 if (wpa_supplicant_ctrl_iface_detach(&priv->ctrl_dst, &from, in wpa_supplicant_global_ctrl_iface_receive()
1182 wpas_ctrl_sock_debug("global_ctrl_sock-sendto", in wpa_supplicant_global_ctrl_iface_receive()
1199 const char *ctrl = global->params.ctrl_interface; in wpas_global_ctrl_iface_open_sock() local
1202 wpa_printf(MSG_DEBUG, "Global control interface '%s'", ctrl); in wpas_global_ctrl_iface_open_sock()
1205 if (os_strncmp(ctrl, "@android:", 9) == 0) { in wpas_global_ctrl_iface_open_sock()
1206 priv->sock = android_get_control_socket(ctrl + 9); in wpas_global_ctrl_iface_open_sock()
1207 if (priv->sock < 0) { in wpas_global_ctrl_iface_open_sock()
1209 "socket '%s'", ctrl + 9); in wpas_global_ctrl_iface_open_sock()
1213 ctrl + 9); in wpas_global_ctrl_iface_open_sock()
1214 priv->android_control_socket = 1; in wpas_global_ctrl_iface_open_sock()
1218 if (os_strncmp(ctrl, "@abstract:", 10) != 0) { in wpas_global_ctrl_iface_open_sock()
1220 * Backwards compatibility - try to open an Android control in wpas_global_ctrl_iface_open_sock()
1224 priv->sock = android_get_control_socket(ctrl); in wpas_global_ctrl_iface_open_sock()
1225 if (priv->sock >= 0) { in wpas_global_ctrl_iface_open_sock()
1228 ctrl); in wpas_global_ctrl_iface_open_sock()
1229 priv->android_control_socket = 1; in wpas_global_ctrl_iface_open_sock()
1235 priv->sock = socket(PF_UNIX, SOCK_DGRAM, 0); in wpas_global_ctrl_iface_open_sock()
1236 if (priv->sock < 0) { in wpas_global_ctrl_iface_open_sock()
1247 if (os_strncmp(ctrl, "@abstract:", 10) == 0) { in wpas_global_ctrl_iface_open_sock()
1249 os_strlcpy(addr.sun_path + 1, ctrl + 10, in wpas_global_ctrl_iface_open_sock()
1250 sizeof(addr.sun_path) - 1); in wpas_global_ctrl_iface_open_sock()
1251 if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < in wpas_global_ctrl_iface_open_sock()
1253 wpa_printf(MSG_ERROR, "supp-global-ctrl-iface-init: " in wpas_global_ctrl_iface_open_sock()
1255 ctrl, strerror(errno)); in wpas_global_ctrl_iface_open_sock()
1259 ctrl + 10); in wpas_global_ctrl_iface_open_sock()
1263 os_strlcpy(addr.sun_path, ctrl, sizeof(addr.sun_path)); in wpas_global_ctrl_iface_open_sock()
1264 if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { in wpas_global_ctrl_iface_open_sock()
1265 wpa_printf(MSG_INFO, "supp-global-ctrl-iface-init(%s) (will try fixup): bind(PF_UNIX): %s", in wpas_global_ctrl_iface_open_sock()
1266 ctrl, strerror(errno)); in wpas_global_ctrl_iface_open_sock()
1267 if (connect(priv->sock, (struct sockaddr *) &addr, in wpas_global_ctrl_iface_open_sock()
1270 " allow connections - assuming it was left" in wpas_global_ctrl_iface_open_sock()
1272 if (unlink(ctrl) < 0) { in wpas_global_ctrl_iface_open_sock()
1275 ctrl, strerror(errno)); in wpas_global_ctrl_iface_open_sock()
1278 if (bind(priv->sock, (struct sockaddr *) &addr, in wpas_global_ctrl_iface_open_sock()
1280 wpa_printf(MSG_ERROR, "supp-glb-iface-init: bind(PF_UNIX;%s): %s", in wpas_global_ctrl_iface_open_sock()
1281 ctrl, strerror(errno)); in wpas_global_ctrl_iface_open_sock()
1286 ctrl); in wpas_global_ctrl_iface_open_sock()
1289 "be in use - cannot override it"); in wpas_global_ctrl_iface_open_sock()
1292 ctrl); in wpas_global_ctrl_iface_open_sock()
1297 wpa_printf(MSG_DEBUG, "Using UNIX control socket '%s'", ctrl); in wpas_global_ctrl_iface_open_sock()
1299 if (global->params.ctrl_interface_group) { in wpas_global_ctrl_iface_open_sock()
1300 char *gid_str = global->params.ctrl_interface_group; in wpas_global_ctrl_iface_open_sock()
1307 gid = grp->gr_gid; in wpas_global_ctrl_iface_open_sock()
1312 /* Group name not found - try to parse this as gid */ in wpas_global_ctrl_iface_open_sock()
1315 wpa_printf(MSG_ERROR, "CTRL: Invalid group " in wpas_global_ctrl_iface_open_sock()
1322 if (lchown(ctrl, -1, gid) < 0) { in wpas_global_ctrl_iface_open_sock()
1325 ctrl, (int) gid, strerror(errno)); in wpas_global_ctrl_iface_open_sock()
1329 if (chmod(ctrl, S_IRWXU | S_IRWXG) < 0) { in wpas_global_ctrl_iface_open_sock()
1332 ctrl, strerror(errno)); in wpas_global_ctrl_iface_open_sock()
1336 if (chmod(ctrl, S_IRWXU) < 0) { in wpas_global_ctrl_iface_open_sock()
1339 ctrl, strerror(errno)); in wpas_global_ctrl_iface_open_sock()
1348 * Make socket non-blocking so that we don't hang forever if in wpas_global_ctrl_iface_open_sock()
1351 flags = fcntl(priv->sock, F_GETFL); in wpas_global_ctrl_iface_open_sock()
1354 if (fcntl(priv->sock, F_SETFL, flags) < 0) { in wpas_global_ctrl_iface_open_sock()
1355 wpa_printf(MSG_INFO, "fcntl(ctrl, O_NONBLOCK): %s", in wpas_global_ctrl_iface_open_sock()
1361 eloop_register_read_sock(priv->sock, in wpas_global_ctrl_iface_open_sock()
1368 if (priv->sock >= 0) { in wpas_global_ctrl_iface_open_sock()
1369 close(priv->sock); in wpas_global_ctrl_iface_open_sock()
1370 priv->sock = -1; in wpas_global_ctrl_iface_open_sock()
1372 return -1; in wpas_global_ctrl_iface_open_sock()
1384 dl_list_init(&priv->ctrl_dst); in wpa_supplicant_global_ctrl_iface_init()
1385 dl_list_init(&priv->msg_queue); in wpa_supplicant_global_ctrl_iface_init()
1386 priv->global = global; in wpa_supplicant_global_ctrl_iface_init()
1387 priv->sock = -1; in wpa_supplicant_global_ctrl_iface_init()
1389 if (global->params.ctrl_interface == NULL) in wpa_supplicant_global_ctrl_iface_init()
1408 if (priv->sock <= 0) in wpas_ctrl_iface_global_reinit()
1409 return -1; in wpas_ctrl_iface_global_reinit()
1414 * service. Such a socket is maintained as a key-value pair in in wpas_ctrl_iface_global_reinit()
1418 if (priv->android_control_socket) in wpas_ctrl_iface_global_reinit()
1419 return priv->sock; in wpas_ctrl_iface_global_reinit()
1421 eloop_unregister_read_sock(priv->sock); in wpas_ctrl_iface_global_reinit()
1422 close(priv->sock); in wpas_ctrl_iface_global_reinit()
1423 priv->sock = -1; in wpas_ctrl_iface_global_reinit()
1426 return -1; in wpas_ctrl_iface_global_reinit()
1427 return priv->sock; in wpas_ctrl_iface_global_reinit()
1437 if (priv->sock >= 0) { in wpa_supplicant_global_ctrl_iface_deinit()
1438 eloop_unregister_read_sock(priv->sock); in wpa_supplicant_global_ctrl_iface_deinit()
1439 close(priv->sock); in wpa_supplicant_global_ctrl_iface_deinit()
1441 if (priv->global->params.ctrl_interface) in wpa_supplicant_global_ctrl_iface_deinit()
1442 unlink(priv->global->params.ctrl_interface); in wpa_supplicant_global_ctrl_iface_deinit()
1443 dl_list_for_each_safe(dst, prev, &priv->ctrl_dst, struct wpa_ctrl_dst, in wpa_supplicant_global_ctrl_iface_deinit()
1445 dl_list_del(&dst->list); in wpa_supplicant_global_ctrl_iface_deinit()
1448 dl_list_for_each_safe(msg, prev_msg, &priv->msg_queue, in wpa_supplicant_global_ctrl_iface_deinit()
1450 dl_list_del(&msg->list); in wpa_supplicant_global_ctrl_iface_deinit()