Merge with Linux 2.5.48.
[linux-2.6/linux-mips.git] / arch / um / drivers / xterm_kern.c
blob28b2835bcb7c2817e281e13e9baa2d2e7e467747
1 /*
2 * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
3 * Licensed under the GPL
4 */
6 #include "linux/errno.h"
7 #include "linux/slab.h"
8 #include "asm/semaphore.h"
9 #include "asm/irq.h"
10 #include "irq_user.h"
11 #include "kern_util.h"
12 #include "os.h"
13 #include "xterm.h"
15 struct xterm_wait {
16 struct semaphore sem;
17 int fd;
18 int pid;
19 int new_fd;
22 static void xterm_interrupt(int irq, void *data, struct pt_regs *regs)
24 struct xterm_wait *xterm = data;
26 xterm->new_fd = os_rcv_fd(xterm->fd, &xterm->pid);
27 if(xterm->new_fd == -EAGAIN)
28 return;
30 up(&xterm->sem);
33 int xterm_fd(int socket, int *pid_out)
35 struct xterm_wait *data;
36 int err, ret;
38 data = kmalloc(sizeof(*data), GFP_KERNEL);
39 if(data == NULL){
40 printk(KERN_ERR "xterm_fd - failed to allocate semaphore\n");
41 return(-ENOMEM);
43 *data = ((struct xterm_wait)
44 { sem : __SEMAPHORE_INITIALIZER(data->sem, 0),
45 fd : socket,
46 pid : -1,
47 new_fd : -1 });
49 err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt,
50 SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM,
51 "xterm", data);
52 if(err){
53 printk(KERN_ERR "Failed to get IRQ for xterm, err = %d\n",
54 err);
55 return(err);
57 down(&data->sem);
59 free_irq(XTERM_IRQ, data);
61 ret = data->new_fd;
62 *pid_out = data->pid;
63 kfree(data);
65 return(ret);
69 * Overrides for Emacs so that we follow Linus's tabbing style.
70 * Emacs will notice this stuff at the end of the file and automatically
71 * adjust the settings for this buffer only. This must remain at the end
72 * of the file.
73 * ---------------------------------------------------------------------------
74 * Local variables:
75 * c-file-style: "linux"
76 * End: