Rizin
unix-like reverse engineering framework and cli tools
poll.c
Go to the documentation of this file.
1 /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining a copy
4  * of this software and associated documentation files (the "Software"), to
5  * deal in the Software without restriction, including without limitation the
6  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7  * sell copies of the Software, and to permit persons to whom the Software is
8  * furnished to do so, subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19  * IN THE SOFTWARE.
20  */
21 
22 #include "uv.h"
23 #include "internal.h"
24 
25 #include <unistd.h>
26 #include <assert.h>
27 #include <errno.h>
28 
29 
30 static void uv__poll_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
32  int pevents;
33 
34  handle = container_of(w, uv_poll_t, io_watcher);
35 
36  /*
37  * As documented in the kernel source fs/kernfs/file.c #780
38  * poll will return POLLERR|POLLPRI in case of sysfs
39  * polling. This does not happen in case of out-of-band
40  * TCP messages.
41  *
42  * The above is the case on (at least) FreeBSD and Linux.
43  *
44  * So to properly determine a POLLPRI or a POLLERR we need
45  * to check for both.
46  */
47  if ((events & POLLERR) && !(events & UV__POLLPRI)) {
48  uv__io_stop(loop, w, POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI);
50  handle->poll_cb(handle, UV_EBADF, 0);
51  return;
52  }
53 
54  pevents = 0;
55  if (events & POLLIN)
56  pevents |= UV_READABLE;
57  if (events & UV__POLLPRI)
58  pevents |= UV_PRIORITIZED;
59  if (events & POLLOUT)
60  pevents |= UV_WRITABLE;
61  if (events & UV__POLLRDHUP)
62  pevents |= UV_DISCONNECT;
63 
64  handle->poll_cb(handle, 0, pevents);
65 }
66 
67 
69  int err;
70 
71  if (uv__fd_exists(loop, fd))
72  return UV_EEXIST;
73 
75  if (err)
76  return err;
77 
78  /* If ioctl(FIONBIO) reports ENOTTY, try fcntl(F_GETFL) + fcntl(F_SETFL).
79  * Workaround for e.g. kqueue fds not supporting ioctls.
80  */
81  err = uv__nonblock(fd, 1);
82  if (err == UV_ENOTTY)
85 
86  if (err)
87  return err;
88 
89  uv__handle_init(loop, (uv_handle_t*) handle, UV_POLL);
90  uv__io_init(&handle->io_watcher, uv__poll_io, fd);
91  handle->poll_cb = NULL;
92  return 0;
93 }
94 
95 
98  return uv_poll_init(loop, handle, socket);
99 }
100 
101 
103  uv__io_stop(handle->loop,
104  &handle->io_watcher,
105  POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI);
107  uv__platform_invalidate_fd(handle->loop, handle->io_watcher.fd);
108 }
109 
110 
114  return 0;
115 }
116 
117 
119  int events;
120 
121  assert((pevents & ~(UV_READABLE | UV_WRITABLE | UV_DISCONNECT |
122  UV_PRIORITIZED)) == 0);
124 
126 
127  if (pevents == 0)
128  return 0;
129 
130  events = 0;
131  if (pevents & UV_READABLE)
132  events |= POLLIN;
133  if (pevents & UV_PRIORITIZED)
134  events |= UV__POLLPRI;
135  if (pevents & UV_WRITABLE)
136  events |= POLLOUT;
137  if (pevents & UV_DISCONNECT)
138  events |= UV__POLLRDHUP;
139 
140  uv__io_start(handle->loop, &handle->io_watcher, events);
142  handle->poll_cb = poll_cb;
143 
144  return 0;
145 }
146 
147 
150 }
void uv__platform_invalidate_fd(uv_loop_t *loop, int fd)
Definition: aix.c:1280
int uv__io_check_fd(uv_loop_t *loop, int fd)
Definition: aix.c:115
static bool err
Definition: armass.c:435
static mcore_handle handle
Definition: asm_mcore.c:8
#define NULL
Definition: cris-opc.c:27
#define w
Definition: crypto_rc6.c:13
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd socket
Definition: sflib.h:79
static void poll_cb(uv_fs_t *req)
Definition: fs-poll.c:185
assert(limit<=UINT32_MAX/2)
#define container_of(ptr, type, member)
Definition: rz_types.h:650
Definition: unix.h:96
Definition: uv.h:1780
Definition: uv.h:793
uv_loop_t * loop
Definition: main.c:7
void uv__io_stop(uv_loop_t *loop, uv__io_t *w, unsigned int events)
Definition: core.c:910
int uv__nonblock_ioctl(int fd, int set)
Definition: core.c:578
void uv__io_start(uv_loop_t *loop, uv__io_t *w, unsigned int events)
Definition: core.c:882
int uv__fd_exists(uv_loop_t *loop, int fd)
Definition: core.c:965
void uv__io_init(uv__io_t *w, uv__io_cb cb, int fd)
Definition: core.c:865
int uv__nonblock_fcntl(int fd, int set)
Definition: core.c:608
#define UV__POLLRDHUP
Definition: internal.h:116
#define UV__POLLPRI
Definition: internal.h:122
#define uv__nonblock
Definition: internal.h:170
void uv__poll_close(uv_poll_t *handle)
Definition: poll.c:148
int uv_poll_start(uv_poll_t *handle, int pevents, uv_poll_cb poll_cb)
Definition: poll.c:118
int uv_poll_init(uv_loop_t *loop, uv_poll_t *handle, int fd)
Definition: poll.c:68
int uv_poll_stop(uv_poll_t *handle)
Definition: poll.c:111
int uv_poll_init_socket(uv_loop_t *loop, uv_poll_t *handle, uv_os_sock_t socket)
Definition: poll.c:96
static void uv__poll_stop(uv_poll_t *handle)
Definition: poll.c:102
static void uv__poll_io(uv_loop_t *loop, uv__io_t *w, unsigned int events)
Definition: poll.c:30
int uv_os_sock_t
Definition: unix.h:129
#define uv__is_closing(h)
Definition: uv-common.h:255
#define uv__handle_init(loop_, h, type_)
Definition: uv-common.h:301
#define uv__handle_stop(h)
Definition: uv-common.h:266
#define uv__handle_start(h)
Definition: uv-common.h:258
void(* uv_poll_cb)(uv_poll_t *handle, int status, int events)
Definition: uv.h:320
@ UV_WRITABLE
Definition: uv.h:801
@ UV_DISCONNECT
Definition: uv.h:802
@ UV_PRIORITIZED
Definition: uv.h:803
@ UV_READABLE
Definition: uv.h:800
static const z80_opcode fd[]
Definition: z80_tab.h:997