99 lines
2.5 KiB
Odin
99 lines
2.5 KiB
Odin
package posix
|
|
|
|
import "base:intrinsics"
|
|
|
|
import "core:c"
|
|
|
|
when ODIN_OS == .Darwin {
|
|
foreign import lib "system:System.framework"
|
|
} else {
|
|
foreign import lib "system:c"
|
|
}
|
|
|
|
// poll.h - definitions for the poll() function
|
|
|
|
foreign lib {
|
|
/*
|
|
For each pointer in fds, poll() shall examine the given descriptor for the events.
|
|
poll will identify on which descriptors writes or reads can be done.
|
|
|
|
Returns: -1 (setting errno) on failure, 0 on timeout, the amount of fds that have been changed on success.
|
|
|
|
[[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html ]]
|
|
*/
|
|
poll :: proc(fds: [^]pollfd, nfds: nfds_t, timeout: c.int) -> c.int ---
|
|
}
|
|
|
|
nfds_t :: c.uint
|
|
|
|
Poll_Event_Bits :: enum c.short {
|
|
// Data other than high-priority data may be read without blocking.
|
|
IN = log2(POLLIN),
|
|
// Normal data may be read without blocking.
|
|
RDNORM = log2(POLLRDNORM),
|
|
// Priority data may be read without blocking.
|
|
RDBAND = log2(POLLRDBAND),
|
|
// High priority data may be read without blocking.
|
|
PRI = log2(POLLPRI),
|
|
|
|
// Normal data may be written without blocking.
|
|
OUT = log2(POLLOUT),
|
|
// Equivalent to POLLOUT.
|
|
WRNORM = log2(POLLWRNORM),
|
|
// Priority data may be written.
|
|
WRBAND = log2(POLLWRBAND),
|
|
|
|
// An error has occurred (revents only).
|
|
ERR = log2(POLLERR),
|
|
// Device hsa been disconnected (revents only).
|
|
HUP = log2(POLLHUP),
|
|
// Invalid fd member (revents only).
|
|
NVAL = log2(POLLNVAL),
|
|
}
|
|
Poll_Event :: bit_set[Poll_Event_Bits; c.short]
|
|
|
|
when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD {
|
|
|
|
pollfd :: struct {
|
|
fd: FD, /* [PSX] the following descriptor being polled */
|
|
events: Poll_Event, /* [PSX] the input event flags */
|
|
revents: Poll_Event, /* [PSX] the output event flags */
|
|
}
|
|
|
|
POLLIN :: 0x0001
|
|
POLLRDNORM :: 0x0040
|
|
POLLRDBAND :: 0x0080
|
|
POLLPRI :: 0x0002
|
|
POLLOUT :: 0x0004
|
|
POLLWRNORM :: POLLOUT
|
|
POLLWRBAND :: 0x0100
|
|
|
|
POLLERR :: 0x0008
|
|
POLLHUP :: 0x0010
|
|
POLLNVAL :: 0x0020
|
|
|
|
} else when ODIN_OS == .Linux {
|
|
|
|
pollfd :: struct {
|
|
fd: FD, /* [PSX] the following descriptor being polled */
|
|
events: Poll_Event, /* [PSX] the input event flags */
|
|
revents: Poll_Event, /* [PSX] the output event flags */
|
|
}
|
|
|
|
POLLIN :: 0x0001
|
|
POLLRDNORM :: 0x0040
|
|
POLLRDBAND :: 0x0080
|
|
POLLPRI :: 0x0002
|
|
POLLOUT :: 0x0004
|
|
POLLWRNORM :: 0x0100
|
|
POLLWRBAND :: 0x0200
|
|
|
|
POLLERR :: 0x0008
|
|
POLLHUP :: 0x0010
|
|
POLLNVAL :: 0x0020
|
|
|
|
} else {
|
|
#panic("posix is unimplemented for the current target")
|
|
}
|
|
|