tools/testing/selftests/net/af_unix/scm_rights.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/net/af_unix/scm_rights.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/net/af_unix/scm_rights.c
Extension
.c
Size
7085 bytes
Lines
382
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

if (variant->disabled) {
			ret = setsockopt(self->fd[i], SOL_SOCKET, SO_PASSRIGHTS,
					 &(int){0}, sizeof(int));
			ASSERT_EQ(0, ret);
		}

		addrlen = sizeof(addr);
		ret = getsockname(self->fd[i], (struct sockaddr *)&addr, &addrlen);
		ASSERT_EQ(0, ret);

		self->fd[i + 1] = socket(AF_UNIX, SOCK_STREAM, 0);
		ASSERT_LE(0, self->fd[i + 1]);

		ret = connect(self->fd[i + 1], (struct sockaddr *)&addr, addrlen);
		ASSERT_EQ(0, ret);
	}
}

static void create_socketpairs(struct __test_metadata *_metadata,
			       FIXTURE_DATA(scm_rights) *self,
			       const FIXTURE_VARIANT(scm_rights) *variant,
			       int n)
{
	int i, ret;

	ASSERT_GE(sizeof(self->fd) / sizeof(int), n);

	for (i = 0; i < n * 2; i += 2) {
		ret = socketpair(AF_UNIX, variant->type, 0, self->fd + i);
		ASSERT_EQ(0, ret);

		if (variant->disabled) {
			ret = setsockopt(self->fd[i], SOL_SOCKET, SO_PASSRIGHTS,
					 &(int){0}, sizeof(int));
			ASSERT_EQ(0, ret);
		}
	}
}

static void __create_sockets(struct __test_metadata *_metadata,
			     FIXTURE_DATA(scm_rights) *self,
			     const FIXTURE_VARIANT(scm_rights) *variant,
			     int n)
{
	ASSERT_LE(n * 2, sizeof(self->fd) / sizeof(self->fd[0]));

	if (variant->test_listener)
		create_listeners(_metadata, self, variant, n);
	else
		create_socketpairs(_metadata, self, variant, n);
}

static void __close_sockets(struct __test_metadata *_metadata,
			    FIXTURE_DATA(scm_rights) *self,
			    int n)
{
	int i, ret;

	ASSERT_GE(sizeof(self->fd) / sizeof(int), n);

	for (i = 0; i < n * 2; i++) {
		ret = close(self->fd[i]);
		ASSERT_EQ(0, ret);
	}
}

void __send_fd(struct __test_metadata *_metadata,
	       const FIXTURE_DATA(scm_rights) *self,
	       const FIXTURE_VARIANT(scm_rights) *variant,
	       int inflight, int receiver)
{
#define MSG "x"
#define MSGLEN 1
	int fds[2] = {
		self->fd[inflight * 2],
		self->fd[inflight * 2],
	};
	char cmsg_buf[CMSG_SPACE(sizeof(fds))];
	struct iovec iov = {
		.iov_base = MSG,
		.iov_len = MSGLEN,
	};
	struct msghdr msg = {
		.msg_name = NULL,
		.msg_namelen = 0,
		.msg_iov = &iov,
		.msg_iovlen = 1,
		.msg_control = cmsg_buf,
		.msg_controllen = sizeof(cmsg_buf),
	};

Annotation

Implementation Notes