sou
static void inet_makenetandmask(u_int32_t, struct sockaddr_in *, struct sou *);
prefixlen(const char *s, struct sou *soup)
static int inet6_makenetandmask(const struct sockaddr_in6 *, struct sou *);
static int getaddr(int, const char *, struct hostent **, struct sou *);
static int prefixlen(const char *, struct sou *);
static int print_getmsg(struct rt_msghdr *, int, struct sou *);
rtmsg(int cmd, int flags, struct sou *soup)
static int rtmsg(int, int, struct sou *);
static void mask_addr(struct sou *);
mask_addr(struct sou *soup)
print_getmsg(struct rt_msghdr *rtm, int msglen, struct sou *soup)
struct sou sou, *soup = &sou;
sou.so_dst = calloc(1, sizeof(union sockunion));
sou.so_gate = calloc(1, sizeof(union sockunion));
sou.so_mask = calloc(1, sizeof(union sockunion));
sou.so_genmask = calloc(1, sizeof(union sockunion));
sou.so_ifa = calloc(1, sizeof(union sockunion));
sou.so_ifp = calloc(1, sizeof(union sockunion));
sou.so_mpls = calloc(1, sizeof(union sockunion));
if (sou.so_dst == NULL || sou.so_gate == NULL || sou.so_mask == NULL ||
sou.so_genmask == NULL || sou.so_ifa == NULL || sou.so_ifp == NULL ||
sou.so_mpls == NULL)
free(sou.so_dst);
free(sou.so_gate);
free(sou.so_mask);
free(sou.so_genmask);
free(sou.so_ifa);
free(sou.so_ifp);
free(sou.so_mpls);
struct sou *soup)
inet6_makenetandmask(const struct sockaddr_in6 * const sin6, struct sou *soup)
getaddr(int which, const char *s, struct hostent **hpp, struct sou *soup)
if (tp->u.sou->sou_tag->s_name == unnamed &&
tp->u.sou->sou_first_typedef != NULL) {
buf_add(buf, tp->u.sou->sou_first_typedef->s_name);
buf_add(buf, tp->u.sou->sou_tag->s_name);
if (is_struct_or_union(t) && tp->u.sou->sou_incomplete)
unsigned int size_in_bits = tp->u.sou->sou_size_in_bits;
tp->u.sou->sou_align,
tp->u.sou->sou_incomplete ? "incomplete" : "complete");
for (const sym_t *mem = tp->u.sou->sou_first_member;
struct_or_union *sou = sym->u.s_member.sm_containing_type;
const char *tag = sou->sou_tag->s_name;
const sym_t *def = sou->sou_first_typedef;
mem->u.s_member.sm_containing_type = dcs->d_tag_type->u.sou;
lint_assert(dcs->d_tag_type->u.sou != NULL);
dsym->u.s_member.sm_containing_type = dcs->d_tag_type->u.sou;
sym->u.s_member.sm_containing_type = dcs->d_tag_type->u.sou;
tp->u.sou = block_zero_alloc(sizeof(*tp->u.sou),
tp->u.sou->sou_align = 1;
tp->u.sou->sou_tag = tag;
tp->u.sou->sou_incomplete = true;
has_named_member(const struct_or_union *sou)
for (const sym_t *mem = sou->sou_first_member;
&& has_named_member(mem->s_type->u.sou))
struct_or_union *sou = tp->u.sou;
sou->sou_align = dcs->d_sou_align;
sou->sou_incomplete = false;
sou->sou_first_member = first_member;
sou->sou_size_in_bits = dcs->d_sou_size_in_bits;
if (sou->sou_size_in_bits == 0)
else if (!has_named_member(sou))
return tp->u.sou->sou_incomplete;
return tp1->u.sou == tp2->u.sou;
if (is_struct_or_union(t) && tp->u.sou->sou_first_typedef == NULL)
tp->u.sou->sou_first_typedef = sym;
for (const sym_t *mem = tp->u.sou->sou_first_member;
tp->u.sou->sou_size_in_bits = bits;
dcs->d_type->u.sou->sou_align = dcs->d_mem_align;
dcs->d_type->u.sou->sou_align = align;
dcs->d_type->u.sou->sou_size_in_bits =
(dcs->d_type->u.sou->sou_size_in_bits + align_in_bits - 1)
return (int)(elem * tp->u.sou->sou_size_in_bits);
a = tp->u.sou->sou_align;
outtt(tp->u.sou->sou_tag,
tp->u.sou->sou_first_typedef);
return skip_unnamed(tp->u.sou->sou_first_member);
if (is_struct_or_union(tp->t_tspec) && tp->u.sou->sou_incomplete) {
const sym_t *member = find_member(tp->u.sou, name);
struct_or_union *sou;
if ((elsz_in_bits = (int)tp->u.sou->sou_size_in_bits) == 0)
lint_assert(ln->tn_type->u.sou == rn->tn_type->u.sou);
lint_assert(ln->tn_type->u.sou == rn->tn_type->u.sou);
find_member(const struct_or_union *sou, const char *name)
for (sym_t *mem = sou->sou_first_member;
lint_assert(mem->u.s_member.sm_containing_type == sou);
for (sym_t *mem = sou->sou_first_member;
find_member(mem->s_type->u.sou, name);
struct_or_union *sou = expr_zero_alloc(sizeof(*sou),
sou->sou_tag = expr_zero_alloc(sizeof(*sou->sou_tag), "sym");
sou->sou_tag->s_name = unnamed;
msym->u.s_member.sm_containing_type = sou;
struct_or_union *sou = tp != NULL ? tp->u.sou : NULL;
if (sou != NULL) {
sym_t *nested_mem = find_member(sou, msym->s_name);
if (sou != NULL) {
if (lt == STRUCT && rt == STRUCT && ltp->u.sou == rtp->u.sou)
if (lt == UNION && rt == UNION && ltp->u.sou == rtp->u.sou)
for (sym_t *m = tp->u.sou->sou_first_member;
return ltp->u.sou == rtp->u.sou;
return struct_tp->u.sou->sou_first_member != NULL &&
types_compatible(struct_tp->u.sou->sou_first_member->s_type,
for (const sym_t *mem = utp->u.sou->sou_first_member;
const sym_t *nmem = nstp->u.sou->sou_first_member;
const sym_t *omem = ostp->u.sou->sou_first_member;
return nstp->u.sou != ostp->u.sou;
sym_t *mem = find_member(tp->u.sou, name);
elsz = tp->u.sou->sou_size_in_bits;
for (const sym_t *m = ntp->u.sou->sou_first_member;