Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / wpa_supplicant / ctrl_iface_unix.c
1 /*
2  * WPA Supplicant / UNIX domain socket -based control interface
3  * Copyright (c) 2004-2014, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8
9 #include "includes.h"
10 #include <sys/un.h>
11 #include <sys/stat.h>
12 #include <grp.h>
13 #include <stddef.h>
14 #include <unistd.h>
15 #include <fcntl.h>
16 #ifdef __linux__
17 #include <sys/ioctl.h>
18 #include <linux/sockios.h>
19 #endif /* __linux__ */
20 #ifdef ANDROID
21 #include <cutils/sockets.h>
22 #endif /* ANDROID */
23
24 #include "utils/common.h"
25 #include "utils/eloop.h"
26 #include "utils/list.h"
27 #include "eapol_supp/eapol_supp_sm.h"
28 #include "config.h"
29 #include "wpa_supplicant_i.h"
30 #include "ctrl_iface.h"
31
32 /* Per-interface ctrl_iface */
33
34 /**
35  * struct wpa_ctrl_dst - Internal data structure of control interface monitors
36  *
37  * This structure is used to store information about registered control
38  * interface monitors into struct wpa_supplicant. This data is private to
39  * ctrl_iface_unix.c and should not be touched directly from other files.
40  */
41 struct wpa_ctrl_dst {
42         struct dl_list list;
43         struct sockaddr_un addr;
44         socklen_t addrlen;
45         int debug_level;
46         int errors;
47 };
48
49
50 struct ctrl_iface_priv {
51         struct wpa_supplicant *wpa_s;
52         int sock;
53         struct dl_list ctrl_dst;
54         int android_control_socket;
55 };
56
57
58 struct ctrl_iface_global_priv {
59         struct wpa_global *global;
60         int sock;
61         struct dl_list ctrl_dst;
62         int android_control_socket;
63 };
64
65
66 static void wpa_supplicant_ctrl_iface_send(struct wpa_supplicant *wpa_s,
67                                            const char *ifname, int sock,
68                                            struct dl_list *ctrl_dst,
69                                            int level, const char *buf,
70                                            size_t len,
71                                            struct ctrl_iface_priv *priv,
72                                            struct ctrl_iface_global_priv *gp);
73 static int wpas_ctrl_iface_reinit(struct wpa_supplicant *wpa_s,
74                                   struct ctrl_iface_priv *priv);
75 static int wpas_ctrl_iface_global_reinit(struct wpa_global *global,
76                                          struct ctrl_iface_global_priv *priv);
77
78
79 static void wpas_ctrl_sock_debug(const char *title, int sock, const char *buf,
80                                  size_t len)
81 {
82 #ifdef __linux__
83         socklen_t optlen;
84         int sndbuf, outq;
85         int level = MSG_MSGDUMP;
86
87         if (len >= 5 && os_strncmp(buf, "PONG\n", 5) == 0)
88                 level = MSG_EXCESSIVE;
89
90         optlen = sizeof(sndbuf);
91         sndbuf = 0;
92         if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &sndbuf, &optlen) < 0)
93                 sndbuf = -1;
94
95         if (ioctl(sock, SIOCOUTQ, &outq) < 0)
96                 outq = -1;
97
98         wpa_printf(level,
99                    "CTRL-DEBUG: %s: sock=%d sndbuf=%d outq=%d send_len=%d",
100                    title, sock, sndbuf, outq, (int) len);
101 #endif /* __linux__ */
102 }
103
104
105 static int wpa_supplicant_ctrl_iface_attach(struct dl_list *ctrl_dst,
106                                             struct sockaddr_un *from,
107                                             socklen_t fromlen, int global)
108 {
109         struct wpa_ctrl_dst *dst;
110         char addr_txt[200];
111
112         dst = os_zalloc(sizeof(*dst));
113         if (dst == NULL)
114                 return -1;
115         os_memcpy(&dst->addr, from, sizeof(struct sockaddr_un));
116         dst->addrlen = fromlen;
117         dst->debug_level = MSG_INFO;
118         dl_list_add(ctrl_dst, &dst->list);
119         printf_encode(addr_txt, sizeof(addr_txt),
120                       (u8 *) from->sun_path,
121                       fromlen - offsetof(struct sockaddr_un, sun_path));
122         wpa_printf(MSG_DEBUG, "CTRL_IFACE %smonitor attached %s",
123                    global ? "global " : "", addr_txt);
124         return 0;
125 }
126
127
128 static int wpa_supplicant_ctrl_iface_detach(struct dl_list *ctrl_dst,
129                                             struct sockaddr_un *from,
130                                             socklen_t fromlen)
131 {
132         struct wpa_ctrl_dst *dst;
133
134         dl_list_for_each(dst, ctrl_dst, struct wpa_ctrl_dst, list) {
135                 if (fromlen == dst->addrlen &&
136                     os_memcmp(from->sun_path, dst->addr.sun_path,
137                               fromlen - offsetof(struct sockaddr_un, sun_path))
138                     == 0) {
139                         char addr_txt[200];
140                         printf_encode(addr_txt, sizeof(addr_txt),
141                                       (u8 *) from->sun_path,
142                                       fromlen -
143                                       offsetof(struct sockaddr_un, sun_path));
144                         wpa_printf(MSG_DEBUG, "CTRL_IFACE monitor detached %s",
145                                    addr_txt);
146                         dl_list_del(&dst->list);
147                         os_free(dst);
148                         return 0;
149                 }
150         }
151         return -1;
152 }
153
154
155 static int wpa_supplicant_ctrl_iface_level(struct ctrl_iface_priv *priv,
156                                            struct sockaddr_un *from,
157                                            socklen_t fromlen,
158                                            char *level)
159 {
160         struct wpa_ctrl_dst *dst;
161
162         wpa_printf(MSG_DEBUG, "CTRL_IFACE LEVEL %s", level);
163
164         dl_list_for_each(dst, &priv->ctrl_dst, struct wpa_ctrl_dst, list) {
165                 if (fromlen == dst->addrlen &&
166                     os_memcmp(from->sun_path, dst->addr.sun_path,
167                               fromlen - offsetof(struct sockaddr_un, sun_path))
168                     == 0) {
169                         char addr_txt[200];
170                         dst->debug_level = atoi(level);
171                         printf_encode(addr_txt, sizeof(addr_txt),
172                                       (u8 *) from->sun_path, fromlen -
173                                       offsetof(struct sockaddr_un, sun_path));
174                         wpa_printf(MSG_DEBUG, "CTRL_IFACE changed monitor level to %d for %s",
175                                    dst->debug_level, addr_txt);
176                         return 0;
177                 }
178         }
179
180         return -1;
181 }
182
183
184 static void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx,
185                                               void *sock_ctx)
186 {
187         struct wpa_supplicant *wpa_s = eloop_ctx;
188         struct ctrl_iface_priv *priv = sock_ctx;
189         char buf[4096];
190         int res;
191         struct sockaddr_un from;
192         socklen_t fromlen = sizeof(from);
193         char *reply = NULL, *reply_buf = NULL;
194         size_t reply_len = 0;
195         int new_attached = 0;
196
197         res = recvfrom(sock, buf, sizeof(buf) - 1, 0,
198                        (struct sockaddr *) &from, &fromlen);
199         if (res < 0) {
200                 wpa_printf(MSG_ERROR, "recvfrom(ctrl_iface): %s",
201                            strerror(errno));
202                 return;
203         }
204         buf[res] = '\0';
205
206         if (os_strcmp(buf, "ATTACH") == 0) {
207                 if (wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst, &from,
208                                                      fromlen, 0))
209                         reply_len = 1;
210                 else {
211                         new_attached = 1;
212                         reply_len = 2;
213                 }
214         } else if (os_strcmp(buf, "DETACH") == 0) {
215                 if (wpa_supplicant_ctrl_iface_detach(&priv->ctrl_dst, &from,
216                                                      fromlen))
217                         reply_len = 1;
218                 else
219                         reply_len = 2;
220         } else if (os_strncmp(buf, "LEVEL ", 6) == 0) {
221                 if (wpa_supplicant_ctrl_iface_level(priv, &from, fromlen,
222                                                     buf + 6))
223                         reply_len = 1;
224                 else
225                         reply_len = 2;
226         } else {
227                 reply_buf = wpa_supplicant_ctrl_iface_process(wpa_s, buf,
228                                                               &reply_len);
229                 reply = reply_buf;
230
231                 /*
232                  * There could be some password/key material in the command, so
233                  * clear the buffer explicitly now that it is not needed
234                  * anymore.
235                  */
236                 os_memset(buf, 0, res);
237         }
238
239         if (!reply && reply_len == 1) {
240                 reply = "FAIL\n";
241                 reply_len = 5;
242         } else if (!reply && reply_len == 2) {
243                 reply = "OK\n";
244                 reply_len = 3;
245         }
246
247         if (reply) {
248                 wpas_ctrl_sock_debug("ctrl_sock-sendto", sock, reply,
249                                      reply_len);
250                 if (sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from,
251                            fromlen) < 0) {
252                         int _errno = errno;
253                         wpa_dbg(wpa_s, MSG_DEBUG,
254                                 "ctrl_iface sendto failed: %d - %s",
255                                 _errno, strerror(_errno));
256                         if (_errno == ENOBUFS || _errno == EAGAIN) {
257                                 /*
258                                  * The socket send buffer could be full. This
259                                  * may happen if client programs are not
260                                  * receiving their pending messages. Close and
261                                  * reopen the socket as a workaround to avoid
262                                  * getting stuck being unable to send any new
263                                  * responses.
264                                  */
265                                 sock = wpas_ctrl_iface_reinit(wpa_s, priv);
266                                 if (sock < 0) {
267                                         wpa_dbg(wpa_s, MSG_DEBUG, "Failed to reinitialize ctrl_iface socket");
268                                 }
269                         }
270                         if (new_attached) {
271                                 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to send response to ATTACH - detaching");
272                                 new_attached = 0;
273                                 wpa_supplicant_ctrl_iface_detach(
274                                         &priv->ctrl_dst, &from, fromlen);
275                         }
276                 }
277         }
278         os_free(reply_buf);
279
280         if (new_attached)
281                 eapol_sm_notify_ctrl_attached(wpa_s->eapol);
282 }
283
284
285 static char * wpa_supplicant_ctrl_iface_path(struct wpa_supplicant *wpa_s)
286 {
287         char *buf;
288         size_t len;
289         char *pbuf, *dir = NULL;
290         int res;
291
292         if (wpa_s->conf->ctrl_interface == NULL)
293                 return NULL;
294
295         pbuf = os_strdup(wpa_s->conf->ctrl_interface);
296         if (pbuf == NULL)
297                 return NULL;
298         if (os_strncmp(pbuf, "DIR=", 4) == 0) {
299                 char *gid_str;
300                 dir = pbuf + 4;
301                 gid_str = os_strstr(dir, " GROUP=");
302                 if (gid_str)
303                         *gid_str = '\0';
304         } else
305                 dir = pbuf;
306
307         len = os_strlen(dir) + os_strlen(wpa_s->ifname) + 2;
308         buf = os_malloc(len);
309         if (buf == NULL) {
310                 os_free(pbuf);
311                 return NULL;
312         }
313
314         res = os_snprintf(buf, len, "%s/%s", dir, wpa_s->ifname);
315         if (os_snprintf_error(len, res)) {
316                 os_free(pbuf);
317                 os_free(buf);
318                 return NULL;
319         }
320 #ifdef __CYGWIN__
321         {
322                 /* Windows/WinPcap uses interface names that are not suitable
323                  * as a file name - convert invalid chars to underscores */
324                 char *pos = buf;
325                 while (*pos) {
326                         if (*pos == '\\')
327                                 *pos = '_';
328                         pos++;
329                 }
330         }
331 #endif /* __CYGWIN__ */
332         os_free(pbuf);
333         return buf;
334 }
335
336
337 static void wpa_supplicant_ctrl_iface_msg_cb(void *ctx, int level,
338                                              enum wpa_msg_type type,
339                                              const char *txt, size_t len)
340 {
341         struct wpa_supplicant *wpa_s = ctx;
342
343         if (wpa_s == NULL)
344                 return;
345
346         if (type != WPA_MSG_NO_GLOBAL && wpa_s->global->ctrl_iface) {
347                 struct ctrl_iface_global_priv *priv = wpa_s->global->ctrl_iface;
348                 if (!dl_list_empty(&priv->ctrl_dst)) {
349                         wpa_supplicant_ctrl_iface_send(
350                                 wpa_s,
351                                 type != WPA_MSG_PER_INTERFACE ?
352                                 NULL : wpa_s->ifname,
353                                 priv->sock, &priv->ctrl_dst, level, txt, len,
354                                 NULL, priv);
355                 }
356         }
357
358         if (type == WPA_MSG_ONLY_GLOBAL || wpa_s->ctrl_iface == NULL)
359                 return;
360         wpa_supplicant_ctrl_iface_send(wpa_s, NULL, wpa_s->ctrl_iface->sock,
361                                        &wpa_s->ctrl_iface->ctrl_dst,
362                                        level, txt, len, wpa_s->ctrl_iface,
363                                        NULL);
364 }
365
366
367 static int wpas_ctrl_iface_open_sock(struct wpa_supplicant *wpa_s,
368                                      struct ctrl_iface_priv *priv)
369 {
370         struct sockaddr_un addr;
371         char *fname = NULL;
372         gid_t gid = 0;
373         int gid_set = 0;
374         char *buf, *dir = NULL, *gid_str = NULL;
375         struct group *grp;
376         char *endp;
377         int flags;
378
379         buf = os_strdup(wpa_s->conf->ctrl_interface);
380         if (buf == NULL)
381                 goto fail;
382 #ifdef ANDROID
383         os_snprintf(addr.sun_path, sizeof(addr.sun_path), "wpa_%s",
384                     wpa_s->conf->ctrl_interface);
385         priv->sock = android_get_control_socket(addr.sun_path);
386         if (priv->sock >= 0) {
387                 priv->android_control_socket = 1;
388                 goto havesock;
389         }
390 #endif /* ANDROID */
391         if (os_strncmp(buf, "DIR=", 4) == 0) {
392                 dir = buf + 4;
393                 gid_str = os_strstr(dir, " GROUP=");
394                 if (gid_str) {
395                         *gid_str = '\0';
396                         gid_str += 7;
397                 }
398         } else {
399                 dir = buf;
400                 gid_str = wpa_s->conf->ctrl_interface_group;
401         }
402
403         if (mkdir(dir, S_IRWXU | S_IRWXG) < 0) {
404                 if (errno == EEXIST) {
405                         wpa_printf(MSG_DEBUG, "Using existing control "
406                                    "interface directory.");
407                 } else {
408                         wpa_printf(MSG_ERROR, "mkdir[ctrl_interface=%s]: %s",
409                                    dir, strerror(errno));
410                         goto fail;
411                 }
412         }
413
414 #ifdef ANDROID
415         /*
416          * wpa_supplicant is started from /init.*.rc on Android and that seems
417          * to be using umask 0077 which would leave the control interface
418          * directory without group access. This breaks things since Wi-Fi
419          * framework assumes that this directory can be accessed by other
420          * applications in the wifi group. Fix this by adding group access even
421          * if umask value would prevent this.
422          */
423         if (chmod(dir, S_IRWXU | S_IRWXG) < 0) {
424                 wpa_printf(MSG_ERROR, "CTRL: Could not chmod directory: %s",
425                            strerror(errno));
426                 /* Try to continue anyway */
427         }
428 #endif /* ANDROID */
429
430         if (gid_str) {
431                 grp = getgrnam(gid_str);
432                 if (grp) {
433                         gid = grp->gr_gid;
434                         gid_set = 1;
435                         wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d"
436                                    " (from group name '%s')",
437                                    (int) gid, gid_str);
438                 } else {
439                         /* Group name not found - try to parse this as gid */
440                         gid = strtol(gid_str, &endp, 10);
441                         if (*gid_str == '\0' || *endp != '\0') {
442                                 wpa_printf(MSG_ERROR, "CTRL: Invalid group "
443                                            "'%s'", gid_str);
444                                 goto fail;
445                         }
446                         gid_set = 1;
447                         wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d",
448                                    (int) gid);
449                 }
450         }
451
452         if (gid_set && chown(dir, -1, gid) < 0) {
453                 wpa_printf(MSG_ERROR, "chown[ctrl_interface=%s,gid=%d]: %s",
454                            dir, (int) gid, strerror(errno));
455                 goto fail;
456         }
457
458         /* Make sure the group can enter and read the directory */
459         if (gid_set &&
460             chmod(dir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP) < 0) {
461                 wpa_printf(MSG_ERROR, "CTRL: chmod[ctrl_interface]: %s",
462                            strerror(errno));
463                 goto fail;
464         }
465
466         if (os_strlen(dir) + 1 + os_strlen(wpa_s->ifname) >=
467             sizeof(addr.sun_path)) {
468                 wpa_printf(MSG_ERROR, "ctrl_iface path limit exceeded");
469                 goto fail;
470         }
471
472         priv->sock = socket(PF_UNIX, SOCK_DGRAM, 0);
473         if (priv->sock < 0) {
474                 wpa_printf(MSG_ERROR, "socket(PF_UNIX): %s", strerror(errno));
475                 goto fail;
476         }
477
478         os_memset(&addr, 0, sizeof(addr));
479 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
480         addr.sun_len = sizeof(addr);
481 #endif /* __FreeBSD__ */
482         addr.sun_family = AF_UNIX;
483         fname = wpa_supplicant_ctrl_iface_path(wpa_s);
484         if (fname == NULL)
485                 goto fail;
486         os_strlcpy(addr.sun_path, fname, sizeof(addr.sun_path));
487         if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
488                 wpa_printf(MSG_DEBUG, "ctrl_iface bind(PF_UNIX) failed: %s",
489                            strerror(errno));
490                 if (connect(priv->sock, (struct sockaddr *) &addr,
491                             sizeof(addr)) < 0) {
492                         wpa_printf(MSG_DEBUG, "ctrl_iface exists, but does not"
493                                    " allow connections - assuming it was left"
494                                    "over from forced program termination");
495                         if (unlink(fname) < 0) {
496                                 wpa_printf(MSG_ERROR,
497                                            "Could not unlink existing ctrl_iface socket '%s': %s",
498                                            fname, strerror(errno));
499                                 goto fail;
500                         }
501                         if (bind(priv->sock, (struct sockaddr *) &addr,
502                                  sizeof(addr)) < 0) {
503                                 wpa_printf(MSG_ERROR, "supp-ctrl-iface-init: bind(PF_UNIX): %s",
504                                            strerror(errno));
505                                 goto fail;
506                         }
507                         wpa_printf(MSG_DEBUG, "Successfully replaced leftover "
508                                    "ctrl_iface socket '%s'", fname);
509                 } else {
510                         wpa_printf(MSG_INFO, "ctrl_iface exists and seems to "
511                                    "be in use - cannot override it");
512                         wpa_printf(MSG_INFO, "Delete '%s' manually if it is "
513                                    "not used anymore", fname);
514                         os_free(fname);
515                         fname = NULL;
516                         goto fail;
517                 }
518         }
519
520         if (gid_set && chown(fname, -1, gid) < 0) {
521                 wpa_printf(MSG_ERROR, "chown[ctrl_interface=%s,gid=%d]: %s",
522                            fname, (int) gid, strerror(errno));
523                 goto fail;
524         }
525
526         if (chmod(fname, S_IRWXU | S_IRWXG) < 0) {
527                 wpa_printf(MSG_ERROR, "chmod[ctrl_interface=%s]: %s",
528                            fname, strerror(errno));
529                 goto fail;
530         }
531         os_free(fname);
532
533 #ifdef ANDROID
534 havesock:
535 #endif /* ANDROID */
536
537         /*
538          * Make socket non-blocking so that we don't hang forever if
539          * target dies unexpectedly.
540          */
541         flags = fcntl(priv->sock, F_GETFL);
542         if (flags >= 0) {
543                 flags |= O_NONBLOCK;
544                 if (fcntl(priv->sock, F_SETFL, flags) < 0) {
545                         wpa_printf(MSG_INFO, "fcntl(ctrl, O_NONBLOCK): %s",
546                                    strerror(errno));
547                         /* Not fatal, continue on.*/
548                 }
549         }
550
551         eloop_register_read_sock(priv->sock, wpa_supplicant_ctrl_iface_receive,
552                                  wpa_s, priv);
553         wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb);
554
555         os_free(buf);
556         return 0;
557
558 fail:
559         if (priv->sock >= 0) {
560                 close(priv->sock);
561                 priv->sock = -1;
562         }
563         if (fname) {
564                 unlink(fname);
565                 os_free(fname);
566         }
567         os_free(buf);
568         return -1;
569 }
570
571
572 struct ctrl_iface_priv *
573 wpa_supplicant_ctrl_iface_init(struct wpa_supplicant *wpa_s)
574 {
575         struct ctrl_iface_priv *priv;
576
577         priv = os_zalloc(sizeof(*priv));
578         if (priv == NULL)
579                 return NULL;
580         dl_list_init(&priv->ctrl_dst);
581         priv->wpa_s = wpa_s;
582         priv->sock = -1;
583
584         if (wpa_s->conf->ctrl_interface == NULL)
585                 return priv;
586
587 #ifdef ANDROID
588         if (wpa_s->global->params.ctrl_interface) {
589                 int same = 0;
590
591                 if (wpa_s->global->params.ctrl_interface[0] == '/') {
592                         if (os_strcmp(wpa_s->global->params.ctrl_interface,
593                                       wpa_s->conf->ctrl_interface) == 0)
594                                 same = 1;
595                 } else if (os_strncmp(wpa_s->global->params.ctrl_interface,
596                                       "@android:", 9) == 0 ||
597                            os_strncmp(wpa_s->global->params.ctrl_interface,
598                                       "@abstract:", 10) == 0) {
599                         char *pos;
600
601                         /*
602                          * Currently, Android uses @android:wpa_* as the naming
603                          * convention for the global ctrl interface. This logic
604                          * needs to be revisited if the above naming convention
605                          * is modified.
606                          */
607                         pos = os_strchr(wpa_s->global->params.ctrl_interface,
608                                         '_');
609                         if (pos &&
610                             os_strcmp(pos + 1,
611                                       wpa_s->conf->ctrl_interface) == 0)
612                                 same = 1;
613                 }
614
615                 if (same) {
616                         /*
617                          * The invalid configuration combination might be
618                          * possible to hit in an Android OTA upgrade case, so
619                          * instead of refusing to start the wpa_supplicant
620                          * process, do not open the per-interface ctrl_iface
621                          * and continue with the global control interface that
622                          * was set from the command line since the Wi-Fi
623                          * framework will use it for operations.
624                          */
625                         wpa_printf(MSG_ERROR,
626                                    "global ctrl interface %s matches ctrl interface %s - do not open per-interface ctrl interface",
627                                    wpa_s->global->params.ctrl_interface,
628                                    wpa_s->conf->ctrl_interface);
629                         return priv;
630                 }
631         }
632 #endif /* ANDROID */
633
634         if (wpas_ctrl_iface_open_sock(wpa_s, priv) < 0) {
635                 os_free(priv);
636                 return NULL;
637         }
638
639         return priv;
640 }
641
642
643 static int wpas_ctrl_iface_reinit(struct wpa_supplicant *wpa_s,
644                                   struct ctrl_iface_priv *priv)
645 {
646         int res;
647
648         if (priv->sock <= 0)
649                 return -1;
650
651         /*
652          * On Android, the control socket being used may be the socket
653          * that is created when wpa_supplicant is started as a /init.*.rc
654          * service. Such a socket is maintained as a key-value pair in
655          * Android's environment. Closing this control socket would leave us
656          * in a bad state with an invalid socket descriptor.
657          */
658         if (priv->android_control_socket)
659                 return priv->sock;
660
661         eloop_unregister_read_sock(priv->sock);
662         close(priv->sock);
663         priv->sock = -1;
664         res = wpas_ctrl_iface_open_sock(wpa_s, priv);
665         if (res < 0)
666                 return -1;
667         return priv->sock;
668 }
669
670
671 void wpa_supplicant_ctrl_iface_deinit(struct ctrl_iface_priv *priv)
672 {
673         struct wpa_ctrl_dst *dst, *prev;
674
675         if (priv->sock > -1) {
676                 char *fname;
677                 char *buf, *dir = NULL;
678                 eloop_unregister_read_sock(priv->sock);
679                 if (!dl_list_empty(&priv->ctrl_dst)) {
680                         /*
681                          * Wait before closing the control socket if
682                          * there are any attached monitors in order to allow
683                          * them to receive any pending messages.
684                          */
685                         wpa_printf(MSG_DEBUG, "CTRL_IFACE wait for attached "
686                                    "monitors to receive messages");
687                         os_sleep(0, 100000);
688                 }
689                 close(priv->sock);
690                 priv->sock = -1;
691                 fname = wpa_supplicant_ctrl_iface_path(priv->wpa_s);
692                 if (fname) {
693                         unlink(fname);
694                         os_free(fname);
695                 }
696
697                 if (priv->wpa_s->conf->ctrl_interface == NULL)
698                         goto free_dst;
699                 buf = os_strdup(priv->wpa_s->conf->ctrl_interface);
700                 if (buf == NULL)
701                         goto free_dst;
702                 if (os_strncmp(buf, "DIR=", 4) == 0) {
703                         char *gid_str;
704                         dir = buf + 4;
705                         gid_str = os_strstr(dir, " GROUP=");
706                         if (gid_str)
707                                 *gid_str = '\0';
708                 } else
709                         dir = buf;
710
711                 if (rmdir(dir) < 0) {
712                         if (errno == ENOTEMPTY) {
713                                 wpa_printf(MSG_DEBUG, "Control interface "
714                                            "directory not empty - leaving it "
715                                            "behind");
716                         } else {
717                                 wpa_printf(MSG_ERROR,
718                                            "rmdir[ctrl_interface=%s]: %s",
719                                            dir, strerror(errno));
720                         }
721                 }
722                 os_free(buf);
723         }
724
725 free_dst:
726         dl_list_for_each_safe(dst, prev, &priv->ctrl_dst, struct wpa_ctrl_dst,
727                               list)
728                 os_free(dst);
729         os_free(priv);
730 }
731
732
733 /**
734  * wpa_supplicant_ctrl_iface_send - Send a control interface packet to monitors
735  * @ifname: Interface name for global control socket or %NULL
736  * @sock: Local socket fd
737  * @ctrl_dst: List of attached listeners
738  * @level: Priority level of the message
739  * @buf: Message data
740  * @len: Message length
741  *
742  * Send a packet to all monitor programs attached to the control interface.
743  */
744 static void wpa_supplicant_ctrl_iface_send(struct wpa_supplicant *wpa_s,
745                                            const char *ifname, int sock,
746                                            struct dl_list *ctrl_dst,
747                                            int level, const char *buf,
748                                            size_t len,
749                                            struct ctrl_iface_priv *priv,
750                                            struct ctrl_iface_global_priv *gp)
751 {
752         struct wpa_ctrl_dst *dst, *next;
753         char levelstr[10];
754         int idx, res;
755         struct msghdr msg;
756         struct iovec io[5];
757
758         if (sock < 0 || dl_list_empty(ctrl_dst))
759                 return;
760
761         res = os_snprintf(levelstr, sizeof(levelstr), "<%d>", level);
762         if (os_snprintf_error(sizeof(levelstr), res))
763                 return;
764         idx = 0;
765         if (ifname) {
766                 io[idx].iov_base = "IFNAME=";
767                 io[idx].iov_len = 7;
768                 idx++;
769                 io[idx].iov_base = (char *) ifname;
770                 io[idx].iov_len = os_strlen(ifname);
771                 idx++;
772                 io[idx].iov_base = " ";
773                 io[idx].iov_len = 1;
774                 idx++;
775         }
776         io[idx].iov_base = levelstr;
777         io[idx].iov_len = os_strlen(levelstr);
778         idx++;
779         io[idx].iov_base = (char *) buf;
780         io[idx].iov_len = len;
781         idx++;
782         os_memset(&msg, 0, sizeof(msg));
783         msg.msg_iov = io;
784         msg.msg_iovlen = idx;
785
786         dl_list_for_each_safe(dst, next, ctrl_dst, struct wpa_ctrl_dst, list) {
787                 int _errno;
788                 char addr_txt[200];
789
790                 if (level < dst->debug_level)
791                         continue;
792
793                 printf_encode(addr_txt, sizeof(addr_txt),
794                               (u8 *) dst->addr.sun_path, dst->addrlen -
795                               offsetof(struct sockaddr_un, sun_path));
796                 msg.msg_name = (void *) &dst->addr;
797                 msg.msg_namelen = dst->addrlen;
798                 wpas_ctrl_sock_debug("ctrl_sock-sendmsg", sock, buf, len);
799                 if (sendmsg(sock, &msg, MSG_DONTWAIT) >= 0) {
800                         wpa_printf(MSG_MSGDUMP,
801                                    "CTRL_IFACE monitor sent successfully to %s",
802                                    addr_txt);
803                         dst->errors = 0;
804                         continue;
805                 }
806
807                 _errno = errno;
808                 wpa_printf(MSG_DEBUG, "CTRL_IFACE monitor[%s]: %d - %s",
809                            addr_txt, errno, strerror(errno));
810                 dst->errors++;
811
812                 if (dst->errors > 10 || _errno == ENOENT || _errno == EPERM) {
813                         wpa_printf(MSG_INFO, "CTRL_IFACE: Detach monitor %s that cannot receive messages",
814                                 addr_txt);
815                         wpa_supplicant_ctrl_iface_detach(ctrl_dst, &dst->addr,
816                                                          dst->addrlen);
817                 }
818
819                 if (_errno == ENOBUFS || _errno == EAGAIN) {
820                         /*
821                          * The socket send buffer could be full. This may happen
822                          * if client programs are not receiving their pending
823                          * messages. Close and reopen the socket as a workaround
824                          * to avoid getting stuck being unable to send any new
825                          * responses.
826                          */
827                         if (priv)
828                                 sock = wpas_ctrl_iface_reinit(wpa_s, priv);
829                         else if (gp)
830                                 sock = wpas_ctrl_iface_global_reinit(
831                                         wpa_s->global, gp);
832                         else
833                                 break;
834                         if (sock < 0) {
835                                 wpa_dbg(wpa_s, MSG_DEBUG,
836                                         "Failed to reinitialize ctrl_iface socket");
837                                 break;
838                         }
839                 }
840         }
841 }
842
843
844 void wpa_supplicant_ctrl_iface_wait(struct ctrl_iface_priv *priv)
845 {
846         char buf[256];
847         int res;
848         struct sockaddr_un from;
849         socklen_t fromlen = sizeof(from);
850
851         for (;;) {
852                 wpa_printf(MSG_DEBUG, "CTRL_IFACE - %s - wait for monitor to "
853                            "attach", priv->wpa_s->ifname);
854                 eloop_wait_for_read_sock(priv->sock);
855
856                 res = recvfrom(priv->sock, buf, sizeof(buf) - 1, 0,
857                                (struct sockaddr *) &from, &fromlen);
858                 if (res < 0) {
859                         wpa_printf(MSG_ERROR, "recvfrom(ctrl_iface): %s",
860                                    strerror(errno));
861                         continue;
862                 }
863                 buf[res] = '\0';
864
865                 if (os_strcmp(buf, "ATTACH") == 0) {
866                         /* handle ATTACH signal of first monitor interface */
867                         if (!wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst,
868                                                               &from, fromlen,
869                                                               0)) {
870                                 if (sendto(priv->sock, "OK\n", 3, 0,
871                                            (struct sockaddr *) &from, fromlen) <
872                                     0) {
873                                         wpa_printf(MSG_DEBUG, "ctrl_iface sendto failed: %s",
874                                                    strerror(errno));
875                                 }
876                                 /* OK to continue */
877                                 return;
878                         } else {
879                                 if (sendto(priv->sock, "FAIL\n", 5, 0,
880                                            (struct sockaddr *) &from, fromlen) <
881                                     0) {
882                                         wpa_printf(MSG_DEBUG, "ctrl_iface sendto failed: %s",
883                                                    strerror(errno));
884                                 }
885                         }
886                 } else {
887                         /* return FAIL for all other signals */
888                         if (sendto(priv->sock, "FAIL\n", 5, 0,
889                                    (struct sockaddr *) &from, fromlen) < 0) {
890                                 wpa_printf(MSG_DEBUG,
891                                            "ctrl_iface sendto failed: %s",
892                                            strerror(errno));
893                         }
894                 }
895         }
896 }
897
898
899 /* Global ctrl_iface */
900
901 static void wpa_supplicant_global_ctrl_iface_receive(int sock, void *eloop_ctx,
902                                                      void *sock_ctx)
903 {
904         struct wpa_global *global = eloop_ctx;
905         struct ctrl_iface_global_priv *priv = sock_ctx;
906         char buf[4096];
907         int res;
908         struct sockaddr_un from;
909         socklen_t fromlen = sizeof(from);
910         char *reply = NULL, *reply_buf = NULL;
911         size_t reply_len;
912
913         res = recvfrom(sock, buf, sizeof(buf) - 1, 0,
914                        (struct sockaddr *) &from, &fromlen);
915         if (res < 0) {
916                 wpa_printf(MSG_ERROR, "recvfrom(ctrl_iface): %s",
917                            strerror(errno));
918                 return;
919         }
920         buf[res] = '\0';
921
922         if (os_strcmp(buf, "ATTACH") == 0) {
923                 if (wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst, &from,
924                                                      fromlen, 1))
925                         reply_len = 1;
926                 else
927                         reply_len = 2;
928         } else if (os_strcmp(buf, "DETACH") == 0) {
929                 if (wpa_supplicant_ctrl_iface_detach(&priv->ctrl_dst, &from,
930                                                      fromlen))
931                         reply_len = 1;
932                 else
933                         reply_len = 2;
934         } else {
935                 reply_buf = wpa_supplicant_global_ctrl_iface_process(
936                         global, buf, &reply_len);
937                 reply = reply_buf;
938
939                 /*
940                  * There could be some password/key material in the command, so
941                  * clear the buffer explicitly now that it is not needed
942                  * anymore.
943                  */
944                 os_memset(buf, 0, res);
945         }
946
947         if (!reply && reply_len == 1) {
948                 reply = "FAIL\n";
949                 reply_len = 5;
950         } else if (!reply && reply_len == 2) {
951                 reply = "OK\n";
952                 reply_len = 3;
953         }
954
955         if (reply) {
956                 wpas_ctrl_sock_debug("global_ctrl_sock-sendto",
957                                      sock, reply, reply_len);
958                 if (sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from,
959                            fromlen) < 0) {
960                         wpa_printf(MSG_DEBUG, "ctrl_iface sendto failed: %s",
961                                 strerror(errno));
962                 }
963         }
964         os_free(reply_buf);
965 }
966
967
968 static int wpas_global_ctrl_iface_open_sock(struct wpa_global *global,
969                                             struct ctrl_iface_global_priv *priv)
970 {
971         struct sockaddr_un addr;
972         const char *ctrl = global->params.ctrl_interface;
973         int flags;
974
975         wpa_printf(MSG_DEBUG, "Global control interface '%s'", ctrl);
976
977 #ifdef ANDROID
978         if (os_strncmp(ctrl, "@android:", 9) == 0) {
979                 priv->sock = android_get_control_socket(ctrl + 9);
980                 if (priv->sock < 0) {
981                         wpa_printf(MSG_ERROR, "Failed to open Android control "
982                                    "socket '%s'", ctrl + 9);
983                         goto fail;
984                 }
985                 wpa_printf(MSG_DEBUG, "Using Android control socket '%s'",
986                            ctrl + 9);
987                 priv->android_control_socket = 1;
988                 goto havesock;
989         }
990
991         if (os_strncmp(ctrl, "@abstract:", 10) != 0) {
992                 /*
993                  * Backwards compatibility - try to open an Android control
994                  * socket and if that fails, assume this was a UNIX domain
995                  * socket instead.
996                  */
997                 priv->sock = android_get_control_socket(ctrl);
998                 if (priv->sock >= 0) {
999                         wpa_printf(MSG_DEBUG,
1000                                    "Using Android control socket '%s'",
1001                                    ctrl);
1002                         priv->android_control_socket = 1;
1003                         goto havesock;
1004                 }
1005         }
1006 #endif /* ANDROID */
1007
1008         priv->sock = socket(PF_UNIX, SOCK_DGRAM, 0);
1009         if (priv->sock < 0) {
1010                 wpa_printf(MSG_ERROR, "socket(PF_UNIX): %s", strerror(errno));
1011                 goto fail;
1012         }
1013
1014         os_memset(&addr, 0, sizeof(addr));
1015 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
1016         addr.sun_len = sizeof(addr);
1017 #endif /* __FreeBSD__ */
1018         addr.sun_family = AF_UNIX;
1019
1020         if (os_strncmp(ctrl, "@abstract:", 10) == 0) {
1021                 addr.sun_path[0] = '\0';
1022                 os_strlcpy(addr.sun_path + 1, ctrl + 10,
1023                            sizeof(addr.sun_path) - 1);
1024                 if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) <
1025                     0) {
1026                         wpa_printf(MSG_ERROR, "supp-global-ctrl-iface-init: "
1027                                    "bind(PF_UNIX;%s) failed: %s",
1028                                    ctrl, strerror(errno));
1029                         goto fail;
1030                 }
1031                 wpa_printf(MSG_DEBUG, "Using Abstract control socket '%s'",
1032                            ctrl + 10);
1033                 goto havesock;
1034         }
1035
1036         os_strlcpy(addr.sun_path, ctrl, sizeof(addr.sun_path));
1037         if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1038                 wpa_printf(MSG_INFO, "supp-global-ctrl-iface-init(%s) (will try fixup): bind(PF_UNIX): %s",
1039                            ctrl, strerror(errno));
1040                 if (connect(priv->sock, (struct sockaddr *) &addr,
1041                             sizeof(addr)) < 0) {
1042                         wpa_printf(MSG_DEBUG, "ctrl_iface exists, but does not"
1043                                    " allow connections - assuming it was left"
1044                                    "over from forced program termination");
1045                         if (unlink(ctrl) < 0) {
1046                                 wpa_printf(MSG_ERROR,
1047                                            "Could not unlink existing ctrl_iface socket '%s': %s",
1048                                            ctrl, strerror(errno));
1049                                 goto fail;
1050                         }
1051                         if (bind(priv->sock, (struct sockaddr *) &addr,
1052                                  sizeof(addr)) < 0) {
1053                                 wpa_printf(MSG_ERROR, "supp-glb-iface-init: bind(PF_UNIX;%s): %s",
1054                                            ctrl, strerror(errno));
1055                                 goto fail;
1056                         }
1057                         wpa_printf(MSG_DEBUG, "Successfully replaced leftover "
1058                                    "ctrl_iface socket '%s'",
1059                                    ctrl);
1060                 } else {
1061                         wpa_printf(MSG_INFO, "ctrl_iface exists and seems to "
1062                                    "be in use - cannot override it");
1063                         wpa_printf(MSG_INFO, "Delete '%s' manually if it is "
1064                                    "not used anymore",
1065                                    ctrl);
1066                         goto fail;
1067                 }
1068         }
1069
1070         wpa_printf(MSG_DEBUG, "Using UNIX control socket '%s'", ctrl);
1071
1072         if (global->params.ctrl_interface_group) {
1073                 char *gid_str = global->params.ctrl_interface_group;
1074                 gid_t gid = 0;
1075                 struct group *grp;
1076                 char *endp;
1077
1078                 grp = getgrnam(gid_str);
1079                 if (grp) {
1080                         gid = grp->gr_gid;
1081                         wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d"
1082                                    " (from group name '%s')",
1083                                    (int) gid, gid_str);
1084                 } else {
1085                         /* Group name not found - try to parse this as gid */
1086                         gid = strtol(gid_str, &endp, 10);
1087                         if (*gid_str == '\0' || *endp != '\0') {
1088                                 wpa_printf(MSG_ERROR, "CTRL: Invalid group "
1089                                            "'%s'", gid_str);
1090                                 goto fail;
1091                         }
1092                         wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d",
1093                                    (int) gid);
1094                 }
1095                 if (chown(ctrl, -1, gid) < 0) {
1096                         wpa_printf(MSG_ERROR,
1097                                    "chown[global_ctrl_interface=%s,gid=%d]: %s",
1098                                    ctrl, (int) gid, strerror(errno));
1099                         goto fail;
1100                 }
1101
1102                 if (chmod(ctrl, S_IRWXU | S_IRWXG) < 0) {
1103                         wpa_printf(MSG_ERROR,
1104                                    "chmod[global_ctrl_interface=%s]: %s",
1105                                    ctrl, strerror(errno));
1106                         goto fail;
1107                 }
1108         } else {
1109                 if (chmod(ctrl, S_IRWXU) < 0) {
1110                         wpa_printf(MSG_DEBUG,
1111                                    "chmod[global_ctrl_interface=%s](S_IRWXU): %s",
1112                                    ctrl, strerror(errno));
1113                         /* continue anyway since group change was not required
1114                          */
1115                 }
1116         }
1117
1118 havesock:
1119
1120         /*
1121          * Make socket non-blocking so that we don't hang forever if
1122          * target dies unexpectedly.
1123          */
1124         flags = fcntl(priv->sock, F_GETFL);
1125         if (flags >= 0) {
1126                 flags |= O_NONBLOCK;
1127                 if (fcntl(priv->sock, F_SETFL, flags) < 0) {
1128                         wpa_printf(MSG_INFO, "fcntl(ctrl, O_NONBLOCK): %s",
1129                                    strerror(errno));
1130                         /* Not fatal, continue on.*/
1131                 }
1132         }
1133
1134         eloop_register_read_sock(priv->sock,
1135                                  wpa_supplicant_global_ctrl_iface_receive,
1136                                  global, priv);
1137
1138         return 0;
1139
1140 fail:
1141         if (priv->sock >= 0) {
1142                 close(priv->sock);
1143                 priv->sock = -1;
1144         }
1145         return -1;
1146 }
1147
1148
1149 struct ctrl_iface_global_priv *
1150 wpa_supplicant_global_ctrl_iface_init(struct wpa_global *global)
1151 {
1152         struct ctrl_iface_global_priv *priv;
1153
1154         priv = os_zalloc(sizeof(*priv));
1155         if (priv == NULL)
1156                 return NULL;
1157         dl_list_init(&priv->ctrl_dst);
1158         priv->global = global;
1159         priv->sock = -1;
1160
1161         if (global->params.ctrl_interface == NULL)
1162                 return priv;
1163
1164         if (wpas_global_ctrl_iface_open_sock(global, priv) < 0) {
1165                 os_free(priv);
1166                 return NULL;
1167         }
1168
1169         wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb);
1170
1171         return priv;
1172 }
1173
1174
1175 static int wpas_ctrl_iface_global_reinit(struct wpa_global *global,
1176                                          struct ctrl_iface_global_priv *priv)
1177 {
1178         int res;
1179
1180         if (priv->sock <= 0)
1181                 return -1;
1182
1183         /*
1184          * On Android, the control socket being used may be the socket
1185          * that is created when wpa_supplicant is started as a /init.*.rc
1186          * service. Such a socket is maintained as a key-value pair in
1187          * Android's environment. Closing this control socket would leave us
1188          * in a bad state with an invalid socket descriptor.
1189          */
1190         if (priv->android_control_socket)
1191                 return priv->sock;
1192
1193         eloop_unregister_read_sock(priv->sock);
1194         close(priv->sock);
1195         priv->sock = -1;
1196         res = wpas_global_ctrl_iface_open_sock(global, priv);
1197         if (res < 0)
1198                 return -1;
1199         return priv->sock;
1200 }
1201
1202
1203 void
1204 wpa_supplicant_global_ctrl_iface_deinit(struct ctrl_iface_global_priv *priv)
1205 {
1206         struct wpa_ctrl_dst *dst, *prev;
1207
1208         if (priv->sock >= 0) {
1209                 eloop_unregister_read_sock(priv->sock);
1210                 close(priv->sock);
1211         }
1212         if (priv->global->params.ctrl_interface)
1213                 unlink(priv->global->params.ctrl_interface);
1214         dl_list_for_each_safe(dst, prev, &priv->ctrl_dst, struct wpa_ctrl_dst,
1215                               list)
1216                 os_free(dst);
1217         os_free(priv);
1218 }