netlink: Fix C++ compile errors

Allow these files to be included in C++ programs with careful casting to
the proper type, like C++ wants (and in a way that also works for C).

MFC After: 1 week
Reviewed by: imp
Pull Request: https://github.com/freebsd/freebsd-src/pull/1245
This commit is contained in:
cnbatch
2024-05-17 21:09:44 +08:00
committed by Warner Losh
parent bfd248f59d
commit ff92493a4f
3 changed files with 23 additions and 22 deletions
+17 -16
View File
@@ -63,7 +63,7 @@
#define _NLA_END(_start, _len) ((char *)(_start) + (_len)) #define _NLA_END(_start, _len) ((char *)(_start) + (_len))
#define NLA_FOREACH(_attr, _start, _len) \ #define NLA_FOREACH(_attr, _start, _len) \
for (_attr = (_start); \ for (_attr = (struct nlattr *)(_start); \
((char *)_attr < _NLA_END(_start, _len)) && \ ((char *)_attr < _NLA_END(_start, _len)) && \
((char *)NLA_NEXT(_attr) <= _NLA_END(_start, _len)); \ ((char *)NLA_NEXT(_attr) <= _NLA_END(_start, _len)); \
_attr = NLA_NEXT(_attr)) _attr = NLA_NEXT(_attr))
@@ -80,7 +80,7 @@ struct linear_buffer {
static inline struct linear_buffer * static inline struct linear_buffer *
lb_init(uint32_t size) lb_init(uint32_t size)
{ {
struct linear_buffer *lb = calloc(1, size); struct linear_buffer *lb = (struct linear_buffer *)calloc(1, size);
if (lb != NULL) { if (lb != NULL) {
lb->base = (char *)(lb + 1); lb->base = (char *)(lb + 1);
@@ -102,7 +102,7 @@ lb_allocz(struct linear_buffer *lb, int len)
len = roundup2(len, alignof(__max_align_t)); len = roundup2(len, alignof(__max_align_t));
if (lb->offset + len > lb->size) if (lb->offset + len > lb->size)
return (NULL); return (NULL);
void *data = (void *)(lb->base + lb->offset); char *data = (lb->base + lb->offset);
lb->offset += len; lb->offset += len;
return (data); return (data);
} }
@@ -275,7 +275,7 @@ snl_init(struct snl_state *ss, int netlink_family)
} }
ss->bufsize = rcvbuf; ss->bufsize = rcvbuf;
ss->buf = malloc(ss->bufsize); ss->buf = (char *)malloc(ss->bufsize);
if (ss->buf == NULL) { if (ss->buf == NULL) {
snl_free(ss); snl_free(ss);
return (false); return (false);
@@ -495,7 +495,8 @@ snl_parse_header(struct snl_state *ss, void *hdr, int len,
struct nlattr *nla_head; struct nlattr *nla_head;
/* Extract fields first (if any) */ /* Extract fields first (if any) */
snl_parse_fields(ss, hdr, parser->in_hdr_size, parser->fp, parser->fp_size, target); snl_parse_fields(ss, (struct nlmsghdr *)hdr, parser->in_hdr_size,
parser->fp, parser->fp_size, target);
nla_head = (struct nlattr *)(void *)((char *)hdr + parser->in_hdr_size); nla_head = (struct nlattr *)(void *)((char *)hdr + parser->in_hdr_size);
bool result = snl_parse_attrs_raw(ss, nla_head, len - parser->in_hdr_size, bool result = snl_parse_attrs_raw(ss, nla_head, len - parser->in_hdr_size,
@@ -639,7 +640,7 @@ snl_attr_get_stringn(struct snl_state *ss, struct nlattr *nla,
{ {
int maxlen = NLA_DATA_LEN(nla); int maxlen = NLA_DATA_LEN(nla);
char *buf = snl_allocz(ss, maxlen + 1); char *buf = (char *)snl_allocz(ss, maxlen + 1);
if (buf == NULL) if (buf == NULL)
return (false); return (false);
buf[maxlen] = '\0'; buf[maxlen] = '\0';
@@ -656,7 +657,7 @@ snl_attr_copy_string(struct snl_state *ss, struct nlattr *nla,
char *tmp; char *tmp;
if (snl_attr_get_string(ss, nla, NULL, &tmp)) { if (snl_attr_get_string(ss, nla, NULL, &tmp)) {
strlcpy(target, tmp, (size_t)arg); strlcpy((char *)target, tmp, (size_t)arg);
return (true); return (true);
} }
return (false); return (false);
@@ -669,7 +670,7 @@ snl_attr_dup_string(struct snl_state *ss __unused, struct nlattr *nla,
size_t maxlen = NLA_DATA_LEN(nla); size_t maxlen = NLA_DATA_LEN(nla);
if (strnlen((char *)NLA_DATA(nla), maxlen) < maxlen) { if (strnlen((char *)NLA_DATA(nla), maxlen) < maxlen) {
char *buf = snl_allocz(ss, maxlen); char *buf = (char *)snl_allocz(ss, maxlen);
if (buf == NULL) if (buf == NULL)
return (false); return (false);
memcpy(buf, NLA_DATA(nla), maxlen); memcpy(buf, NLA_DATA(nla), maxlen);
@@ -698,14 +699,14 @@ snl_attr_get_parray_sz(struct snl_state *ss, struct nlattr *container_nla,
uint32_t start_size, const void *arg, void *target) uint32_t start_size, const void *arg, void *target)
{ {
const struct snl_hdr_parser *p = (const struct snl_hdr_parser *)arg; const struct snl_hdr_parser *p = (const struct snl_hdr_parser *)arg;
struct snl_parray *array = target; struct snl_parray *array = (struct snl_parray *)target;
struct nlattr *nla; struct nlattr *nla;
uint32_t count = 0, size = start_size; uint32_t count = 0, size = start_size;
if (p->out_size == 0) if (p->out_size == 0)
return (false); return (false);
array->items = snl_allocz(ss, size * sizeof(void *)); array->items = (void **)snl_allocz(ss, size * sizeof(void *));
if (array->items == NULL) if (array->items == NULL)
return (false); return (false);
@@ -735,7 +736,7 @@ snl_attr_get_parray_sz(struct snl_state *ss, struct nlattr *container_nla,
if (count == size) { if (count == size) {
uint32_t new_size = size * 2; uint32_t new_size = size * 2;
void **new_array = snl_allocz(ss, new_size *sizeof(void *)); void **new_array = (void **)snl_allocz(ss, new_size *sizeof(void *));
memcpy(new_array, array->items, size * sizeof(void *)); memcpy(new_array, array->items, size * sizeof(void *));
array->items = new_array; array->items = new_array;
@@ -848,7 +849,7 @@ static const struct snl_attr_parser _nla_p_bitset[] = {
static inline bool static inline bool
_cb_p_bitset(struct snl_state *ss __unused, void *_target) _cb_p_bitset(struct snl_state *ss __unused, void *_target)
{ {
struct snl_attr_bitset *target = _target; struct snl_attr_bitset *target = (struct snl_attr_bitset *)_target;
uint32_t sz_bytes = _roundup2(target->nla_bitset_size, 32) / 8; uint32_t sz_bytes = _roundup2(target->nla_bitset_size, 32) / 8;
@@ -884,7 +885,7 @@ snl_attr_get_bitset_c(struct snl_state *ss, struct nlattr *nla,
const void *arg __unused, void *_target) const void *arg __unused, void *_target)
{ {
const struct snl_hdr_parser *p = &_nla_bitset_parser; const struct snl_hdr_parser *p = &_nla_bitset_parser;
struct snl_attr_bitset *target = _target; struct snl_attr_bitset *target = (struct snl_attr_bitset *)_target;
/* Assumes target points to the beginning of the structure */ /* Assumes target points to the beginning of the structure */
if (!snl_parse_header(ss, NLA_DATA(nla), NLA_DATA_LEN(nla), p, _target)) if (!snl_parse_header(ss, NLA_DATA(nla), NLA_DATA_LEN(nla), p, _target))
@@ -1004,7 +1005,7 @@ parse_cmsg(struct snl_state *ss, const struct msghdr *msg, struct snl_msg_info *
int len = cmsg->cmsg_len - ((char *)data - (char *)cmsg); int len = cmsg->cmsg_len - ((char *)data - (char *)cmsg);
const struct snl_hdr_parser *ps = &snl_msg_info_parser; const struct snl_hdr_parser *ps = &snl_msg_info_parser;
return (snl_parse_attrs_raw(ss, data, len, ps->np, ps->np_size, attrs)); return (snl_parse_attrs_raw(ss, (struct nlattr *)data, len, ps->np, ps->np_size, attrs));
} }
return (false); return (false);
@@ -1046,7 +1047,7 @@ static inline void
snl_init_writer(struct snl_state *ss, struct snl_writer *nw) snl_init_writer(struct snl_state *ss, struct snl_writer *nw)
{ {
nw->size = SNL_WRITER_BUFFER_SIZE; nw->size = SNL_WRITER_BUFFER_SIZE;
nw->base = snl_allocz(ss, nw->size); nw->base = (char *)snl_allocz(ss, nw->size);
if (nw->base == NULL) { if (nw->base == NULL) {
nw->error = true; nw->error = true;
nw->size = 0; nw->size = 0;
@@ -1084,7 +1085,7 @@ snl_realloc_msg_buffer(struct snl_writer *nw, size_t sz)
nw->hdr = (struct nlmsghdr *) nw->hdr = (struct nlmsghdr *)
(void *)((char *)new_base + hdr_off); (void *)((char *)new_base + hdr_off);
} }
nw->base = new_base; nw->base = (char *)new_base;
} }
return (true); return (true);
+1 -1
View File
@@ -100,7 +100,7 @@ snl_attr_get_ip(struct snl_state *ss, struct nlattr *nla,
static inline struct sockaddr * static inline struct sockaddr *
parse_rta_via(struct snl_state *ss, struct rtattr *rta, int *perror) parse_rta_via(struct snl_state *ss, struct rtattr *rta, int *perror)
{ {
struct rtvia *via = NL_RTA_DATA(rta); struct rtvia *via = (struct rtvia *)NL_RTA_DATA(rta);
switch (via->rtvia_family) { switch (via->rtvia_family) {
case AF_INET: case AF_INET:
+5 -5
View File
@@ -78,7 +78,7 @@ static const struct snl_field_parser _fp_p_mp_nh[] = {
static inline bool static inline bool
_cb_p_mp_nh(struct snl_state *ss __unused, void *_target) _cb_p_mp_nh(struct snl_state *ss __unused, void *_target)
{ {
struct rta_mpath_nh *target = _target; struct rta_mpath_nh *target = (struct rta_mpath_nh *)_target;
finalize_sockaddr(target->gw, target->ifindex); finalize_sockaddr(target->gw, target->ifindex);
return (true); return (true);
@@ -158,7 +158,7 @@ static const struct snl_field_parser _fp_p_route[] = {
static inline bool static inline bool
_cb_p_route(struct snl_state *ss __unused, void *_target) _cb_p_route(struct snl_state *ss __unused, void *_target)
{ {
struct snl_parsed_route *target = _target; struct snl_parsed_route *target = (struct snl_parsed_route *)_target;
finalize_sockaddr(target->rta_dst, target->rta_oif); finalize_sockaddr(target->rta_dst, target->rta_oif);
finalize_sockaddr(target->rta_gw, target->rta_oif); finalize_sockaddr(target->rta_gw, target->rta_oif);
@@ -277,7 +277,7 @@ static struct snl_field_parser _fp_p_neigh_s[] = {
static inline bool static inline bool
_cb_p_neigh(struct snl_state *ss __unused, void *_target) _cb_p_neigh(struct snl_state *ss __unused, void *_target)
{ {
struct snl_parsed_neigh *target = _target; struct snl_parsed_neigh *target = (struct snl_parsed_neigh *)_target;
finalize_sockaddr(target->nda_dst, target->nda_ifindex); finalize_sockaddr(target->nda_dst, target->nda_ifindex);
return (true); return (true);
@@ -326,7 +326,7 @@ static const struct snl_field_parser _fp_p_addr_s[] = {
static inline bool static inline bool
_cb_p_addr(struct snl_state *ss __unused, void *_target) _cb_p_addr(struct snl_state *ss __unused, void *_target)
{ {
struct snl_parsed_addr *target = _target; struct snl_parsed_addr *target = (struct snl_parsed_addr *)_target;
finalize_sockaddr(target->ifa_address, target->ifa_index); finalize_sockaddr(target->ifa_address, target->ifa_index);
finalize_sockaddr(target->ifa_local, target->ifa_index); finalize_sockaddr(target->ifa_local, target->ifa_index);
@@ -379,7 +379,7 @@ static const struct snl_attr_parser _nla_p_nh[] = {
static inline bool static inline bool
_cb_p_nh(struct snl_state *ss __unused, void *_target) _cb_p_nh(struct snl_state *ss __unused, void *_target)
{ {
struct snl_parsed_nhop *target = _target; struct snl_parsed_nhop *target = (struct snl_parsed_nhop *)_target;
finalize_sockaddr(target->nha_gw, target->nha_oif); finalize_sockaddr(target->nha_gw, target->nha_oif);
return (true); return (true);