xref: /qemu/include/io/channel-socket.h (revision 559607ea173a0003efda7f884bec73b242f923fb)
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