aboutsummaryrefslogtreecommitdiff
path: root/networking/libiproute/libnetlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/libiproute/libnetlink.c')
-rw-r--r--networking/libiproute/libnetlink.c66
1 files changed, 31 insertions, 35 deletions
diff --git a/networking/libiproute/libnetlink.c b/networking/libiproute/libnetlink.c
index 969648067..5307cec2c 100644
--- a/networking/libiproute/libnetlink.c
+++ b/networking/libiproute/libnetlink.c
@@ -28,44 +28,31 @@ void rtnl_close(struct rtnl_handle *rth)
28 close(rth->fd); 28 close(rth->fd);
29} 29}
30 30
31int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions) 31int xrtnl_open(struct rtnl_handle *rth/*, unsigned subscriptions*/)
32{ 32{
33 socklen_t addr_len; 33 socklen_t addr_len;
34 34
35 memset(rth, 0, sizeof(rth)); 35 memset(rth, 0, sizeof(rth));
36 36
37 rth->fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 37 rth->fd = xsocket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
38 if (rth->fd < 0) {
39 bb_perror_msg("cannot open netlink socket");
40 return -1;
41 }
42 38
43 memset(&rth->local, 0, sizeof(rth->local)); 39 memset(&rth->local, 0, sizeof(rth->local));
44 rth->local.nl_family = AF_NETLINK; 40 rth->local.nl_family = AF_NETLINK;
45 rth->local.nl_groups = subscriptions; 41 /*rth->local.nl_groups = subscriptions;*/
46 42
47 if (bind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local)) < 0) { 43 xbind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local));
48 bb_perror_msg("cannot bind netlink socket");
49 return -1;
50 }
51 addr_len = sizeof(rth->local); 44 addr_len = sizeof(rth->local);
52 if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0) { 45 if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0)
53 bb_perror_msg("cannot getsockname"); 46 bb_perror_msg_and_die("cannot getsockname");
54 return -1; 47 if (addr_len != sizeof(rth->local))
55 } 48 bb_error_msg_and_die("wrong address length %d", addr_len);
56 if (addr_len != sizeof(rth->local)) { 49 if (rth->local.nl_family != AF_NETLINK)
57 bb_error_msg("wrong address length %d", addr_len); 50 bb_error_msg_and_die("wrong address family %d", rth->local.nl_family);
58 return -1;
59 }
60 if (rth->local.nl_family != AF_NETLINK) {
61 bb_error_msg("wrong address family %d", rth->local.nl_family);
62 return -1;
63 }
64 rth->seq = time(NULL); 51 rth->seq = time(NULL);
65 return 0; 52 return 0;
66} 53}
67 54
68int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type) 55int xrtnl_wilddump_request(struct rtnl_handle *rth, int family, int type)
69{ 56{
70 struct { 57 struct {
71 struct nlmsghdr nlh; 58 struct nlmsghdr nlh;
@@ -83,7 +70,8 @@ int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type)
83 req.nlh.nlmsg_seq = rth->dump = ++rth->seq; 70 req.nlh.nlmsg_seq = rth->dump = ++rth->seq;
84 req.g.rtgen_family = family; 71 req.g.rtgen_family = family;
85 72
86 return sendto(rth->fd, (void*)&req, sizeof(req), 0, (struct sockaddr*)&nladdr, sizeof(nladdr)); 73 return xsendto(rth->fd, (void*)&req, sizeof(req),
74 (struct sockaddr*)&nladdr, sizeof(nladdr));
87} 75}
88 76
89int rtnl_send(struct rtnl_handle *rth, char *buf, int len) 77int rtnl_send(struct rtnl_handle *rth, char *buf, int len)
@@ -93,7 +81,7 @@ int rtnl_send(struct rtnl_handle *rth, char *buf, int len)
93 memset(&nladdr, 0, sizeof(nladdr)); 81 memset(&nladdr, 0, sizeof(nladdr));
94 nladdr.nl_family = AF_NETLINK; 82 nladdr.nl_family = AF_NETLINK;
95 83
96 return sendto(rth->fd, buf, len, 0, (struct sockaddr*)&nladdr, sizeof(nladdr)); 84 return xsendto(rth->fd, buf, len, (struct sockaddr*)&nladdr, sizeof(nladdr));
97} 85}
98 86
99int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len) 87int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len)
@@ -120,11 +108,11 @@ int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len)
120 return sendmsg(rth->fd, &msg, 0); 108 return sendmsg(rth->fd, &msg, 0);
121} 109}
122 110
123int rtnl_dump_filter(struct rtnl_handle *rth, 111static int rtnl_dump_filter(struct rtnl_handle *rth,
124 int (*filter)(struct sockaddr_nl *, struct nlmsghdr *n, void *), 112 int (*filter)(struct sockaddr_nl *, struct nlmsghdr *n, void *),
125 void *arg1, 113 void *arg1/*,
126 int (*junk)(struct sockaddr_nl *, struct nlmsghdr *n, void *), 114 int (*junk)(struct sockaddr_nl *, struct nlmsghdr *n, void *),
127 void *arg2) 115 void *arg2*/)
128{ 116{
129 char buf[8192]; 117 char buf[8192];
130 struct sockaddr_nl nladdr; 118 struct sockaddr_nl nladdr;
@@ -164,12 +152,11 @@ int rtnl_dump_filter(struct rtnl_handle *rth,
164 if (nladdr.nl_pid != 0 || 152 if (nladdr.nl_pid != 0 ||
165 h->nlmsg_pid != rth->local.nl_pid || 153 h->nlmsg_pid != rth->local.nl_pid ||
166 h->nlmsg_seq != rth->dump) { 154 h->nlmsg_seq != rth->dump) {
167 if (junk) { 155/* if (junk) {
168 err = junk(&nladdr, h, arg2); 156 err = junk(&nladdr, h, arg2);
169 if (err < 0) { 157 if (err < 0)
170 return err; 158 return err;
171 } 159 } */
172 }
173 goto skip_it; 160 goto skip_it;
174 } 161 }
175 162
@@ -187,9 +174,8 @@ int rtnl_dump_filter(struct rtnl_handle *rth,
187 return -1; 174 return -1;
188 } 175 }
189 err = filter(&nladdr, h, arg1); 176 err = filter(&nladdr, h, arg1);
190 if (err < 0) { 177 if (err < 0)
191 return err; 178 return err;
192 }
193 179
194skip_it: 180skip_it:
195 h = NLMSG_NEXT(h, status); 181 h = NLMSG_NEXT(h, status);
@@ -204,6 +190,16 @@ skip_it:
204 } 190 }
205} 191}
206 192
193int xrtnl_dump_filter(struct rtnl_handle *rth,
194 int (*filter)(struct sockaddr_nl *, struct nlmsghdr *n, void *),
195 void *arg1)
196{
197 int ret = rtnl_dump_filter(rth, filter, arg1/*, NULL, NULL*/);
198 if (ret < 0)
199 bb_error_msg_and_die("dump terminated");
200 return ret;
201}
202
207int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, 203int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
208 unsigned groups, struct nlmsghdr *answer, 204 unsigned groups, struct nlmsghdr *answer,
209 int (*junk)(struct sockaddr_nl *,struct nlmsghdr *n, void *), 205 int (*junk)(struct sockaddr_nl *,struct nlmsghdr *n, void *),