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 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 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 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 151 int uv_is_closing(const uv_handle_t* handle) { 152 return !!(handle->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED)); 153 } 154 155 156 uv_os_fd_t uv_get_osfhandle(int fd) { 157 return uv__get_osfhandle(fd); 158 } 159 160 int uv_open_osfhandle(uv_os_fd_t os_fd) { 161 return _open_osfhandle((intptr_t) os_fd, 0); 162 } 163