2 * Copyright (C) 2012-2020 all contributors <cmogstored-public@yhbt.net>
3 * License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
8 struct sockaddr_in6 in6
;
10 uint8_t bytes
[sizeof(struct sockaddr_in6
)];
13 /* this is the relevant part we may store in "struct mog_fd" */
15 sa_family_t sa_family
;
18 struct in6_addr
*in6_ptr
;
19 struct in_addr in_addr
;
21 } __attribute__((packed
));
23 static inline void mog_packaddr_free(struct mog_packaddr
*mpa
)
25 if (mpa
->sa_family
!= AF_INET
)
26 free(mpa
->as
.in6_ptr
);
29 static inline void mog_packaddr_init(struct mog_packaddr
*mpa
,
30 union mog_sockaddr
*msa
, socklen_t salen
)
32 mpa
->sa_family
= msa
->in
.sin_family
;
34 if (mpa
->sa_family
== AF_INET
) {
35 mpa
->port
= msa
->in
.sin_port
;
36 memcpy(&mpa
->as
.in_addr
, &msa
->in
.sin_addr
,
37 sizeof(struct in_addr
));
39 assert(mpa
->sa_family
== AF_INET6
&& "invalid sa_family");
40 mpa
->port
= msa
->in6
.sin6_port
;
41 mpa
->as
.in6_ptr
= xmalloc(sizeof(struct in6_addr
));
42 memcpy(mpa
->as
.in6_ptr
, &msa
->in6
.sin6_addr
,
43 sizeof(struct in6_addr
));