1/*
2 * Copyright 2002-2007, Axel D��rfler, axeld@pinc-software.de.
3 * All rights reserved.
4 * Distributed under the terms of the MIT License.
5 */
6
7
8#include <sys/select.h>
9
10#include <errno.h>
11#include <pthread.h>
12
13#include <syscall_utils.h>
14
15#include <errno_private.h>
16#include <signal_private.h>
17#include <symbol_versioning.h>
18#include <syscalls.h>
19#include <time_private.h>
20
21
22extern "C" int __pselect_beos(int numBits, struct fd_set *readBits,
23	struct fd_set *writeBits, struct fd_set *errorBits,
24	const struct timespec *tv, const sigset_t *beosSignalMask);
25extern "C" int __pselect(int numBits, struct fd_set *readBits, struct fd_set *writeBits,
26	struct fd_set *errorBits, const struct timespec *tv,
27	const sigset_t *sigMask);
28
29
30int
31__pselect_beos(int numBits, struct fd_set *readBits, struct fd_set *writeBits,
32	struct fd_set *errorBits, const struct timespec *tv,
33	const sigset_t *beosSignalMask)
34{
35	int status;
36	sigset_t signalMask;
37	bigtime_t timeout = -1LL;
38	if (tv != NULL && !timespec_to_bigtime(*tv, timeout))
39		RETURN_AND_SET_ERRNO_TEST_CANCEL(EINVAL);
40
41	if (beosSignalMask != NULL)
42		signalMask = from_beos_sigset(*beosSignalMask);
43
44	status = _kern_select(numBits, readBits, writeBits, errorBits, timeout,
45		beosSignalMask != NULL ? &signalMask : NULL);
46
47	RETURN_AND_SET_ERRNO_TEST_CANCEL(status);
48}
49
50
51int
52__pselect(int numBits, struct fd_set *readBits, struct fd_set *writeBits,
53	struct fd_set *errorBits, const struct timespec *tv,
54	const sigset_t *sigMask)
55{
56	int status;
57	bigtime_t timeout = -1LL;
58	if (tv != NULL && !timespec_to_bigtime(*tv, timeout))
59		RETURN_AND_SET_ERRNO_TEST_CANCEL(EINVAL);
60
61	status = _kern_select(numBits, readBits, writeBits, errorBits, timeout,
62		sigMask);
63
64	RETURN_AND_SET_ERRNO_TEST_CANCEL(status);
65}
66
67
68int
69select(int numBits, struct fd_set *readBits, struct fd_set *writeBits,
70	struct fd_set *errorBits, struct timeval *tv)
71{
72	int status;
73	bigtime_t timeout = -1LL;
74	if (tv != NULL && !timeval_to_bigtime(*tv, timeout))
75		RETURN_AND_SET_ERRNO_TEST_CANCEL(EINVAL);
76
77	status = _kern_select(numBits, readBits, writeBits, errorBits, timeout,
78		NULL);
79
80	RETURN_AND_SET_ERRNO_TEST_CANCEL(status);
81}
82
83
84DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("__pselect_beos", "pselect@", "BASE");
85
86DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("__pselect", "pselect@@", "1_ALPHA4");
87