tree-wide: introduce new SOCKADDR_UN_LEN() macro, and use it everywhere
The macro determines the right length of a AF_UNIX "struct sockaddr_un" to pass to connect() or bind(). It automatically figures out if the socket refers to an abstract namespace socket, or a socket in the file system, and properly handles the full length of the path field. This macro is not only safer, but also simpler to use, than the usual offsetof() + strlen() logic.
This commit is contained in:
@@ -343,6 +343,21 @@ static void test_sockaddr_equal(void) {
|
||||
assert_se(!sockaddr_equal(&b, &c));
|
||||
}
|
||||
|
||||
static void test_sockaddr_un_len(void) {
|
||||
static const struct sockaddr_un fs = {
|
||||
.sun_family = AF_UNIX,
|
||||
.sun_path = "/foo/bar/waldo",
|
||||
};
|
||||
|
||||
static const struct sockaddr_un abstract = {
|
||||
.sun_family = AF_UNIX,
|
||||
.sun_path = "\0foobar",
|
||||
};
|
||||
|
||||
assert_se(SOCKADDR_UN_LEN(fs) == offsetof(struct sockaddr_un, sun_path) + strlen(fs.sun_path));
|
||||
assert_se(SOCKADDR_UN_LEN(abstract) == offsetof(struct sockaddr_un, sun_path) + 1 + strlen(abstract.sun_path + 1));
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
log_set_max_level(LOG_DEBUG);
|
||||
@@ -363,5 +378,7 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
test_sockaddr_equal();
|
||||
|
||||
test_sockaddr_un_len();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user