Commit 5cde6096 authored by Johannes Berg's avatar Johannes Berg
Browse files

um: generalize os_rcv_fd

Change os_rcv_fd() to os_rcv_fd_msg() that can more generally
receive any number of FDs in any kind of message.

Link: https://patch.msgid.link/20240702192118.40b78b2bfe4e.Ic6ec12d72630e5bcae1e597d6bd5c6f29f441563@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 6555acde
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -45,15 +45,17 @@ struct connection {
static irqreturn_t pipe_interrupt(int irq, void *data)
{
	struct connection *conn = data;
	int fd;
	int n_fds = 1, fd = -1;
	ssize_t ret;

	fd = os_rcv_fd(conn->socket[0], &conn->helper_pid);
	if (fd < 0) {
		if (fd == -EAGAIN)
	ret = os_rcv_fd_msg(conn->socket[0], &fd, n_fds, &conn->helper_pid,
			    sizeof(conn->helper_pid));
	if (ret != sizeof(conn->helper_pid)) {
		if (ret == -EAGAIN)
			return IRQ_NONE;

		printk(KERN_ERR "pipe_interrupt : os_rcv_fd returned %d\n",
		       -fd);
		printk(KERN_ERR "pipe_interrupt : os_rcv_fd_msg returned %zd\n",
		       ret);
		os_close_file(conn->fd);
	}

+1 −1
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ static int xterm_open(int input, int output, int primary, void *d,
	new = xterm_fd(fd, &data->helper_pid);
	if (new < 0) {
		err = new;
		printk(UM_KERN_ERR "xterm_open : os_rcv_fd failed, err = %d\n",
		printk(UM_KERN_ERR "xterm_open : xterm_fd failed, err = %d\n",
		       -err);
		goto out_kill;
	}
+10 −3
Original line number Diff line number Diff line
@@ -21,12 +21,19 @@ struct xterm_wait {
static irqreturn_t xterm_interrupt(int irq, void *data)
{
	struct xterm_wait *xterm = data;
	int fd;
	int fd = -1, n_fds = 1;
	ssize_t ret;

	fd = os_rcv_fd(xterm->fd, &xterm->pid);
	if (fd == -EAGAIN)
	ret = os_rcv_fd_msg(xterm->fd, &fd, n_fds,
			    &xterm->pid, sizeof(xterm->pid));
	if (ret == -EAGAIN)
		return IRQ_NONE;

	if (ret < 0)
		fd = ret;
	else if (ret != sizeof(xterm->pid))
		fd = -EMSGSIZE;

	xterm->new_fd = fd;
	complete(&xterm->ready);

+2 −1
Original line number Diff line number Diff line
@@ -165,7 +165,8 @@ extern int os_create_unix_socket(const char *file, int len, int close_on_exec);
extern int os_shutdown_socket(int fd, int r, int w);
extern int os_dup_file(int fd);
extern void os_close_file(int fd);
extern int os_rcv_fd(int fd, int *helper_pid_out);
ssize_t os_rcv_fd_msg(int fd, int *fds, unsigned int n_fds,
		      void *data, size_t data_len);
extern int os_connect_socket(const char *name);
extern int os_file_type(char *file);
extern int os_file_mode(const char *file, struct openflags *mode_out);
+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ EXPORT_SYMBOL(os_shutdown_socket);
EXPORT_SYMBOL(os_create_unix_socket);
EXPORT_SYMBOL(os_connect_socket);
EXPORT_SYMBOL(os_accept_connection);
EXPORT_SYMBOL(os_rcv_fd);
EXPORT_SYMBOL(os_rcv_fd_msg);
EXPORT_SYMBOL(run_helper);
EXPORT_SYMBOL(os_major);
EXPORT_SYMBOL(os_minor);
Loading