diff options
Diffstat (limited to 'networking/libiproute/libnetlink.c')
-rw-r--r-- | networking/libiproute/libnetlink.c | 66 |
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 | ||
31 | int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions) | 31 | int 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 | ||
68 | int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type) | 55 | int 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 | ||
89 | int rtnl_send(struct rtnl_handle *rth, char *buf, int len) | 77 | int 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 | ||
99 | int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len) | 87 | int 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 | ||
123 | int rtnl_dump_filter(struct rtnl_handle *rth, | 111 | static 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 | ||
194 | skip_it: | 180 | skip_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 | ||
193 | int 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 | |||
207 | int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, | 203 | int 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 *), |