sd_rtnl_message *m;
assert_return(ret, -EINVAL);
- assert_return(initial_size > 0, -EINVAL);
+ assert_return(initial_size >= sizeof(struct nlmsghdr), -EINVAL);
m = new0(sd_rtnl_message, 1);
if (!m)
return 0;
}
-int sd_rtnl_message_link_new(__u16 nlmsg_type, int index, unsigned int type, unsigned int flags, sd_rtnl_message **ret) {
+int sd_rtnl_message_link_new(uint16_t nlmsg_type, int index, unsigned int type, unsigned int flags, sd_rtnl_message **ret) {
struct ifinfomsg *ifi;
int r;
(*ret)->hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
(*ret)->hdr->nlmsg_type = nlmsg_type;
- ifi = (struct ifinfomsg *) NLMSG_DATA((*ret)->hdr);
+ ifi = NLMSG_DATA((*ret)->hdr);
ifi->ifi_family = AF_UNSPEC;
ifi->ifi_index = index;
return 0;
}
-int sd_rtnl_message_addr_new(__u16 nlmsg_type, int index, unsigned char family, unsigned char prefixlen, unsigned char flags, unsigned char scope, sd_rtnl_message **ret) {
+int sd_rtnl_message_addr_new(uint16_t nlmsg_type, int index, unsigned char family, unsigned char prefixlen, unsigned char flags, unsigned char scope, sd_rtnl_message **ret) {
struct ifaddrmsg *ifa;
int r;
(*ret)->hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
(*ret)->hdr->nlmsg_type = nlmsg_type;
- ifa = (struct ifaddrmsg *) NLMSG_DATA((*ret)->hdr);
+ ifa = NLMSG_DATA((*ret)->hdr);
ifa->ifa_family = family;
ifa->ifa_prefixlen = prefixlen;
return NULL;
}
-int sd_rtnl_message_get_type(sd_rtnl_message *m, __u16 *type) {
+int sd_rtnl_message_get_type(sd_rtnl_message *m, uint16_t *type) {
assert_return(m, -EINVAL);
assert_return(type, -EINVAL);
/* If successful the updated message will be correctly aligned, if unsuccessful the old message is
untouched */
static int add_rtattr(sd_rtnl_message *m, unsigned short type, const void *data, size_t data_length) {
- __u32 rta_length, message_length;
+ uint32_t rta_length, message_length;
struct nlmsghdr *new_hdr;
struct rtattr *rta;
}
int sd_rtnl_message_append(sd_rtnl_message *m, unsigned short type, const void *data) {
- __u16 rtm_type;
+ uint16_t rtm_type;
struct ifaddrmsg *ifa;
assert_return(m, -EINVAL);
}
int sd_rtnl_message_read(sd_rtnl_message *m, unsigned short *type, void **data) {
- __u16 rtm_type;
+ uint16_t rtm_type;
assert_return(m, -EINVAL);
assert_return(data, -EINVAL);
case RTM_DELLINK:
case RTM_GETLINK:
if (!m->next_rta) {
- struct ifinfomsg *ifi = (struct ifinfomsg *) NLMSG_DATA(m->hdr);
+ struct ifinfomsg *ifi = NLMSG_DATA(m->hdr);
m->next_rta = IFLA_RTA(ifi);
m->remaining_size = IFLA_PAYLOAD(m->hdr);
case RTM_DELADDR:
case RTM_GETADDR:
if (!m->next_rta) {
- struct ifaddrmsg *ifa = (struct ifaddrmsg *) NLMSG_DATA(m->hdr);
+ struct ifaddrmsg *ifa = NLMSG_DATA(m->hdr);
m->next_rta = IFA_RTA(ifa);
m->remaining_size = IFLA_PAYLOAD(m->hdr);
assert_return(need, -EINVAL);
/* ioctl(rtnl->fd, FIONREAD, &need)
- Does not appear to work on netlink sockets. libnl uses
- MSG_PEEK instead. I don't know if that is worth the
- extra roundtrip.
-
- For now we simply use the maximum message size the kernel
- may use (NLMSG_GOODSIZE), and then realloc to the actual
- size after reading the message (hence avoiding huge memory
- usage in case many small messages are kept around) */
- *need = getpagesize();
+ Does not appear to work on netlink sockets. libnl uses
+ MSG_PEEK instead. I don't know if that is worth the
+ extra roundtrip.
+
+ For now we simply use the maximum message size the kernel
+ may use (NLMSG_GOODSIZE), and then realloc to the actual
+ size after reading the message (hence avoiding huge memory
+ usage in case many small messages are kept around) */
+ *need = page_size();
if (*need > 8192UL)
*need = 8192UL;
* which has a valid header and the correct size.
* If nothing useful was received 0 is returned.
* On failure, a negative error code is returned.
-*/
+ */
int socket_read_message(sd_rtnl *nl, sd_rtnl_message **ret) {
sd_rtnl_message *m;
socklen_t addr_len = sizeof(nl->sockaddr);
else if (nl->sockaddr.nl.nl_pid != 0)
k = 0; /* not from the kernel */
else if ((size_t) k < sizeof(struct nlmsghdr) ||
- (size_t) k < m->hdr->nlmsg_len)
+ (size_t) k < m->hdr->nlmsg_len)
k = -EIO; /* too small (we do accept too big though) */
else if (m->hdr->nlmsg_type == NLMSG_NOOP)
k = 0;
else if (m->hdr->nlmsg_type == NLMSG_ERROR &&
- m->hdr->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr)))
+ m->hdr->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr)))
k = -EIO;
else if ((pid_t) m->hdr->nlmsg_pid != getpid())
k = 0; /* not for us */
typedef struct sd_rtnl_message sd_rtnl_message;
/* bus */
-int sd_rtnl_open(__u32 groups, sd_rtnl **nl);
+int sd_rtnl_open(uint32_t groups, sd_rtnl **nl);
sd_rtnl *sd_rtnl_ref(sd_rtnl *nl);
sd_rtnl *sd_rtnl_unref(sd_rtnl *nl);
int sd_rtnl_send_with_reply_and_block(sd_rtnl *nl, sd_rtnl_message *message, uint64_t timeout, sd_rtnl_message **reply);
/* messages */
-int sd_rtnl_message_link_new(__u16 msg_type, int index, unsigned int type, unsigned int flags, sd_rtnl_message **ret);
-int sd_rtnl_message_addr_new(__u16 msg_type, int index, unsigned char family, unsigned char prefixlen, unsigned char flags, unsigned char scope, sd_rtnl_message **ret);
+int sd_rtnl_message_link_new(uint16_t msg_type, int index, unsigned int type, unsigned int flags, sd_rtnl_message **ret);
+int sd_rtnl_message_addr_new(uint16_t msg_type, int index, unsigned char family, unsigned char prefixlen, unsigned char flags, unsigned char scope, sd_rtnl_message **ret);
sd_rtnl_message *sd_rtnl_message_ref(sd_rtnl_message *m);
sd_rtnl_message *sd_rtnl_message_unref(sd_rtnl_message *m);
-int sd_rtnl_message_get_type(sd_rtnl_message *m, __u16 *type);
+int sd_rtnl_message_get_type(sd_rtnl_message *m, uint16_t *type);
int sd_rtnl_message_append(sd_rtnl_message *m, unsigned short type, const void *data);
int sd_rtnl_message_read(sd_rtnl_message *m, unsigned short *type, void **data);