summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2021-11-22 11:29:42 +0100
committerLennart Poettering <lennart@poettering.net>2021-11-22 22:18:34 +0100
commitc1b91f06b93ba29eafbf50f4858aedfb6ded4ff1 (patch)
tree36defe3e0dfca65359a66d5814b76b8f3bea4de1
parentf96b500eced522adb56e4e79a876c6a9471bb134 (diff)
downloadsystemd-c1b91f06b93ba29eafbf50f4858aedfb6ded4ff1.tar.gz
socket-util: add helper for generically initializing sockaddr_union from in_addr_union
-rw-r--r--src/basic/socket-util.c35
-rw-r--r--src/basic/socket-util.h2
2 files changed, 37 insertions, 0 deletions
diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c
index ca6085ef64..8d0494ece5 100644
--- a/src/basic/socket-util.c
+++ b/src/basic/socket-util.c
@@ -400,6 +400,41 @@ const union in_addr_union *sockaddr_in_addr(const struct sockaddr *_sa) {
}
}
+int sockaddr_set_in_addr(
+ union sockaddr_union *u,
+ int family,
+ const union in_addr_union *a,
+ uint16_t port) {
+
+ assert(u);
+ assert(a);
+
+ switch (family) {
+
+ case AF_INET:
+ u->in = (struct sockaddr_in) {
+ .sin_family = AF_INET,
+ .sin_addr = a->in,
+ .sin_port = htobe16(port),
+ };
+
+ return 0;
+
+ case AF_INET6:
+ u->in6 = (struct sockaddr_in6) {
+ .sin6_family = AF_INET6,
+ .sin6_addr = a->in6,
+ .sin6_port = htobe16(port),
+ };
+
+ return 0;
+
+ default:
+ return -EAFNOSUPPORT;
+
+ }
+}
+
int sockaddr_pretty(
const struct sockaddr *_sa,
socklen_t salen,
diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h
index c4fafa084b..57e655154c 100644
--- a/src/basic/socket-util.h
+++ b/src/basic/socket-util.h
@@ -15,6 +15,7 @@
#include <sys/un.h>
#include "errno-util.h"
+#include "in-addr-util.h"
#include "macro.h"
#include "missing_network.h"
#include "missing_socket.h"
@@ -106,6 +107,7 @@ bool socket_ipv6_is_enabled(void);
int sockaddr_port(const struct sockaddr *_sa, unsigned *port);
const union in_addr_union *sockaddr_in_addr(const struct sockaddr *sa);
+int sockaddr_set_in_addr(union sockaddr_union *u, int family, const union in_addr_union *a, uint16_t port);
int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret);
int getpeername_pretty(int fd, bool include_port, char **ret);