cmogstored 1.8.1 - use default system stack size
[cmogstored.git] / packaddr.h
blob3dcda7d7838d35841f03690d878ea09e3de78d55
1 /*
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>
4 */
6 union mog_sockaddr {
7 struct sockaddr_in in;
8 struct sockaddr_in6 in6;
9 struct sockaddr sa;
10 uint8_t bytes[sizeof(struct sockaddr_in6)];
13 /* this is the relevant part we may store in "struct mog_fd" */
14 struct mog_packaddr {
15 sa_family_t sa_family;
16 in_port_t port;
17 union {
18 struct in6_addr *in6_ptr;
19 struct in_addr in_addr;
20 } as;
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));
38 } else {
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));