1 /* 2 * This file is part of the SSH Library 3 * 4 * Copyright (c) 2009 by Aris Adamantiadis 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 #ifndef POLL_H_ 22 #define POLL_H_ 23 24 #include "config.h" 25 26 #ifdef HAVE_POLL 27 28 #include <poll.h> 29 typedef struct pollfd ssh_pollfd_t; 30 31 #else /* HAVE_POLL */ 32 33 /* poll emulation support */ 34 35 typedef struct ssh_pollfd_struct { 36 socket_t fd; /* file descriptor */ 37 short events; /* requested events */ 38 short revents; /* returned events */ 39 } ssh_pollfd_t; 40 41 typedef unsigned long int nfds_t; 42 43 #ifdef _WIN32 44 45 #ifndef POLLRDNORM 46 #define POLLRDNORM 0x0100 47 #endif 48 #ifndef POLLRDBAND 49 #define POLLRDBAND 0x0200 50 #endif 51 #ifndef POLLIN 52 #define POLLIN (POLLRDNORM | POLLRDBAND) 53 #endif 54 #ifndef POLLPRI 55 #define POLLPRI 0x0400 56 #endif 57 58 #ifndef POLLWRNORM 59 #define POLLWRNORM 0x0010 60 #endif 61 #ifndef POLLOUT 62 #define POLLOUT (POLLWRNORM) 63 #endif 64 #ifndef POLLWRBAND 65 #define POLLWRBAND 0x0020 66 #endif 67 68 #ifndef POLLERR 69 #define POLLERR 0x0001 70 #endif 71 #ifndef POLLHUP 72 #define POLLHUP 0x0002 73 #endif 74 #ifndef POLLNVAL 75 #define POLLNVAL 0x0004 76 #endif 77 78 #else /* _WIN32 */ 79 80 /* poll.c */ 81 #ifndef POLLIN 82 #define POLLIN 0x001 /* There is data to read. */ 83 #endif 84 #ifndef POLLPRI 85 #define POLLPRI 0x002 /* There is urgent data to read. */ 86 #endif 87 #ifndef POLLOUT 88 #define POLLOUT 0x004 /* Writing now will not block. */ 89 #endif 90 91 #ifndef POLLERR 92 #define POLLERR 0x008 /* Error condition. */ 93 #endif 94 #ifndef POLLHUP 95 #define POLLHUP 0x010 /* Hung up. */ 96 #endif 97 #ifndef POLLNVAL 98 #define POLLNVAL 0x020 /* Invalid polling request. */ 99 #endif 100 101 #ifndef POLLRDNORM 102 #define POLLRDNORM 0x040 /* mapped to read fds_set */ 103 #endif 104 #ifndef POLLRDBAND 105 #define POLLRDBAND 0x080 /* mapped to exception fds_set */ 106 #endif 107 #ifndef POLLWRNORM 108 #define POLLWRNORM 0x100 /* mapped to write fds_set */ 109 #endif 110 #ifndef POLLWRBAND 111 #define POLLWRBAND 0x200 /* mapped to write fds_set */ 112 #endif 113 114 #endif /* WIN32 */ 115 #endif /* HAVE_POLL */ 116 117 void ssh_poll_init(void); 118 void ssh_poll_cleanup(void); 119 int ssh_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout); 120 typedef struct ssh_poll_ctx_struct *ssh_poll_ctx; 121 typedef struct ssh_poll_handle_struct *ssh_poll_handle; 122 123 /** 124 * @brief SSH poll callback. This callback will be used when an event 125 * caught on the socket. 126 * 127 * @param p Poll object this callback belongs to. 128 * @param fd The raw socket. 129 * @param revents The current poll events on the socket. 130 * @param userdata Userdata to be passed to the callback function. 131 * 132 * @return 0 on success, < 0 if you removed the poll object from 133 * its poll context. 134 */ 135 typedef int (*ssh_poll_callback)(ssh_poll_handle p, socket_t fd, int revents, 136 void *userdata); 137 138 struct ssh_socket_struct; 139 140 ssh_poll_handle ssh_poll_new(socket_t fd, short events, ssh_poll_callback cb, 141 void *userdata); 142 void ssh_poll_free(ssh_poll_handle p); 143 ssh_poll_ctx ssh_poll_get_ctx(ssh_poll_handle p); 144 short ssh_poll_get_events(ssh_poll_handle p); 145 void ssh_poll_set_events(ssh_poll_handle p, short events); 146 void ssh_poll_add_events(ssh_poll_handle p, short events); 147 void ssh_poll_remove_events(ssh_poll_handle p, short events); 148 socket_t ssh_poll_get_fd(ssh_poll_handle p); 149 void ssh_poll_set_fd(ssh_poll_handle p, socket_t fd); 150 void ssh_poll_set_callback(ssh_poll_handle p, ssh_poll_callback cb, void *userdata); 151 ssh_poll_ctx ssh_poll_ctx_new(size_t chunk_size); 152 void ssh_poll_ctx_free(ssh_poll_ctx ctx); 153 int ssh_poll_ctx_add(ssh_poll_ctx ctx, ssh_poll_handle p); 154 int ssh_poll_ctx_add_socket (ssh_poll_ctx ctx, struct ssh_socket_struct *s); 155 void ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p); 156 int ssh_poll_ctx_dopoll(ssh_poll_ctx ctx, int timeout); 157 ssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session); 158 int ssh_event_add_poll(ssh_event event, ssh_poll_handle p); 159 void ssh_event_remove_poll(ssh_event event, ssh_poll_handle p); 160 161 #endif /* POLL_H_ */ 162