~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/um/drivers/xterm_kern.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 /* 
  3  * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  4  */
  5 
  6 #include <linux/slab.h>
  7 #include <linux/completion.h>
  8 #include <linux/irqreturn.h>
  9 #include <asm/irq.h>
 10 #include <irq_kern.h>
 11 #include <os.h>
 12 #include "xterm.h"
 13 
 14 struct xterm_wait {
 15         struct completion ready;
 16         int fd;
 17         int pid;
 18         int new_fd;
 19 };
 20 
 21 static irqreturn_t xterm_interrupt(int irq, void *data)
 22 {
 23         struct xterm_wait *xterm = data;
 24         int fd = -1, n_fds = 1;
 25         ssize_t ret;
 26 
 27         ret = os_rcv_fd_msg(xterm->fd, &fd, n_fds,
 28                             &xterm->pid, sizeof(xterm->pid));
 29         if (ret == -EAGAIN)
 30                 return IRQ_NONE;
 31 
 32         if (ret < 0)
 33                 fd = ret;
 34         else if (ret != sizeof(xterm->pid))
 35                 fd = -EMSGSIZE;
 36 
 37         xterm->new_fd = fd;
 38         complete(&xterm->ready);
 39 
 40         return IRQ_HANDLED;
 41 }
 42 
 43 int xterm_fd(int socket, int *pid_out)
 44 {
 45         struct xterm_wait *data;
 46         int err, ret;
 47 
 48         data = kmalloc(sizeof(*data), GFP_KERNEL);
 49         if (data == NULL) {
 50                 printk(KERN_ERR "xterm_fd : failed to allocate xterm_wait\n");
 51                 return -ENOMEM;
 52         }
 53 
 54         /* This is a locked semaphore... */
 55         *data = ((struct xterm_wait) { .fd              = socket,
 56                                        .pid             = -1,
 57                                        .new_fd          = -1 });
 58         init_completion(&data->ready);
 59 
 60         err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt,
 61                              IRQF_SHARED, "xterm", data);
 62         if (err < 0) {
 63                 printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, "
 64                        "err = %d\n",  err);
 65                 ret = err;
 66                 goto out;
 67         }
 68 
 69         /* ... so here we wait for an xterm interrupt.
 70          *
 71          * XXX Note, if the xterm doesn't work for some reason (eg. DISPLAY
 72          * isn't set) this will hang... */
 73         wait_for_completion(&data->ready);
 74 
 75         um_free_irq(XTERM_IRQ, data);
 76 
 77         ret = data->new_fd;
 78         *pid_out = data->pid;
 79  out:
 80         kfree(data);
 81 
 82         return ret;
 83 }
 84 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php