1214501Srpaulo/*
2214501Srpaulo * Copyright (c) 1997 John Birrell <jb@cimlogic.com.au>.
3214501Srpaulo * All rights reserved.
4214501Srpaulo *
5214501Srpaulo * Redistribution and use in source and binary forms, with or without
6252190Srpaulo * modification, are permitted provided that the following conditions
7252190Srpaulo * are met:
8214501Srpaulo * 1. Redistributions of source code must retain the above copyright
9214501Srpaulo *    notice, this list of conditions and the following disclaimer.
10214501Srpaulo * 2. Redistributions in binary form must reproduce the above copyright
11214501Srpaulo *    notice, this list of conditions and the following disclaimer in the
12214501Srpaulo *    documentation and/or other materials provided with the distribution.
13214501Srpaulo * 3. Neither the name of the author nor the names of any co-contributors
14214501Srpaulo *    may be used to endorse or promote products derived from this software
15214501Srpaulo *    without specific prior written permission.
16214501Srpaulo *
17214501Srpaulo * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
18252190Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19214501Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20214501Srpaulo * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21252190Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22252190Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23252190Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24252190Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25214501Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26252190Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27214501Srpaulo * SUCH DAMAGE.
28214501Srpaulo *
29214501Srpaulo * $FreeBSD$
30252190Srpaulo */
31252190Srpaulo
32252190Srpaulo#include "namespace.h"
33252190Srpaulo#include <errno.h>
34214501Srpaulo#include <signal.h>
35252190Srpaulo#include <pthread.h>
36252190Srpaulo#include "un-namespace.h"
37252190Srpaulo#include "thr_private.h"
38214501Srpaulo
39252190Srpaulo__weak_reference(_pthread_kill, pthread_kill);
40252190Srpaulo
41252190Srpauloint
42252190Srpaulo_pthread_kill(pthread_t pthread, int sig)
43252190Srpaulo{
44252190Srpaulo	struct pthread *curthread = _get_curthread();
45252190Srpaulo	int ret;
46252190Srpaulo
47252190Srpaulo	/* Check for invalid signal numbers: */
48252190Srpaulo	if (sig < 0 || sig > _SIG_MAXSIG)
49252190Srpaulo		/* Invalid signal: */
50252190Srpaulo		ret = EINVAL;
51252190Srpaulo	/*
52252190Srpaulo	 * Ensure the thread is in the list of active threads, and the
53214501Srpaulo	 * signal is valid (signal 0 specifies error checking only) and
54252190Srpaulo	 * not being ignored:
55252190Srpaulo	 */
56252190Srpaulo	else if ((ret = _thr_ref_add(curthread, pthread, /*include dead*/0))
57214501Srpaulo	    == 0) {
58252190Srpaulo		if ((sig > 0) &&
59214501Srpaulo		    (_thread_sigact[sig - 1].sa_handler != SIG_IGN))
60214501Srpaulo			_thr_sig_send(pthread, sig);
61252190Srpaulo		_thr_ref_delete(curthread, pthread);
62214501Srpaulo	}
63214501Srpaulo
64214501Srpaulo	/* Return the completion status: */
65214501Srpaulo	return (ret);
66214501Srpaulo}
67214501Srpaulo