chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sd-rtnl: never set serial to 0
[elogind.git]
/
src
/
libsystemd
/
sd-rtnl
/
sd-rtnl.c
diff --git
a/src/libsystemd/sd-rtnl/sd-rtnl.c
b/src/libsystemd/sd-rtnl/sd-rtnl.c
index 767c583735211dcf35b8533348a7b504ab7b4503..f483af991bc2f8e46861c77641703047d06249bb 100644
(file)
--- a/
src/libsystemd/sd-rtnl/sd-rtnl.c
+++ b/
src/libsystemd/sd-rtnl/sd-rtnl.c
@@
-61,6
+61,11
@@
static int sd_rtnl_new(sd_rtnl **ret) {
sizeof(struct nlmsghdr), sizeof(uint8_t)))
return -ENOMEM;
sizeof(struct nlmsghdr), sizeof(uint8_t)))
return -ENOMEM;
+ /* Change notification responses have sequence 0, so we must
+ * start our request sequence numbers at 1, or we may confuse our
+ * responses with notifications from the kernel */
+ rtnl->serial = 1;
+
*ret = rtnl;
rtnl = NULL;
*ret = rtnl;
rtnl = NULL;
@@
-74,7
+79,7
@@
int sd_rtnl_new_from_netlink(sd_rtnl **ret, int fd) {
assert_return(ret, -EINVAL);
assert_return(ret, -EINVAL);
- r = sd_rtnl_new(
ret
);
+ r = sd_rtnl_new(
&rtnl
);
if (r < 0)
return r;
if (r < 0)
return r;
@@
-146,7
+151,8
@@
static int rtnl_open_fd_ap(sd_rtnl **ret, int fd, unsigned n_groups, va_list ap)
addrlen = sizeof(rtnl->sockaddr);
r = bind(fd, &rtnl->sockaddr.sa, addrlen);
addrlen = sizeof(rtnl->sockaddr);
r = bind(fd, &rtnl->sockaddr.sa, addrlen);
- if (r < 0)
+ /* ignore EINVAL to allow opening an already bound socket */
+ if (r < 0 && errno != EINVAL)
return -errno;
r = getsockname(fd, &rtnl->sockaddr.sa, &addrlen);
return -errno;
r = getsockname(fd, &rtnl->sockaddr.sa, &addrlen);
@@
-256,7
+262,7
@@
static void rtnl_seal_message(sd_rtnl *rtnl, sd_rtnl_message *m) {
assert(m);
assert(m->hdr);
assert(m);
assert(m->hdr);
- m->hdr->nlmsg_seq = rtnl->serial++;
+ m->hdr->nlmsg_seq = rtnl->serial++
? : rtnl->serial++
;
rtnl_message_seal(m);
rtnl_message_seal(m);
@@
-992,7
+998,7
@@
int sd_rtnl_add_match(sd_rtnl *rtnl,
assert_return(!rtnl_pid_changed(rtnl), -ECHILD);
assert_return(rtnl_message_type_is_link(type) ||
rtnl_message_type_is_addr(type) ||
assert_return(!rtnl_pid_changed(rtnl), -ECHILD);
assert_return(rtnl_message_type_is_link(type) ||
rtnl_message_type_is_addr(type) ||
- rtnl_message_type_is_route(type), -E
NOTSU
P);
+ rtnl_message_type_is_route(type), -E
OPNOTSUP
P);
c = new0(struct match_callback, 1);
if (!c)
c = new0(struct match_callback, 1);
if (!c)