xref: /libuv/src/win/handle.c (revision d54c92e3)
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 <assert.h>
23 #include <io.h>
24 #include <stdlib.h>
25 
26 #include "uv.h"
27 #include "internal.h"
28 #include "handle-inl.h"
29 
30 
uv_guess_handle(uv_file file)31 uv_handle_type uv_guess_handle(uv_file file) {
32   HANDLE handle;
33   DWORD mode;
34 
35   if (file < 0) {
36     return UV_UNKNOWN_HANDLE;
37   }
38 
39   handle = uv__get_osfhandle(file);
40 
41   switch (GetFileType(handle)) {
42     case FILE_TYPE_CHAR:
43       if (GetConsoleMode(handle, &mode)) {
44         return UV_TTY;
45       } else {
46         return UV_FILE;
47       }
48 
49     case FILE_TYPE_PIPE:
50       return UV_NAMED_PIPE;
51 
52     case FILE_TYPE_DISK:
53       return UV_FILE;
54 
55     default:
56       return UV_UNKNOWN_HANDLE;
57   }
58 }
59 
60 
uv_is_active(const uv_handle_t * handle)61 int uv_is_active(const uv_handle_t* handle) {
62   return (handle->flags & UV_HANDLE_ACTIVE) &&
63         !(handle->flags & UV_HANDLE_CLOSING);
64 }
65 
66 
uv_close(uv_handle_t * handle,uv_close_cb cb)67 void uv_close(uv_handle_t* handle, uv_close_cb cb) {
68   uv_loop_t* loop = handle->loop;
69 
70   if (handle->flags & UV_HANDLE_CLOSING) {
71     assert(0);
72     return;
73   }
74 
75   handle->close_cb = cb;
76 
77   /* Handle-specific close actions */
78   switch (handle->type) {
79     case UV_TCP:
80       uv__tcp_close(loop, (uv_tcp_t*)handle);
81       return;
82 
83     case UV_NAMED_PIPE:
84       uv__pipe_close(loop, (uv_pipe_t*) handle);
85       return;
86 
87     case UV_TTY:
88       uv__tty_close((uv_tty_t*) handle);
89       return;
90 
91     case UV_UDP:
92       uv__udp_close(loop, (uv_udp_t*) handle);
93       return;
94 
95     case UV_POLL:
96       uv__poll_close(loop, (uv_poll_t*) handle);
97       return;
98 
99     case UV_TIMER:
100       uv_timer_stop((uv_timer_t*)handle);
101       uv__handle_closing(handle);
102       uv__want_endgame(loop, handle);
103       return;
104 
105     case UV_PREPARE:
106       uv_prepare_stop((uv_prepare_t*)handle);
107       uv__handle_closing(handle);
108       uv__want_endgame(loop, handle);
109       return;
110 
111     case UV_CHECK:
112       uv_check_stop((uv_check_t*)handle);
113       uv__handle_closing(handle);
114       uv__want_endgame(loop, handle);
115       return;
116 
117     case UV_IDLE:
118       uv_idle_stop((uv_idle_t*)handle);
119       uv__handle_closing(handle);
120       uv__want_endgame(loop, handle);
121       return;
122 
123     case UV_ASYNC:
124       uv__async_close(loop, (uv_async_t*) handle);
125       return;
126 
127     case UV_SIGNAL:
128       uv__signal_close(loop, (uv_signal_t*) handle);
129       return;
130 
131     case UV_PROCESS:
132       uv__process_close(loop, (uv_process_t*) handle);
133       return;
134 
135     case UV_FS_EVENT:
136       uv__fs_event_close(loop, (uv_fs_event_t*) handle);
137       return;
138 
139     case UV_FS_POLL:
140       uv__fs_poll_close((uv_fs_poll_t*) handle);
141       uv__handle_closing(handle);
142       return;
143 
144     default:
145       /* Not supported */
146       abort();
147   }
148 }
149 
150 
uv_is_closing(const uv_handle_t * handle)151 int uv_is_closing(const uv_handle_t* handle) {
152   return !!(handle->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED));
153 }
154 
155 
uv_get_osfhandle(int fd)156 uv_os_fd_t uv_get_osfhandle(int fd) {
157   return uv__get_osfhandle(fd);
158 }
159 
uv_open_osfhandle(uv_os_fd_t os_fd)160 int uv_open_osfhandle(uv_os_fd_t os_fd) {
161   return _open_osfhandle((intptr_t) os_fd, 0);
162 }
163