systemd: merge branch systemd into master
This commit is contained in:
@@ -806,8 +806,10 @@ int chase_symlinks(const char *path, const char *original_root, unsigned flags,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ret = done;
|
if (ret) {
|
||||||
done = NULL;
|
*ret = done;
|
||||||
|
done = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return exists;
|
return exists;
|
||||||
}
|
}
|
||||||
|
@@ -99,6 +99,9 @@ int unhexmem(const char *p, size_t l, void **mem, size_t *len) {
|
|||||||
assert(len);
|
assert(len);
|
||||||
assert(p);
|
assert(p);
|
||||||
|
|
||||||
|
if (l % 2 != 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
z = r = malloc((l + 1) / 2 + 1);
|
z = r = malloc((l + 1) / 2 + 1);
|
||||||
if (!r)
|
if (!r)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@@ -109,12 +112,10 @@ int unhexmem(const char *p, size_t l, void **mem, size_t *len) {
|
|||||||
a = unhexchar(x[0]);
|
a = unhexchar(x[0]);
|
||||||
if (a < 0)
|
if (a < 0)
|
||||||
return a;
|
return a;
|
||||||
else if (x+1 < p + l) {
|
|
||||||
b = unhexchar(x[1]);
|
b = unhexchar(x[1]);
|
||||||
if (b < 0)
|
if (b < 0)
|
||||||
return b;
|
return b;
|
||||||
} else
|
|
||||||
b = 0;
|
|
||||||
|
|
||||||
*(z++) = (uint8_t) a << 4 | (uint8_t) b;
|
*(z++) = (uint8_t) a << 4 | (uint8_t) b;
|
||||||
}
|
}
|
||||||
|
@@ -116,6 +116,30 @@ int socket_address_parse(SocketAddress *a, const char *s) {
|
|||||||
memcpy(a->sockaddr.un.sun_path+1, s+1, l);
|
memcpy(a->sockaddr.un.sun_path+1, s+1, l);
|
||||||
a->size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
|
a->size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
|
||||||
|
|
||||||
|
} else if (startswith(s, "vsock:")) {
|
||||||
|
/* AF_VSOCK socket in vsock:cid:port notation */
|
||||||
|
const char *cid_start = s + strlen("vsock:");
|
||||||
|
|
||||||
|
e = strchr(cid_start, ':');
|
||||||
|
if (!e)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
r = safe_atou(e+1, &u);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
n = strndupa(cid_start, e - cid_start);
|
||||||
|
if (!isempty(n)) {
|
||||||
|
r = safe_atou(n, &a->sockaddr.vm.svm_cid);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
} else
|
||||||
|
a->sockaddr.vm.svm_cid = VMADDR_CID_ANY;
|
||||||
|
|
||||||
|
a->sockaddr.vm.svm_family = AF_VSOCK;
|
||||||
|
a->sockaddr.vm.svm_port = u;
|
||||||
|
a->size = sizeof(struct sockaddr_vm);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
e = strchr(s, ':');
|
e = strchr(s, ':');
|
||||||
if (e) {
|
if (e) {
|
||||||
@@ -292,6 +316,15 @@ int socket_address_verify(const SocketAddress *a) {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case AF_VSOCK:
|
||||||
|
if (a->size != sizeof(struct sockaddr_vm))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (a->type != SOCK_STREAM && a->type != SOCK_DGRAM)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -EAFNOSUPPORT;
|
return -EAFNOSUPPORT;
|
||||||
}
|
}
|
||||||
@@ -397,6 +430,15 @@ bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AF_VSOCK:
|
||||||
|
if (a->sockaddr.vm.svm_cid != b->sockaddr.vm.svm_cid)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (a->sockaddr.vm.svm_port != b->sockaddr.vm.svm_port)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* Cannot compare, so we assume the addresses are different */
|
/* Cannot compare, so we assume the addresses are different */
|
||||||
return false;
|
return false;
|
||||||
@@ -483,15 +525,27 @@ bool socket_address_matches_fd(const SocketAddress *a, int fd) {
|
|||||||
return socket_address_equal(a, &b);
|
return socket_address_equal(a, &b);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sockaddr_port(const struct sockaddr *_sa) {
|
int sockaddr_port(const struct sockaddr *_sa, unsigned *port) {
|
||||||
union sockaddr_union *sa = (union sockaddr_union*) _sa;
|
union sockaddr_union *sa = (union sockaddr_union*) _sa;
|
||||||
|
|
||||||
assert(sa);
|
assert(sa);
|
||||||
|
|
||||||
if (!IN_SET(sa->sa.sa_family, AF_INET, AF_INET6))
|
switch (sa->sa.sa_family) {
|
||||||
return -EAFNOSUPPORT;
|
case AF_INET:
|
||||||
|
*port = be16toh(sa->in.sin_port);
|
||||||
|
return 0;
|
||||||
|
|
||||||
return be16toh(sa->sa.sa_family == AF_INET6 ? sa->in6.sin6_port : sa->in.sin_port);
|
case AF_INET6:
|
||||||
|
*port = be16toh(sa->in6.sin6_port);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case AF_VSOCK:
|
||||||
|
*port = sa->vm.svm_port;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return -EAFNOSUPPORT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret) {
|
int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret) {
|
||||||
@@ -594,6 +648,18 @@ int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AF_VSOCK:
|
||||||
|
if (include_port)
|
||||||
|
r = asprintf(&p,
|
||||||
|
"vsock:%u:%u",
|
||||||
|
sa->vm.svm_cid,
|
||||||
|
sa->vm.svm_port);
|
||||||
|
else
|
||||||
|
r = asprintf(&p, "vsock:%u", sa->vm.svm_cid);
|
||||||
|
if (r < 0)
|
||||||
|
return -ENOMEM;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
@@ -751,6 +817,9 @@ bool sockaddr_equal(const union sockaddr_union *a, const union sockaddr_union *b
|
|||||||
if (a->sa.sa_family == AF_INET6)
|
if (a->sa.sa_family == AF_INET6)
|
||||||
return memcmp(&a->in6.sin6_addr, &b->in6.sin6_addr, sizeof(a->in6.sin6_addr)) == 0;
|
return memcmp(&a->in6.sin6_addr, &b->in6.sin6_addr, sizeof(a->in6.sin6_addr)) == 0;
|
||||||
|
|
||||||
|
if (a->sa.sa_family == AF_VSOCK)
|
||||||
|
return a->vm.svm_cid == b->vm.svm_cid;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1012,6 +1081,7 @@ fallback:
|
|||||||
return (ssize_t) k;
|
return (ssize_t) k;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0 /* NM_IGNORED */
|
||||||
int flush_accept(int fd) {
|
int flush_accept(int fd) {
|
||||||
|
|
||||||
struct pollfd pollfd = {
|
struct pollfd pollfd = {
|
||||||
@@ -1081,3 +1151,4 @@ int socket_ioctl_fd(void) {
|
|||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
#endif /* NM_IGNORED */
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
#include <linux/if_packet.h>
|
#include <linux/if_packet.h>
|
||||||
|
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
|
#include "missing.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
union sockaddr_union {
|
union sockaddr_union {
|
||||||
@@ -40,6 +41,9 @@ union sockaddr_union {
|
|||||||
struct sockaddr_nl nl;
|
struct sockaddr_nl nl;
|
||||||
struct sockaddr_storage storage;
|
struct sockaddr_storage storage;
|
||||||
struct sockaddr_ll ll;
|
struct sockaddr_ll ll;
|
||||||
|
#if 0 /* NM_IGNORED */
|
||||||
|
struct sockaddr_vm vm;
|
||||||
|
#endif /* NM_IGNORED */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct SocketAddress {
|
typedef struct SocketAddress {
|
||||||
@@ -100,7 +104,7 @@ const char* socket_address_get_path(const SocketAddress *a);
|
|||||||
|
|
||||||
bool socket_ipv6_is_supported(void);
|
bool socket_ipv6_is_supported(void);
|
||||||
|
|
||||||
int sockaddr_port(const struct sockaddr *_sa) _pure_;
|
int sockaddr_port(const struct sockaddr *_sa, unsigned *port);
|
||||||
|
|
||||||
int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret);
|
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);
|
int getpeername_pretty(int fd, bool include_port, char **ret);
|
||||||
|
Reference in New Issue
Block a user