1e66f31c5Sopenharmony_ci/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. 2e66f31c5Sopenharmony_ci * 3e66f31c5Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy 4e66f31c5Sopenharmony_ci * of this software and associated documentation files (the "Software"), to 5e66f31c5Sopenharmony_ci * deal in the Software without restriction, including without limitation the 6e66f31c5Sopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7e66f31c5Sopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is 8e66f31c5Sopenharmony_ci * furnished to do so, subject to the following conditions: 9e66f31c5Sopenharmony_ci * 10e66f31c5Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 11e66f31c5Sopenharmony_ci * all copies or substantial portions of the Software. 12e66f31c5Sopenharmony_ci * 13e66f31c5Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14e66f31c5Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15e66f31c5Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16e66f31c5Sopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17e66f31c5Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18e66f31c5Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19e66f31c5Sopenharmony_ci * IN THE SOFTWARE. 20e66f31c5Sopenharmony_ci */ 21e66f31c5Sopenharmony_ci 22e66f31c5Sopenharmony_ci#include <assert.h> 23e66f31c5Sopenharmony_ci#include <io.h> 24e66f31c5Sopenharmony_ci#include <stdlib.h> 25e66f31c5Sopenharmony_ci 26e66f31c5Sopenharmony_ci#include "uv.h" 27e66f31c5Sopenharmony_ci#include "internal.h" 28e66f31c5Sopenharmony_ci#include "handle-inl.h" 29e66f31c5Sopenharmony_ci 30e66f31c5Sopenharmony_ci 31e66f31c5Sopenharmony_ciuv_handle_type uv_guess_handle(uv_file file) { 32e66f31c5Sopenharmony_ci HANDLE handle; 33e66f31c5Sopenharmony_ci DWORD mode; 34e66f31c5Sopenharmony_ci 35e66f31c5Sopenharmony_ci if (file < 0) { 36e66f31c5Sopenharmony_ci return UV_UNKNOWN_HANDLE; 37e66f31c5Sopenharmony_ci } 38e66f31c5Sopenharmony_ci 39e66f31c5Sopenharmony_ci handle = uv__get_osfhandle(file); 40e66f31c5Sopenharmony_ci 41e66f31c5Sopenharmony_ci switch (GetFileType(handle)) { 42e66f31c5Sopenharmony_ci case FILE_TYPE_CHAR: 43e66f31c5Sopenharmony_ci if (GetConsoleMode(handle, &mode)) { 44e66f31c5Sopenharmony_ci return UV_TTY; 45e66f31c5Sopenharmony_ci } else { 46e66f31c5Sopenharmony_ci return UV_FILE; 47e66f31c5Sopenharmony_ci } 48e66f31c5Sopenharmony_ci 49e66f31c5Sopenharmony_ci case FILE_TYPE_PIPE: 50e66f31c5Sopenharmony_ci return UV_NAMED_PIPE; 51e66f31c5Sopenharmony_ci 52e66f31c5Sopenharmony_ci case FILE_TYPE_DISK: 53e66f31c5Sopenharmony_ci return UV_FILE; 54e66f31c5Sopenharmony_ci 55e66f31c5Sopenharmony_ci default: 56e66f31c5Sopenharmony_ci return UV_UNKNOWN_HANDLE; 57e66f31c5Sopenharmony_ci } 58e66f31c5Sopenharmony_ci} 59e66f31c5Sopenharmony_ci 60e66f31c5Sopenharmony_ci 61e66f31c5Sopenharmony_ciint uv_is_active(const uv_handle_t* handle) { 62e66f31c5Sopenharmony_ci return (handle->flags & UV_HANDLE_ACTIVE) && 63e66f31c5Sopenharmony_ci !(handle->flags & UV_HANDLE_CLOSING); 64e66f31c5Sopenharmony_ci} 65e66f31c5Sopenharmony_ci 66e66f31c5Sopenharmony_ci 67e66f31c5Sopenharmony_civoid uv_close(uv_handle_t* handle, uv_close_cb cb) { 68e66f31c5Sopenharmony_ci uv_loop_t* loop = handle->loop; 69e66f31c5Sopenharmony_ci 70e66f31c5Sopenharmony_ci if (handle->flags & UV_HANDLE_CLOSING) { 71e66f31c5Sopenharmony_ci assert(0); 72e66f31c5Sopenharmony_ci return; 73e66f31c5Sopenharmony_ci } 74e66f31c5Sopenharmony_ci 75e66f31c5Sopenharmony_ci handle->close_cb = cb; 76e66f31c5Sopenharmony_ci 77e66f31c5Sopenharmony_ci /* Handle-specific close actions */ 78e66f31c5Sopenharmony_ci switch (handle->type) { 79e66f31c5Sopenharmony_ci case UV_TCP: 80e66f31c5Sopenharmony_ci uv__tcp_close(loop, (uv_tcp_t*)handle); 81e66f31c5Sopenharmony_ci return; 82e66f31c5Sopenharmony_ci 83e66f31c5Sopenharmony_ci case UV_NAMED_PIPE: 84e66f31c5Sopenharmony_ci uv__pipe_close(loop, (uv_pipe_t*) handle); 85e66f31c5Sopenharmony_ci return; 86e66f31c5Sopenharmony_ci 87e66f31c5Sopenharmony_ci case UV_TTY: 88e66f31c5Sopenharmony_ci uv__tty_close((uv_tty_t*) handle); 89e66f31c5Sopenharmony_ci return; 90e66f31c5Sopenharmony_ci 91e66f31c5Sopenharmony_ci case UV_UDP: 92e66f31c5Sopenharmony_ci uv__udp_close(loop, (uv_udp_t*) handle); 93e66f31c5Sopenharmony_ci return; 94e66f31c5Sopenharmony_ci 95e66f31c5Sopenharmony_ci case UV_POLL: 96e66f31c5Sopenharmony_ci uv__poll_close(loop, (uv_poll_t*) handle); 97e66f31c5Sopenharmony_ci return; 98e66f31c5Sopenharmony_ci 99e66f31c5Sopenharmony_ci case UV_TIMER: 100e66f31c5Sopenharmony_ci uv_timer_stop((uv_timer_t*)handle); 101e66f31c5Sopenharmony_ci uv__handle_closing(handle); 102e66f31c5Sopenharmony_ci uv__want_endgame(loop, handle); 103e66f31c5Sopenharmony_ci return; 104e66f31c5Sopenharmony_ci 105e66f31c5Sopenharmony_ci case UV_PREPARE: 106e66f31c5Sopenharmony_ci uv_prepare_stop((uv_prepare_t*)handle); 107e66f31c5Sopenharmony_ci uv__handle_closing(handle); 108e66f31c5Sopenharmony_ci uv__want_endgame(loop, handle); 109e66f31c5Sopenharmony_ci return; 110e66f31c5Sopenharmony_ci 111e66f31c5Sopenharmony_ci case UV_CHECK: 112e66f31c5Sopenharmony_ci uv_check_stop((uv_check_t*)handle); 113e66f31c5Sopenharmony_ci uv__handle_closing(handle); 114e66f31c5Sopenharmony_ci uv__want_endgame(loop, handle); 115e66f31c5Sopenharmony_ci return; 116e66f31c5Sopenharmony_ci 117e66f31c5Sopenharmony_ci case UV_IDLE: 118e66f31c5Sopenharmony_ci uv_idle_stop((uv_idle_t*)handle); 119e66f31c5Sopenharmony_ci uv__handle_closing(handle); 120e66f31c5Sopenharmony_ci uv__want_endgame(loop, handle); 121e66f31c5Sopenharmony_ci return; 122e66f31c5Sopenharmony_ci 123e66f31c5Sopenharmony_ci case UV_ASYNC: 124e66f31c5Sopenharmony_ci uv__async_close(loop, (uv_async_t*) handle); 125e66f31c5Sopenharmony_ci return; 126e66f31c5Sopenharmony_ci 127e66f31c5Sopenharmony_ci case UV_SIGNAL: 128e66f31c5Sopenharmony_ci uv__signal_close(loop, (uv_signal_t*) handle); 129e66f31c5Sopenharmony_ci return; 130e66f31c5Sopenharmony_ci 131e66f31c5Sopenharmony_ci case UV_PROCESS: 132e66f31c5Sopenharmony_ci uv__process_close(loop, (uv_process_t*) handle); 133e66f31c5Sopenharmony_ci return; 134e66f31c5Sopenharmony_ci 135e66f31c5Sopenharmony_ci case UV_FS_EVENT: 136e66f31c5Sopenharmony_ci uv__fs_event_close(loop, (uv_fs_event_t*) handle); 137e66f31c5Sopenharmony_ci return; 138e66f31c5Sopenharmony_ci 139e66f31c5Sopenharmony_ci case UV_FS_POLL: 140e66f31c5Sopenharmony_ci uv__fs_poll_close((uv_fs_poll_t*) handle); 141e66f31c5Sopenharmony_ci uv__handle_closing(handle); 142e66f31c5Sopenharmony_ci return; 143e66f31c5Sopenharmony_ci 144e66f31c5Sopenharmony_ci default: 145e66f31c5Sopenharmony_ci /* Not supported */ 146e66f31c5Sopenharmony_ci abort(); 147e66f31c5Sopenharmony_ci } 148e66f31c5Sopenharmony_ci} 149e66f31c5Sopenharmony_ci 150e66f31c5Sopenharmony_ci 151e66f31c5Sopenharmony_ciint uv_is_closing(const uv_handle_t* handle) { 152e66f31c5Sopenharmony_ci return !!(handle->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED)); 153e66f31c5Sopenharmony_ci} 154e66f31c5Sopenharmony_ci 155e66f31c5Sopenharmony_ci 156e66f31c5Sopenharmony_ciuv_os_fd_t uv_get_osfhandle(int fd) { 157e66f31c5Sopenharmony_ci return uv__get_osfhandle(fd); 158e66f31c5Sopenharmony_ci} 159e66f31c5Sopenharmony_ci 160e66f31c5Sopenharmony_ciint uv_open_osfhandle(uv_os_fd_t os_fd) { 161e66f31c5Sopenharmony_ci return _open_osfhandle((intptr_t) os_fd, 0); 162e66f31c5Sopenharmony_ci} 163