21 #include <linux/poll.h>
24 #include <linux/sched.h>
25 #include <linux/slab.h>
26 #include <linux/kernel.h>
27 #include <linux/signal.h>
28 #include <linux/list.h>
30 #include <linux/signalfd.h>
41 if (
likely(!waitqueue_active(wqh)))
63 poll_wait(file, &
current->sighand->signalfd_wqh, wait);
65 spin_lock_irq(&
current->sighand->siglock);
70 spin_unlock_irq(&
current->sighand->siglock);
99 err |=
__put_user(kinfo->si_pid, &uinfo->ssi_pid);
100 err |=
__put_user(kinfo->si_uid, &uinfo->ssi_uid);
103 err |=
__put_user(kinfo->si_tid, &uinfo->ssi_tid);
104 err |=
__put_user(kinfo->si_overrun, &uinfo->ssi_overrun);
105 err |=
__put_user((
long) kinfo->si_ptr, &uinfo->ssi_ptr);
106 err |=
__put_user(kinfo->si_int, &uinfo->ssi_int);
109 err |=
__put_user(kinfo->si_band, &uinfo->ssi_band);
110 err |=
__put_user(kinfo->si_fd, &uinfo->ssi_fd);
113 err |=
__put_user((
long) kinfo->si_addr, &uinfo->ssi_addr);
114 #ifdef __ARCH_SI_TRAPNO
115 err |=
__put_user(kinfo->si_trapno, &uinfo->ssi_trapno);
125 &uinfo->ssi_addr_lsb);
129 err |=
__put_user(kinfo->si_pid, &uinfo->ssi_pid);
130 err |=
__put_user(kinfo->si_uid, &uinfo->ssi_uid);
131 err |=
__put_user(kinfo->si_status, &uinfo->ssi_status);
132 err |=
__put_user(kinfo->si_utime, &uinfo->ssi_utime);
133 err |=
__put_user(kinfo->si_stime, &uinfo->ssi_stime);
137 err |=
__put_user(kinfo->si_pid, &uinfo->ssi_pid);
138 err |=
__put_user(kinfo->si_uid, &uinfo->ssi_uid);
139 err |=
__put_user((
long) kinfo->si_ptr, &uinfo->ssi_ptr);
140 err |=
__put_user(kinfo->si_int, &uinfo->ssi_int);
146 err |=
__put_user(kinfo->si_pid, &uinfo->ssi_pid);
147 err |=
__put_user(kinfo->si_uid, &uinfo->ssi_uid);
148 err |=
__put_user((
long) kinfo->si_ptr, &uinfo->ssi_ptr);
149 err |=
__put_user(kinfo->si_int, &uinfo->ssi_int);
153 return err ? -
EFAULT:
sizeof(*uinfo);
162 spin_lock_irq(&
current->sighand->siglock);
170 spin_unlock_irq(&
current->sighand->siglock);
184 spin_unlock_irq(&
current->sighand->siglock);
186 spin_lock_irq(&
current->sighand->siglock);
188 spin_unlock_irq(&
current->sighand->siglock);
201 static ssize_t signalfd_read(
struct file *file,
char __user *
buf,
size_t count,
216 ret = signalfd_dequeue(ctx, &info, nonblock);
219 ret = signalfd_copyinfo(siginfo, &info);
227 return total ? total:
ret;
231 .release = signalfd_release,
232 .poll = signalfd_poll,
233 .read = signalfd_read,
238 size_t, sizemask,
int,
flags)
272 struct fd f = fdget(ufd);
275 ctx = f.
file->private_data;
276 if (f.
file->f_op != &signalfd_fops) {
280 spin_lock_irq(&
current->sighand->siglock);
282 spin_unlock_irq(&
current->sighand->siglock);