summaryrefslogtreecommitdiff
path: root/src/libnm-systemd-shared/src/basic/socket-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnm-systemd-shared/src/basic/socket-util.c')
-rw-r--r--src/libnm-systemd-shared/src/basic/socket-util.c72
1 files changed, 70 insertions, 2 deletions
diff --git a/src/libnm-systemd-shared/src/basic/socket-util.c b/src/libnm-systemd-shared/src/basic/socket-util.c
index f39be19a59..d7946a3641 100644
--- a/src/libnm-systemd-shared/src/basic/socket-util.c
+++ b/src/libnm-systemd-shared/src/basic/socket-util.c
@@ -1049,7 +1049,7 @@ ssize_t receive_one_fd_iov(
if (found)
*ret_fd = *(int*) CMSG_DATA(found);
else
- *ret_fd = -1;
+ *ret_fd = -EBADF;
return k;
}
@@ -1426,7 +1426,7 @@ int socket_get_mtu(int fd, int af, size_t *ret) {
}
int connect_unix_path(int fd, int dir_fd, const char *path) {
- _cleanup_close_ int inode_fd = -1;
+ _cleanup_close_ int inode_fd = -EBADF;
union sockaddr_union sa = {
.un.sun_family = AF_UNIX,
};
@@ -1472,3 +1472,71 @@ int connect_unix_path(int fd, int dir_fd, const char *path) {
return RET_NERRNO(connect(fd, &sa.sa, salen));
}
+
+int socket_address_parse_unix(SocketAddress *ret_address, const char *s) {
+ struct sockaddr_un un;
+ int r;
+
+ assert(ret_address);
+ assert(s);
+
+ if (!IN_SET(*s, '/', '@'))
+ return -EPROTO;
+
+ r = sockaddr_un_set_path(&un, s);
+ if (r < 0)
+ return r;
+
+ *ret_address = (SocketAddress) {
+ .sockaddr.un = un,
+ .size = r,
+ };
+
+ return 0;
+}
+
+int socket_address_parse_vsock(SocketAddress *ret_address, const char *s) {
+ /* AF_VSOCK socket in vsock:cid:port notation */
+ _cleanup_free_ char *n = NULL;
+ char *e, *cid_start;
+ unsigned port, cid;
+ int r;
+
+ assert(ret_address);
+ assert(s);
+
+ cid_start = startswith(s, "vsock:");
+ if (!cid_start)
+ return -EPROTO;
+
+ e = strchr(cid_start, ':');
+ if (!e)
+ return -EINVAL;
+
+ r = safe_atou(e+1, &port);
+ if (r < 0)
+ return r;
+
+ n = strndup(cid_start, e - cid_start);
+ if (!n)
+ return -ENOMEM;
+
+ if (isempty(n))
+ cid = VMADDR_CID_ANY;
+ else {
+ r = safe_atou(n, &cid);
+ if (r < 0)
+ return r;
+ }
+
+ *ret_address = (SocketAddress) {
+ .sockaddr.vm = {
+ .svm_cid = cid,
+ .svm_family = AF_VSOCK,
+ .svm_port = port,
+ },
+ .size = sizeof(struct sockaddr_vm),
+ };
+
+ return 0;
+}