Mon Jan 10 04:41:27 2011 UTC ()
add sigqueue


(christos)
diff -r1.203 -r1.204 src/lib/libc/sys/Makefile.inc
diff -r0 -r1.1 src/lib/libc/sys/sigqueue.2
diff -r0 -r1.1 src/lib/libc/sys/sigqueue.c

cvs diff -r1.203 -r1.204 src/lib/libc/sys/Makefile.inc (expand / switch to unified diff)

--- src/lib/libc/sys/Makefile.inc 2010/08/06 05:26:35 1.203
+++ src/lib/libc/sys/Makefile.inc 2011/01/10 04:41:27 1.204
@@ -1,42 +1,42 @@ @@ -1,42 +1,42 @@
1# $NetBSD: Makefile.inc,v 1.203 2010/08/06 05:26:35 christos Exp $ 1# $NetBSD: Makefile.inc,v 1.204 2011/01/10 04:41:27 christos Exp $
2# @(#)Makefile.inc 8.3 (Berkeley) 10/24/94 2# @(#)Makefile.inc 8.3 (Berkeley) 10/24/94
3 3
4# sys sources 4# sys sources
5.PATH: ${ARCHDIR}/sys ${.CURDIR}/sys 5.PATH: ${ARCHDIR}/sys ${.CURDIR}/sys
6 6
7# modules with non-default implementations on at least one architecture: 7# modules with non-default implementations on at least one architecture:
8SRCS+= __clone.S __vfork14.S brk.S exect.S fork.S pipe.S \ 8SRCS+= __clone.S __vfork14.S brk.S exect.S fork.S pipe.S \
9 getcontext.S \ 9 getcontext.S \
10 ptrace.S sbrk.S shmat.S \ 10 ptrace.S sbrk.S shmat.S \
11 syscall.S __syscall.S __clone.S cerror.S 11 syscall.S __syscall.S __clone.S cerror.S
12 12
13# other sources shared with the kernel, used in syscalls 13# other sources shared with the kernel, used in syscalls
14SRCS+= cpuset.c 14SRCS+= cpuset.c
15 15
16_LSRC+= Lint___clone.c Lint___vfork14.c Lint_brk.c Lint_clone.c \ 16_LSRC+= Lint___clone.c Lint___vfork14.c Lint_brk.c Lint_clone.c \
17 Lint_getcontext.c Lint_exect.c Lint_pipe.c Lint_ptrace.c \ 17 Lint_getcontext.c Lint_exect.c Lint_pipe.c Lint_ptrace.c \
18 Lint_sbrk.c Lint___sigaction14.c Lint_syscall.c Lint___syscall.c \ 18 Lint_sbrk.c Lint___sigaction14.c Lint_syscall.c Lint___syscall.c \
19 LintSysNormal.c LintSysNoerr.c LintSysPseudoNoerr.c 19 LintSysNormal.c LintSysNoerr.c LintSysPseudoNoerr.c
20 20
21.if ${MKLINT} != "no" 21.if ${MKLINT} != "no"
22LSRCS+= ${_LSRC} 22LSRCS+= ${_LSRC}
23DPSRCS+= ${_LSRC:MLintSys*.c} 23DPSRCS+= ${_LSRC:MLintSys*.c}
24CLEANFILES+= ${_LSRC:MLintSys*.c} 24CLEANFILES+= ${_LSRC:MLintSys*.c}
25.endif 25.endif
26 26
27# glue to offer userland wrappers for some syscalls 27# glue to offer userland wrappers for some syscalls
28SRCS+= posix_fadvise.c posix_madvise.c sched.c sigtimedwait.c sigwait.c \ 28SRCS+= posix_fadvise.c posix_madvise.c sched.c sigqueue.c sigtimedwait.c \
29 sigwaitinfo.c statvfs.c swapon.c semctl.c 29 sigwait.c sigwaitinfo.c statvfs.c swapon.c semctl.c
30 30
31# glue to provide compatibility between GCC 1.X and 2.X and for compat 31# glue to provide compatibility between GCC 1.X and 2.X and for compat
32# with old syscall interfaces. 32# with old syscall interfaces.
33GLUE+= ftruncate.c lseek.c mmap.c pread.c preadv.c pwrite.c \ 33GLUE+= ftruncate.c lseek.c mmap.c pread.c preadv.c pwrite.c \
34 pwritev.c truncate.c ntp_adjtime.c 34 pwritev.c truncate.c ntp_adjtime.c
35 35
36GLUE50+= adjtime.c clock_settime.c settimeofday.c 36GLUE50+= adjtime.c clock_settime.c settimeofday.c
37 37
38# 'glue' files might .c or .S depending on the architecture 38# 'glue' files might .c or .S depending on the architecture
39.for glue in ${GLUE} 39.for glue in ${GLUE}
40. if exists(${glue:.c=.S}) 40. if exists(${glue:.c=.S})
41# Build the ASM glue file 41# Build the ASM glue file
42SRCS+=${glue:.c=.S} 42SRCS+=${glue:.c=.S}
@@ -109,26 +109,27 @@ ASM= access.S acct.S \ @@ -109,26 +109,27 @@ ASM= access.S acct.S \
109 nfssvc.S __ntp_gettime50.S \ 109 nfssvc.S __ntp_gettime50.S \
110 pathconf.S pmc_get_info.S pmc_control.S __posix_chown.S \ 110 pathconf.S pmc_get_info.S pmc_control.S __posix_chown.S \
111 __posix_fchown.S __posix_lchown.S __posix_rename.S profil.S \ 111 __posix_fchown.S __posix_lchown.S __posix_rename.S profil.S \
112 quotactl.S \ 112 quotactl.S \
113 rasctl.S reboot.S recvfrom.S recvmsg.S rename.S revoke.S \ 113 rasctl.S reboot.S recvfrom.S recvmsg.S rename.S revoke.S \
114 rmdir.S \ 114 rmdir.S \
115 sa_register.S sa_stacks.S sa_enable.S sa_setconcurrency.S sa_yield.S \ 115 sa_register.S sa_stacks.S sa_enable.S sa_setconcurrency.S sa_yield.S \
116 sa_preempt.S semconfig.S semget.S semop.S \ 116 sa_preempt.S semconfig.S semget.S semop.S \
117 sendmsg.S sendto.S setegid.S setcontext.S seteuid.S setgid.S \ 117 sendmsg.S sendto.S setegid.S setcontext.S seteuid.S setgid.S \
118 setgroups.S __setitimer50.S __setlogin.S setpgid.S \ 118 setgroups.S __setitimer50.S __setlogin.S setpgid.S \
119 setpriority.S \ 119 setpriority.S \
120 setregid.S setreuid.S setrlimit.S setsid.S setsockopt.S \ 120 setregid.S setreuid.S setrlimit.S setsid.S setsockopt.S \
121 setuid.S __shmctl50.S shmdt.S shmget.S shutdown.S \ 121 setuid.S __shmctl50.S shmdt.S shmget.S shutdown.S \
 122 sigqueueinfo.S \
122 __sigaltstack14.S __sigpending14.S __sigaction_sigtramp.S \ 123 __sigaltstack14.S __sigpending14.S __sigaction_sigtramp.S \
123 ____sigtimedwait50.S __socket30.S socketpair.S __stat50.S \ 124 ____sigtimedwait50.S __socket30.S socketpair.S __stat50.S \
124 statvfs1.S swapctl.S symlink.S __sysctl.S \ 125 statvfs1.S swapctl.S symlink.S __sysctl.S \
125 timer_create.S timer_delete.S __timer_gettime50.S timer_getoverrun.S \ 126 timer_create.S timer_delete.S __timer_gettime50.S timer_getoverrun.S \
126 ____semctl50.S __timer_settime50.S \ 127 ____semctl50.S __timer_settime50.S \
127 umask.S undelete.S unlink.S unmount.S __utimes50.S utrace.S uuidgen.S \ 128 umask.S undelete.S unlink.S unmount.S __utimes50.S utrace.S uuidgen.S \
128 vadvise.S 129 vadvise.S
129 130
130# modules with potentially non default implementations 131# modules with potentially non default implementations
131ASM_MD= _lwp_getprivate.S mremap.S  132ASM_MD= _lwp_getprivate.S mremap.S
132 133
133.for f in ${ASM_MD} 134.for f in ${ASM_MD}
134. if !exists(${f}) 135. if !exists(${f})
@@ -220,27 +221,27 @@ MAN+= accept.2 access.2 acct.2 adjtime.2 @@ -220,27 +221,27 @@ MAN+= accept.2 access.2 acct.2 adjtime.2
220 _lwp_park.2 _lwp_unpark.2 _lwp_unpark_all.2 \ 221 _lwp_park.2 _lwp_unpark.2 _lwp_unpark_all.2 \
221 mkdir.2 mkfifo.2 mknod.2 \ 222 mkdir.2 mkfifo.2 mknod.2 \
222 madvise.2 mincore.2 minherit.2 mlock.2 mlockall.2 mmap.2 modctl.2 \ 223 madvise.2 mincore.2 minherit.2 mlock.2 mlockall.2 mmap.2 modctl.2 \
223 mount.2 \ 224 mount.2 \
224 mprotect.2 mremap.2 msgctl.2 msgget.2 msgrcv.2 msgsnd.2 msync.2 \ 225 mprotect.2 mremap.2 msgctl.2 msgget.2 msgrcv.2 msgsnd.2 msync.2 \
225 munmap.2 nanosleep.2 nfssvc.2 ntp_adjtime.2 open.2 pathconf.2 pipe.2 \ 226 munmap.2 nanosleep.2 nfssvc.2 ntp_adjtime.2 open.2 pathconf.2 pipe.2 \
226 pmc_control.2 poll.2 posix_fadvise.2 profil.2 ptrace.2 quotactl.2 \ 227 pmc_control.2 poll.2 posix_fadvise.2 profil.2 ptrace.2 quotactl.2 \
227 rasctl.2 read.2 readlink.2 \ 228 rasctl.2 read.2 readlink.2 \
228 reboot.2 recv.2 rename.2 revoke.2 rmdir.2 \ 229 reboot.2 recv.2 rename.2 revoke.2 rmdir.2 \
229 select.2 semctl.2 \ 230 select.2 semctl.2 \
230 semget.2 semop.2 send.2 setgroups.2 setpgid.2 setregid.2 \ 231 semget.2 semop.2 send.2 setgroups.2 setpgid.2 setregid.2 \
231 setreuid.2 setsid.2 setuid.2 shmat.2 shmctl.2 shmget.2 \ 232 setreuid.2 setsid.2 setuid.2 shmat.2 shmctl.2 shmget.2 \
232 shutdown.2 sigaction.2 sigaltstack.2 sigpending.2 \ 233 shutdown.2 sigaction.2 sigaltstack.2 sigpending.2 \
233 sigprocmask.2 sigstack.2 sigsuspend.2 sigtimedwait.2 \ 234 sigprocmask.2 sigqueue.2 sigstack.2 sigsuspend.2 sigtimedwait.2 \
234 socket.2 \ 235 socket.2 \
235 socketpair.2 stat.2 statvfs.2 swapctl.2 swapon.3 symlink.2 \ 236 socketpair.2 stat.2 statvfs.2 swapctl.2 swapon.3 symlink.2 \
236 sync.2 sysarch.2 syscall.2 timer_create.2 timer_delete.2 \ 237 sync.2 sysarch.2 syscall.2 timer_create.2 timer_delete.2 \
237 timer_settime.2 truncate.2 umask.2 undelete.2 \ 238 timer_settime.2 truncate.2 umask.2 undelete.2 \
238 unlink.2 utimes.2 utrace.2 uuidgen.2 vfork.2 wait.2 write.2 239 unlink.2 utimes.2 utrace.2 uuidgen.2 vfork.2 wait.2 write.2
239 240
240MLINKS+=_exit.2 _Exit.2 241MLINKS+=_exit.2 _Exit.2
241MLINKS+=brk.2 sbrk.2 242MLINKS+=brk.2 sbrk.2
242MLINKS+=clone.2 __clone.2 243MLINKS+=clone.2 __clone.2
243MLINKS+=dup.2 dup2.2 244MLINKS+=dup.2 dup2.2
244MLINKS+=chdir.2 fchdir.2 245MLINKS+=chdir.2 fchdir.2
245MLINKS+=chflags.2 fchflags.2 chflags.2 lchflags.2 246MLINKS+=chflags.2 fchflags.2 chflags.2 lchflags.2
246MLINKS+=chmod.2 fchmod.2 chmod.2 lchmod.2 247MLINKS+=chmod.2 fchmod.2 chmod.2 lchmod.2
@@ -285,24 +286,25 @@ MLINKS+=mlockall.2 munlockall.2 @@ -285,24 +286,25 @@ MLINKS+=mlockall.2 munlockall.2
285MLINKS+=mount.2 unmount.2 286MLINKS+=mount.2 unmount.2
286MLINKS+=ntp_adjtime.2 ntp_gettime.2 287MLINKS+=ntp_adjtime.2 ntp_gettime.2
287MLINKS+=pathconf.2 fpathconf.2 288MLINKS+=pathconf.2 fpathconf.2
288MLINKS+=pmc_control.2 pmc_get_info.2 289MLINKS+=pmc_control.2 pmc_get_info.2
289MLINKS+=poll.2 pollts.2 290MLINKS+=poll.2 pollts.2
290MLINKS+=read.2 readv.2 read.2 pread.2 read.2 preadv.2 291MLINKS+=read.2 readv.2 read.2 pread.2 read.2 preadv.2
291MLINKS+=recv.2 recvfrom.2 recv.2 recvmsg.2 292MLINKS+=recv.2 recvfrom.2 recv.2 recvmsg.2
292MLINKS+=select.2 pselect.2 293MLINKS+=select.2 pselect.2
293MLINKS+=send.2 sendmsg.2 send.2 sendto.2 294MLINKS+=send.2 sendmsg.2 send.2 sendto.2
294MLINKS+=setpgid.2 setpgrp.2 295MLINKS+=setpgid.2 setpgrp.2
295MLINKS+=setuid.2 setegid.2 setuid.2 seteuid.2 setuid.2 setgid.2 296MLINKS+=setuid.2 setegid.2 setuid.2 seteuid.2 setuid.2 setgid.2
296MLINKS+=shmat.2 shmdt.2 297MLINKS+=shmat.2 shmdt.2
297MLINKS+=timer_settime.2 timer_gettime.2 timer_settime.2 timer_getoverrun.2 298MLINKS+=timer_settime.2 timer_gettime.2 timer_settime.2 timer_getoverrun.2
 299MLINKS+=sigqueue.2 sigqueueinfo.2
298MLINKS+=sigtimedwait.2 sigwaitinfo.2 300MLINKS+=sigtimedwait.2 sigwaitinfo.2
299MLINKS+=sigtimedwait.2 sigwait.2 301MLINKS+=sigtimedwait.2 sigwait.2
300MLINKS+=stat.2 fstat.2 stat.2 lstat.2 302MLINKS+=stat.2 fstat.2 stat.2 lstat.2
301MLINKS+=statvfs.2 fstatvfs.2 303MLINKS+=statvfs.2 fstatvfs.2
302MLINKS+=statvfs.2 statvfs1.2 304MLINKS+=statvfs.2 statvfs1.2
303MLINKS+=statvfs.2 fstatvfs1.2 305MLINKS+=statvfs.2 fstatvfs1.2
304MLINKS+=syscall.2 __syscall.2 306MLINKS+=syscall.2 __syscall.2
305MLINKS+=truncate.2 ftruncate.2 307MLINKS+=truncate.2 ftruncate.2
306MLINKS+=utimes.2 futimes.2 utimes.2 lutimes.2 308MLINKS+=utimes.2 futimes.2 utimes.2 lutimes.2
307MLINKS+=wait.2 wait3.2 wait.2 wait4.2 wait.2 waitpid.2 309MLINKS+=wait.2 wait3.2 wait.2 wait4.2 wait.2 waitpid.2
308MLINKS+=write.2 writev.2 write.2 pwrite.2 write.2 pwritev.2 310MLINKS+=write.2 writev.2 write.2 pwrite.2 write.2 pwritev.2

File Added: src/lib/libc/sys/sigqueue.2
.\" $NetBSD: sigqueue.2,v 1.1 2011/01/10 04:41:27 christos Exp $
.\" Copyright (c) 2005 David Xu <davidxu@FreeBSD.org>
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice(s), this list of conditions and the following disclaimer as
.\"    the first lines of this file unmodified other than the possible
.\"    addition of one or more copyright notices.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice(s), this list of conditions and the following disclaimer in
.\"    the documentation and/or other materials provided with the
.\"    distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE
.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
.\" OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.\" $FreeBSD: src/lib/libc/sys/sigqueue.2,v 1.8 2006/09/17 21:27:34 ru Exp $
.\"
.Dd January 9, 2011
.Dt SIGQUEUE 2
.Os
.Sh NAME
.Nm sigqueue
.Nd "queue a signal to a process (REALTIME)"
.Sh LIBRARY
.Lb libc
.Sh SYNOPSIS
.In signal.h
.Ft int
.Fn sigqueue "pid_t pid" "int signo" "const union sigval value"
.Ft int
.Fn sigqueueinfo "pid_t pid" "const siginfo_t *info"
.Sh DESCRIPTION
The
.Fn sigqueue
system call causes the signal specified by
.Fa signo
to be sent with the value specified by
.Fa value
to the process specified by
.Fa pid .
If
.Fa signo
is zero (the null signal), error checking is performed but
no signal is actually sent.
The null signal can be used to check the
validity of PID.
.Pp
The conditions required for a process to have permission to queue a
signal to another process are the same as for the
.Xr kill 2
system call.
The
.Fn sigqueue
system call queues a signal to a single process specified by the
.Fa pid
argument.
.Pp
The
.Fn sigqueue
system call is implemented using
.Fn sigqueueinfo
and passing the appropriate information in the
.Fa info
argument.
.Pp
The
.Fn sigqueue
system call returns immediately.
If the resources were
available to queue the signal, the signal will be queued and sent to
the receiving process.
.Pp
If the value of
.Fa pid
causes
.Fa signo
to be generated for the sending process, and if
.Fa signo
is not blocked for the calling thread and if no other thread has
.Fa signo
unblocked or is waiting in a
.Fn sigwait
system call for
.Fa signo ,
either
.Fa signo
or at least the pending, unblocked signal will be delivered to the
calling thread before
.Fn sigqueue
returns.
Should any multiple pending signals in the range
.Dv SIGRTMIN
to
.Dv SIGRTMAX
be selected for delivery, it is the lowest numbered
one.
The selection order between realtime and non-realtime signals, or
between multiple pending non-realtime signals, is unspecified.
.Sh RETURN VALUES
.Rv -std
.Sh ERRORS
The
.Fn sigqueue
system call
will fail if:
.Bl -tag -width Er
.It Bq Er EAGAIN
No resources are available to queue the signal.
The process has already
queued
.Brq Dv SIGQUEUE_MAX
signals that are still pending at the receiver(s),
or a system-wide resource limit has been exceeded.
.It Bq Er EINVAL
The value of the
.Fa signo
argument is an invalid or unsupported signal number.
.It Bq Er EEPERM
The process does not have the appropriate privilege to send the signal
to the receiving process.
.It Bq Er ESRCH
The process
.Fa pid
does not exist.
.El
.Sh SEE ALSO
.Xr sigaction 2 ,
.Xr sigpending 2 ,
.Xr sigqueue 2 ,
.Xr sigsuspend 2 ,
.Xr sigtimedwait 2 ,
.Xr sigwait 2 ,
.Xr sigwaitinfo 2 ,
.Xr pause 3 ,
.Xr pthread_sigmask 3 ,
.Xr siginfo 3
.Sh STANDARDS
The
.Fn sigqueue
system call conforms to
.St -p1003.1-2004
.Sh HISTORY
Support for
.Tn POSIX
realtime signal queue first appeared in
.Nx 6.0 .

File Added: src/lib/libc/sys/sigqueue.c
/* $NetBSD: sigqueue.c,v 1.1 2011/01/10 04:41:27 christos Exp $ */

/*-
 * Copyright (c) 2011 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Christos Zoulas.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *        This product includes software developed by the NetBSD
 *        Foundation, Inc. and its contributors.
 * 4. Neither the name of The NetBSD Foundation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: sigqueue.c,v 1.1 2011/01/10 04:41:27 christos Exp $");
#endif /* LIBC_SCCS and not lint */

#include "namespace.h"
#include <sys/types.h>
#include <sys/syscall.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

/*
 * This is wrapper around sigqueueinfo(2), providing a sigqueue()
 * implementation for userland.
 */
int
sigqueue(pid_t pid, int signo, const union sigval value)
{
	siginfo_t info;

	(void)memset(&info, 0, sizeof(info));

	info.si_signo = signo;
	info.si_code = SI_QUEUE;
	info.si_pid = getpid();
	info.si_uid = geteuid();
	info.si_value = value;

	return sigqueueinfo(pid, &info);
}