1*559607eaSDaniel P. Berrange /* 2*559607eaSDaniel P. Berrange * QEMU I/O channels sockets driver 3*559607eaSDaniel P. Berrange * 4*559607eaSDaniel P. Berrange * Copyright (c) 2015 Red Hat, Inc. 5*559607eaSDaniel P. Berrange * 6*559607eaSDaniel P. Berrange * This library is free software; you can redistribute it and/or 7*559607eaSDaniel P. Berrange * modify it under the terms of the GNU Lesser General Public 8*559607eaSDaniel P. Berrange * License as published by the Free Software Foundation; either 9*559607eaSDaniel P. Berrange * version 2 of the License, or (at your option) any later version. 10*559607eaSDaniel P. Berrange * 11*559607eaSDaniel P. Berrange * This library is distributed in the hope that it will be useful, 12*559607eaSDaniel P. Berrange * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*559607eaSDaniel P. Berrange * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14*559607eaSDaniel P. Berrange * Lesser General Public License for more details. 15*559607eaSDaniel P. Berrange * 16*559607eaSDaniel P. Berrange * You should have received a copy of the GNU Lesser General Public 17*559607eaSDaniel P. Berrange * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18*559607eaSDaniel P. Berrange * 19*559607eaSDaniel P. Berrange */ 20*559607eaSDaniel P. Berrange 21*559607eaSDaniel P. Berrange #ifndef QIO_CHANNEL_SOCKET_H__ 22*559607eaSDaniel P. Berrange #define QIO_CHANNEL_SOCKET_H__ 23*559607eaSDaniel P. Berrange 24*559607eaSDaniel P. Berrange #include "io/channel.h" 25*559607eaSDaniel P. Berrange #include "io/task.h" 26*559607eaSDaniel P. Berrange #include "qemu/sockets.h" 27*559607eaSDaniel P. Berrange 28*559607eaSDaniel P. Berrange #define TYPE_QIO_CHANNEL_SOCKET "qio-channel-socket" 29*559607eaSDaniel P. Berrange #define QIO_CHANNEL_SOCKET(obj) \ 30*559607eaSDaniel P. Berrange OBJECT_CHECK(QIOChannelSocket, (obj), TYPE_QIO_CHANNEL_SOCKET) 31*559607eaSDaniel P. Berrange 32*559607eaSDaniel P. Berrange typedef struct QIOChannelSocket QIOChannelSocket; 33*559607eaSDaniel P. Berrange 34*559607eaSDaniel P. Berrange /** 35*559607eaSDaniel P. Berrange * QIOChannelSocket: 36*559607eaSDaniel P. Berrange * 37*559607eaSDaniel P. Berrange * The QIOChannelSocket class provides a channel implementation 38*559607eaSDaniel P. Berrange * that can transport data over a UNIX socket or TCP socket. 39*559607eaSDaniel P. Berrange * Beyond the core channel API, it also provides functionality 40*559607eaSDaniel P. Berrange * for accepting client connections, tuning some socket 41*559607eaSDaniel P. Berrange * parameters and getting socket address strings. 42*559607eaSDaniel P. Berrange */ 43*559607eaSDaniel P. Berrange 44*559607eaSDaniel P. Berrange struct QIOChannelSocket { 45*559607eaSDaniel P. Berrange QIOChannel parent; 46*559607eaSDaniel P. Berrange int fd; 47*559607eaSDaniel P. Berrange struct sockaddr_storage localAddr; 48*559607eaSDaniel P. Berrange socklen_t localAddrLen; 49*559607eaSDaniel P. Berrange struct sockaddr_storage remoteAddr; 50*559607eaSDaniel P. Berrange socklen_t remoteAddrLen; 51*559607eaSDaniel P. Berrange }; 52*559607eaSDaniel P. Berrange 53*559607eaSDaniel P. Berrange 54*559607eaSDaniel P. Berrange /** 55*559607eaSDaniel P. Berrange * qio_channel_socket_new: 56*559607eaSDaniel P. Berrange * 57*559607eaSDaniel P. Berrange * Create a channel for performing I/O on a socket 58*559607eaSDaniel P. Berrange * connection, that is initially closed. After 59*559607eaSDaniel P. Berrange * creating the socket, it must be setup as a client 60*559607eaSDaniel P. Berrange * connection or server. 61*559607eaSDaniel P. Berrange * 62*559607eaSDaniel P. Berrange * Returns: the socket channel object 63*559607eaSDaniel P. Berrange */ 64*559607eaSDaniel P. Berrange QIOChannelSocket * 65*559607eaSDaniel P. Berrange qio_channel_socket_new(void); 66*559607eaSDaniel P. Berrange 67*559607eaSDaniel P. Berrange /** 68*559607eaSDaniel P. Berrange * qio_channel_socket_new_fd: 69*559607eaSDaniel P. Berrange * @fd: the socket file descriptor 70*559607eaSDaniel P. Berrange * @errp: pointer to an uninitialized error object 71*559607eaSDaniel P. Berrange * 72*559607eaSDaniel P. Berrange * Create a channel for performing I/O on the socket 73*559607eaSDaniel P. Berrange * connection represented by the file descriptor @fd. 74*559607eaSDaniel P. Berrange * 75*559607eaSDaniel P. Berrange * Returns: the socket channel object, or NULL on error 76*559607eaSDaniel P. Berrange */ 77*559607eaSDaniel P. Berrange QIOChannelSocket * 78*559607eaSDaniel P. Berrange qio_channel_socket_new_fd(int fd, 79*559607eaSDaniel P. Berrange Error **errp); 80*559607eaSDaniel P. Berrange 81*559607eaSDaniel P. Berrange 82*559607eaSDaniel P. Berrange /** 83*559607eaSDaniel P. Berrange * qio_channel_socket_connect_sync: 84*559607eaSDaniel P. Berrange * @ioc: the socket channel object 85*559607eaSDaniel P. Berrange * @addr: the address to connect to 86*559607eaSDaniel P. Berrange * @errp: pointer to an uninitialized error object 87*559607eaSDaniel P. Berrange * 88*559607eaSDaniel P. Berrange * Attempt to connect to the address @addr. This method 89*559607eaSDaniel P. Berrange * will run in the foreground so the caller will not regain 90*559607eaSDaniel P. Berrange * execution control until the connection is established or 91*559607eaSDaniel P. Berrange * an error occurs. 92*559607eaSDaniel P. Berrange */ 93*559607eaSDaniel P. Berrange int qio_channel_socket_connect_sync(QIOChannelSocket *ioc, 94*559607eaSDaniel P. Berrange SocketAddress *addr, 95*559607eaSDaniel P. Berrange Error **errp); 96*559607eaSDaniel P. Berrange 97*559607eaSDaniel P. Berrange /** 98*559607eaSDaniel P. Berrange * qio_channel_socket_connect_async: 99*559607eaSDaniel P. Berrange * @ioc: the socket channel object 100*559607eaSDaniel P. Berrange * @addr: the address to connect to 101*559607eaSDaniel P. Berrange * @callback: the function to invoke on completion 102*559607eaSDaniel P. Berrange * @opaque: user data to pass to @callback 103*559607eaSDaniel P. Berrange * @destroy: the function to free @opaque 104*559607eaSDaniel P. Berrange * 105*559607eaSDaniel P. Berrange * Attempt to connect to the address @addr. This method 106*559607eaSDaniel P. Berrange * will run in the background so the caller will regain 107*559607eaSDaniel P. Berrange * execution control immediately. The function @callback 108*559607eaSDaniel P. Berrange * will be invoked on completion or failure. 109*559607eaSDaniel P. Berrange */ 110*559607eaSDaniel P. Berrange void qio_channel_socket_connect_async(QIOChannelSocket *ioc, 111*559607eaSDaniel P. Berrange SocketAddress *addr, 112*559607eaSDaniel P. Berrange QIOTaskFunc callback, 113*559607eaSDaniel P. Berrange gpointer opaque, 114*559607eaSDaniel P. Berrange GDestroyNotify destroy); 115*559607eaSDaniel P. Berrange 116*559607eaSDaniel P. Berrange 117*559607eaSDaniel P. Berrange /** 118*559607eaSDaniel P. Berrange * qio_channel_socket_listen_sync: 119*559607eaSDaniel P. Berrange * @ioc: the socket channel object 120*559607eaSDaniel P. Berrange * @addr: the address to listen to 121*559607eaSDaniel P. Berrange * @errp: pointer to an uninitialized error object 122*559607eaSDaniel P. Berrange * 123*559607eaSDaniel P. Berrange * Attempt to listen to the address @addr. This method 124*559607eaSDaniel P. Berrange * will run in the foreground so the caller will not regain 125*559607eaSDaniel P. Berrange * execution control until the connection is established or 126*559607eaSDaniel P. Berrange * an error occurs. 127*559607eaSDaniel P. Berrange */ 128*559607eaSDaniel P. Berrange int qio_channel_socket_listen_sync(QIOChannelSocket *ioc, 129*559607eaSDaniel P. Berrange SocketAddress *addr, 130*559607eaSDaniel P. Berrange Error **errp); 131*559607eaSDaniel P. Berrange 132*559607eaSDaniel P. Berrange /** 133*559607eaSDaniel P. Berrange * qio_channel_socket_listen_async: 134*559607eaSDaniel P. Berrange * @ioc: the socket channel object 135*559607eaSDaniel P. Berrange * @addr: the address to listen to 136*559607eaSDaniel P. Berrange * @callback: the function to invoke on completion 137*559607eaSDaniel P. Berrange * @opaque: user data to pass to @callback 138*559607eaSDaniel P. Berrange * @destroy: the function to free @opaque 139*559607eaSDaniel P. Berrange * 140*559607eaSDaniel P. Berrange * Attempt to listen to the address @addr. This method 141*559607eaSDaniel P. Berrange * will run in the background so the caller will regain 142*559607eaSDaniel P. Berrange * execution control immediately. The function @callback 143*559607eaSDaniel P. Berrange * will be invoked on completion or failure. 144*559607eaSDaniel P. Berrange */ 145*559607eaSDaniel P. Berrange void qio_channel_socket_listen_async(QIOChannelSocket *ioc, 146*559607eaSDaniel P. Berrange SocketAddress *addr, 147*559607eaSDaniel P. Berrange QIOTaskFunc callback, 148*559607eaSDaniel P. Berrange gpointer opaque, 149*559607eaSDaniel P. Berrange GDestroyNotify destroy); 150*559607eaSDaniel P. Berrange 151*559607eaSDaniel P. Berrange 152*559607eaSDaniel P. Berrange /** 153*559607eaSDaniel P. Berrange * qio_channel_socket_dgram_sync: 154*559607eaSDaniel P. Berrange * @ioc: the socket channel object 155*559607eaSDaniel P. Berrange * @localAddr: the address to local bind address 156*559607eaSDaniel P. Berrange * @remoteAddr: the address to remote peer address 157*559607eaSDaniel P. Berrange * @errp: pointer to an uninitialized error object 158*559607eaSDaniel P. Berrange * 159*559607eaSDaniel P. Berrange * Attempt to initialize a datagram socket bound to 160*559607eaSDaniel P. Berrange * @localAddr and communicating with peer @remoteAddr. 161*559607eaSDaniel P. Berrange * This method will run in the foreground so the caller 162*559607eaSDaniel P. Berrange * will not regain execution control until the socket 163*559607eaSDaniel P. Berrange * is established or an error occurs. 164*559607eaSDaniel P. Berrange */ 165*559607eaSDaniel P. Berrange int qio_channel_socket_dgram_sync(QIOChannelSocket *ioc, 166*559607eaSDaniel P. Berrange SocketAddress *localAddr, 167*559607eaSDaniel P. Berrange SocketAddress *remoteAddr, 168*559607eaSDaniel P. Berrange Error **errp); 169*559607eaSDaniel P. Berrange 170*559607eaSDaniel P. Berrange /** 171*559607eaSDaniel P. Berrange * qio_channel_socket_dgram_async: 172*559607eaSDaniel P. Berrange * @ioc: the socket channel object 173*559607eaSDaniel P. Berrange * @localAddr: the address to local bind address 174*559607eaSDaniel P. Berrange * @remoteAddr: the address to remote peer address 175*559607eaSDaniel P. Berrange * @callback: the function to invoke on completion 176*559607eaSDaniel P. Berrange * @opaque: user data to pass to @callback 177*559607eaSDaniel P. Berrange * @destroy: the function to free @opaque 178*559607eaSDaniel P. Berrange * 179*559607eaSDaniel P. Berrange * Attempt to initialize a datagram socket bound to 180*559607eaSDaniel P. Berrange * @localAddr and communicating with peer @remoteAddr. 181*559607eaSDaniel P. Berrange * This method will run in the background so the caller 182*559607eaSDaniel P. Berrange * will regain execution control immediately. The function 183*559607eaSDaniel P. Berrange * @callback will be invoked on completion or failure. 184*559607eaSDaniel P. Berrange */ 185*559607eaSDaniel P. Berrange void qio_channel_socket_dgram_async(QIOChannelSocket *ioc, 186*559607eaSDaniel P. Berrange SocketAddress *localAddr, 187*559607eaSDaniel P. Berrange SocketAddress *remoteAddr, 188*559607eaSDaniel P. Berrange QIOTaskFunc callback, 189*559607eaSDaniel P. Berrange gpointer opaque, 190*559607eaSDaniel P. Berrange GDestroyNotify destroy); 191*559607eaSDaniel P. Berrange 192*559607eaSDaniel P. Berrange 193*559607eaSDaniel P. Berrange /** 194*559607eaSDaniel P. Berrange * qio_channel_socket_get_local_address: 195*559607eaSDaniel P. Berrange * @ioc: the socket channel object 196*559607eaSDaniel P. Berrange * @errp: pointer to an uninitialized error object 197*559607eaSDaniel P. Berrange * 198*559607eaSDaniel P. Berrange * Get the string representation of the local socket 199*559607eaSDaniel P. Berrange * address. A pointer to the allocated address information 200*559607eaSDaniel P. Berrange * struct will be returned, which the caller is required to 201*559607eaSDaniel P. Berrange * release with a call qapi_free_SocketAddress when no 202*559607eaSDaniel P. Berrange * longer required. 203*559607eaSDaniel P. Berrange * 204*559607eaSDaniel P. Berrange * Returns: 0 on success, -1 on error 205*559607eaSDaniel P. Berrange */ 206*559607eaSDaniel P. Berrange SocketAddress * 207*559607eaSDaniel P. Berrange qio_channel_socket_get_local_address(QIOChannelSocket *ioc, 208*559607eaSDaniel P. Berrange Error **errp); 209*559607eaSDaniel P. Berrange 210*559607eaSDaniel P. Berrange /** 211*559607eaSDaniel P. Berrange * qio_channel_socket_get_remote_address: 212*559607eaSDaniel P. Berrange * @ioc: the socket channel object 213*559607eaSDaniel P. Berrange * @errp: pointer to an uninitialized error object 214*559607eaSDaniel P. Berrange * 215*559607eaSDaniel P. Berrange * Get the string representation of the local socket 216*559607eaSDaniel P. Berrange * address. A pointer to the allocated address information 217*559607eaSDaniel P. Berrange * struct will be returned, which the caller is required to 218*559607eaSDaniel P. Berrange * release with a call qapi_free_SocketAddress when no 219*559607eaSDaniel P. Berrange * longer required. 220*559607eaSDaniel P. Berrange * 221*559607eaSDaniel P. Berrange * Returns: the socket address struct, or NULL on error 222*559607eaSDaniel P. Berrange */ 223*559607eaSDaniel P. Berrange SocketAddress * 224*559607eaSDaniel P. Berrange qio_channel_socket_get_remote_address(QIOChannelSocket *ioc, 225*559607eaSDaniel P. Berrange Error **errp); 226*559607eaSDaniel P. Berrange 227*559607eaSDaniel P. Berrange 228*559607eaSDaniel P. Berrange /** 229*559607eaSDaniel P. Berrange * qio_channel_socket_accept: 230*559607eaSDaniel P. Berrange * @ioc: the socket channel object 231*559607eaSDaniel P. Berrange * @errp: pointer to an uninitialized error object 232*559607eaSDaniel P. Berrange * 233*559607eaSDaniel P. Berrange * If the socket represents a server, then this accepts 234*559607eaSDaniel P. Berrange * a new client connection. The returned channel will 235*559607eaSDaniel P. Berrange * represent the connected client socket. 236*559607eaSDaniel P. Berrange * 237*559607eaSDaniel P. Berrange * Returns: the new client channel, or NULL on error 238*559607eaSDaniel P. Berrange */ 239*559607eaSDaniel P. Berrange QIOChannelSocket * 240*559607eaSDaniel P. Berrange qio_channel_socket_accept(QIOChannelSocket *ioc, 241*559607eaSDaniel P. Berrange Error **errp); 242*559607eaSDaniel P. Berrange 243*559607eaSDaniel P. Berrange 244*559607eaSDaniel P. Berrange #endif /* QIO_CHANNEL_SOCKET_H__ */ 245