wireless: add support for defining wifi interfaces via procd service data
[project/netifd.git] / system-linux.c
index 0092fec02133d5fbde352393b8583ffd3a73f689..4463a2a8282a1151cb99734d65dd57689a7fad52 100644 (file)
@@ -169,19 +169,14 @@ static void
 handler_nl_event(struct uloop_fd *u, unsigned int events)
 {
        struct event_socket *ev = container_of(u, struct event_socket, uloop);
-       int err;
-       socklen_t errlen = sizeof(err);
+       int ret;
 
-       if (!u->error) {
-               nl_recvmsgs_default(ev->sock);
+       ret = nl_recvmsgs_default(ev->sock);
+       if (ret >= 0)
                return;
-       }
-
-       if (getsockopt(u->fd, SOL_SOCKET, SO_ERROR, (void *)&err, &errlen))
-               goto abort;
 
-       switch(err) {
-       case ENOBUFS:
+       switch (-ret) {
+       case NLE_NOMEM:
                /* Increase rx buffer size on netlink socket */
                ev->bufsize *= 2;
                if (nl_socket_set_buffer_size(ev->sock, ev->bufsize, 0))
@@ -195,7 +190,6 @@ handler_nl_event(struct uloop_fd *u, unsigned int events)
        default:
                goto abort;
        }
-       u->error = false;
        return;
 
 abort:
@@ -797,24 +791,19 @@ handle_hotplug_event(struct uloop_fd *u, unsigned int events)
        struct sockaddr_nl nla;
        unsigned char *buf = NULL;
        int size;
-       int err;
-       socklen_t errlen = sizeof(err);
 
-       if (!u->error) {
-               while ((size = nl_recv(ev->sock, &nla, &buf, NULL)) > 0) {
-                       if (nla.nl_pid == 0)
-                               handle_hotplug_msg((char *) buf, size);
+       while ((size = nl_recv(ev->sock, &nla, &buf, NULL)) > 0) {
+               if (nla.nl_pid == 0)
+                       handle_hotplug_msg((char *) buf, size);
 
-                       free(buf);
-               }
-               return;
+               free(buf);
        }
 
-       if (getsockopt(u->fd, SOL_SOCKET, SO_ERROR, (void *)&err, &errlen))
-               goto abort;
+       switch (-size) {
+       case 0:
+               return;
 
-       switch(err) {
-       case ENOBUFS:
+       case NLE_NOMEM:
                /* Increase rx buffer size on netlink socket */
                ev->bufsize *= 2;
                if (nl_socket_set_buffer_size(ev->sock, ev->bufsize, 0))
@@ -824,7 +813,6 @@ handle_hotplug_event(struct uloop_fd *u, unsigned int events)
        default:
                goto abort;
        }
-       u->error = false;
        return;
 
 abort:
@@ -1730,7 +1718,7 @@ int system_vlandev_del(struct device *vlandev)
 struct if_get_master_data {
        int ifindex;
        int master_ifindex;
-       bool pending;
+       int pending;
 };
 
 static void if_get_master_dsa_linkinfo_attr(struct if_get_master_data *data,
@@ -1744,7 +1732,6 @@ static void if_get_master_dsa_linkinfo_attr(struct if_get_master_data *data,
                        continue;
 
                data->master_ifindex = *(__u32 *)RTA_DATA(cur);
-               return;
        }
 }
 
@@ -1759,7 +1746,7 @@ static void if_get_master_linkinfo_attr(struct if_get_master_data *data,
                        continue;
 
                if (cur->rta_type == IFLA_INFO_KIND && strcmp("dsa", (char *)RTA_DATA(cur)))
-                       return;
+                       break;
 
                if (cur->rta_type == IFLA_INFO_DATA)
                        if_get_master_dsa_linkinfo_attr(data, cur);
@@ -1787,11 +1774,8 @@ static int cb_if_get_master_valid(struct nl_msg *msg, void *arg)
        rem = nh->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi));
 
        while (RTA_OK(attr, rem)) {
-               if (attr->rta_type == IFLA_LINKINFO) {
+               if (attr->rta_type == IFLA_LINKINFO)
                        if_get_master_linkinfo_attr(data, attr);
-                       data->pending = false;
-                       break;
-               }
 
                attr = RTA_NEXT(attr, rem);
        }
@@ -1802,16 +1786,14 @@ static int cb_if_get_master_valid(struct nl_msg *msg, void *arg)
 static int cb_if_get_master_ack(struct nl_msg *msg, void *arg)
 {
        struct if_get_master_data *data = (struct if_get_master_data *)arg;
-       data->pending = false;
-
+       data->pending = 0;
        return NL_STOP;
 }
 
 static int cb_if_get_master_error(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg)
 {
        struct if_get_master_data *data = (struct if_get_master_data *)arg;
-       data->pending = false;
-
+       data->pending = 0;
        return NL_STOP;
 }
 
@@ -1826,7 +1808,7 @@ static int system_if_get_master_ifindex(struct device *dev)
        struct if_get_master_data data = {
                .ifindex = if_nametoindex(dev->ifname),
                .master_ifindex = -1,
-               .pending = true,
+               .pending = 1,
        };
        int ret = -1;
 
@@ -1849,7 +1831,7 @@ static int system_if_get_master_ifindex(struct device *dev)
        if (ret < 0)
                goto free;
 
-       while (data.pending)
+       while (data.pending > 0)
                nl_recvmsgs(sock_rtnl, cb);
 
        if (data.master_ifindex >= 0)