xref: /qemu/include/io/net-listener.h (revision 4dad0a9aa818698e0735c8352bf7925a1660df6f)
153047392SDaniel P. Berrange /*
253047392SDaniel P. Berrange  * QEMU network listener
353047392SDaniel P. Berrange  *
453047392SDaniel P. Berrange  * Copyright (c) 2016-2017 Red Hat, Inc.
553047392SDaniel P. Berrange  *
653047392SDaniel P. Berrange  * This program is free software; you can redistribute it and/or modify
753047392SDaniel P. Berrange  * it under the terms of the GNU General Public License as published by
853047392SDaniel P. Berrange  * the Free Software Foundation; either version 2 of the License, or
953047392SDaniel P. Berrange  * (at your option) any later version.
1053047392SDaniel P. Berrange  *
1153047392SDaniel P. Berrange  * This program is distributed in the hope that it will be useful,
1253047392SDaniel P. Berrange  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1353047392SDaniel P. Berrange  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1453047392SDaniel P. Berrange  * GNU General Public License for more details.
1553047392SDaniel P. Berrange  *
1653047392SDaniel P. Berrange  * You should have received a copy of the GNU General Public License along
1753047392SDaniel P. Berrange  * with this program; if not, see <http://www.gnu.org/licenses/>.
1853047392SDaniel P. Berrange  *
1953047392SDaniel P. Berrange  */
2053047392SDaniel P. Berrange 
2153047392SDaniel P. Berrange #ifndef QIO_NET_LISTENER_H
2253047392SDaniel P. Berrange #define QIO_NET_LISTENER_H
2353047392SDaniel P. Berrange 
2453047392SDaniel P. Berrange #include "io/channel-socket.h"
25db1015e9SEduardo Habkost #include "qom/object.h"
2653047392SDaniel P. Berrange 
2753047392SDaniel P. Berrange #define TYPE_QIO_NET_LISTENER "qio-net-listener"
28*30b5707cSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(QIONetListener,
29c734cd40SEduardo Habkost                            QIO_NET_LISTENER)
3053047392SDaniel P. Berrange 
3153047392SDaniel P. Berrange 
3253047392SDaniel P. Berrange typedef void (*QIONetListenerClientFunc)(QIONetListener *listener,
3353047392SDaniel P. Berrange                                          QIOChannelSocket *sioc,
3453047392SDaniel P. Berrange                                          gpointer data);
3553047392SDaniel P. Berrange 
3653047392SDaniel P. Berrange /**
3753047392SDaniel P. Berrange  * QIONetListener:
3853047392SDaniel P. Berrange  *
3953047392SDaniel P. Berrange  * The QIONetListener object encapsulates the management of a
4053047392SDaniel P. Berrange  * listening socket. It is able to listen on multiple sockets
4153047392SDaniel P. Berrange  * concurrently, to deal with the scenario where IPv4 / IPv6
4253047392SDaniel P. Berrange  * needs separate sockets, or there is a need to listen on a
4353047392SDaniel P. Berrange  * subset of interface IP addresses, instead of the wildcard
4453047392SDaniel P. Berrange  * address.
4553047392SDaniel P. Berrange  */
4653047392SDaniel P. Berrange struct QIONetListener {
4753047392SDaniel P. Berrange     Object parent;
4853047392SDaniel P. Berrange 
4953047392SDaniel P. Berrange     char *name;
5053047392SDaniel P. Berrange     QIOChannelSocket **sioc;
51938c8b79SPeter Xu     GSource **io_source;
5253047392SDaniel P. Berrange     size_t nsioc;
5353047392SDaniel P. Berrange 
5453047392SDaniel P. Berrange     bool connected;
5553047392SDaniel P. Berrange 
5653047392SDaniel P. Berrange     QIONetListenerClientFunc io_func;
5753047392SDaniel P. Berrange     gpointer io_data;
5853047392SDaniel P. Berrange     GDestroyNotify io_notify;
5953047392SDaniel P. Berrange };
6053047392SDaniel P. Berrange 
6153047392SDaniel P. Berrange 
6253047392SDaniel P. Berrange 
6353047392SDaniel P. Berrange /**
6453047392SDaniel P. Berrange  * qio_net_listener_new:
6553047392SDaniel P. Berrange  *
6653047392SDaniel P. Berrange  * Create a new network listener service, which is not
6753047392SDaniel P. Berrange  * listening on any sockets initially.
6853047392SDaniel P. Berrange  *
6953047392SDaniel P. Berrange  * Returns: the new listener
7053047392SDaniel P. Berrange  */
7153047392SDaniel P. Berrange QIONetListener *qio_net_listener_new(void);
7253047392SDaniel P. Berrange 
7353047392SDaniel P. Berrange 
7453047392SDaniel P. Berrange /**
7553047392SDaniel P. Berrange  * qio_net_listener_set_name:
7653047392SDaniel P. Berrange  * @listener: the network listener object
7753047392SDaniel P. Berrange  * @name: the listener name
7853047392SDaniel P. Berrange  *
7953047392SDaniel P. Berrange  * Set the name of the listener. This is used as a debugging
8053047392SDaniel P. Berrange  * aid, to set names on any GSource instances associated
8153047392SDaniel P. Berrange  * with the listener
8253047392SDaniel P. Berrange  */
8353047392SDaniel P. Berrange void qio_net_listener_set_name(QIONetListener *listener,
8453047392SDaniel P. Berrange                                const char *name);
8553047392SDaniel P. Berrange 
8653047392SDaniel P. Berrange /**
8753047392SDaniel P. Berrange  * qio_net_listener_open_sync:
8853047392SDaniel P. Berrange  * @listener: the network listener object
8953047392SDaniel P. Berrange  * @addr: the address to listen on
90fc8135c6SJuan Quintela  * @num: the amount of expected connections
9153047392SDaniel P. Berrange  * @errp: pointer to a NULL initialized error object
9253047392SDaniel P. Berrange  *
9353047392SDaniel P. Berrange  * Synchronously open a listening connection on all
9453047392SDaniel P. Berrange  * addresses associated with @addr. This method may
9553047392SDaniel P. Berrange  * also be invoked multiple times, in order to have a
9653047392SDaniel P. Berrange  * single listener on multiple distinct addresses.
9753047392SDaniel P. Berrange  */
9853047392SDaniel P. Berrange int qio_net_listener_open_sync(QIONetListener *listener,
9953047392SDaniel P. Berrange                                SocketAddress *addr,
100fc8135c6SJuan Quintela                                int num,
10153047392SDaniel P. Berrange                                Error **errp);
10253047392SDaniel P. Berrange 
10353047392SDaniel P. Berrange /**
10453047392SDaniel P. Berrange  * qio_net_listener_add:
10553047392SDaniel P. Berrange  * @listener: the network listener object
10653047392SDaniel P. Berrange  * @sioc: the socket I/O channel
10753047392SDaniel P. Berrange  *
10853047392SDaniel P. Berrange  * Associate a listening socket I/O channel with the
10953047392SDaniel P. Berrange  * listener. The listener will acquire a new reference
11053047392SDaniel P. Berrange  * on @sioc, so the caller should release its own reference
11153047392SDaniel P. Berrange  * if it no longer requires the object.
11253047392SDaniel P. Berrange  */
11353047392SDaniel P. Berrange void qio_net_listener_add(QIONetListener *listener,
11453047392SDaniel P. Berrange                           QIOChannelSocket *sioc);
11553047392SDaniel P. Berrange 
11653047392SDaniel P. Berrange /**
117938c8b79SPeter Xu  * qio_net_listener_set_client_func_full:
118938c8b79SPeter Xu  * @listener: the network listener object
119938c8b79SPeter Xu  * @func: the callback function
120938c8b79SPeter Xu  * @data: opaque data to pass to @func
121938c8b79SPeter Xu  * @notify: callback to free @data
122938c8b79SPeter Xu  * @context: the context that the sources will be bound to.  If %NULL,
123938c8b79SPeter Xu  *           the default context will be used.
124938c8b79SPeter Xu  *
125938c8b79SPeter Xu  * Register @func to be invoked whenever a new client
126938c8b79SPeter Xu  * connects to the listener. @func will be invoked
127938c8b79SPeter Xu  * passing in the QIOChannelSocket instance for the
128938c8b79SPeter Xu  * client.
129938c8b79SPeter Xu  */
130938c8b79SPeter Xu void qio_net_listener_set_client_func_full(QIONetListener *listener,
131938c8b79SPeter Xu                                            QIONetListenerClientFunc func,
132938c8b79SPeter Xu                                            gpointer data,
133938c8b79SPeter Xu                                            GDestroyNotify notify,
134938c8b79SPeter Xu                                            GMainContext *context);
135938c8b79SPeter Xu 
136938c8b79SPeter Xu /**
13753047392SDaniel P. Berrange  * qio_net_listener_set_client_func:
13853047392SDaniel P. Berrange  * @listener: the network listener object
13953047392SDaniel P. Berrange  * @func: the callback function
14053047392SDaniel P. Berrange  * @data: opaque data to pass to @func
14153047392SDaniel P. Berrange  * @notify: callback to free @data
14253047392SDaniel P. Berrange  *
143938c8b79SPeter Xu  * Wrapper of qio_net_listener_set_client_func_full(), only that the
144938c8b79SPeter Xu  * sources will always be bound to default main context.
14553047392SDaniel P. Berrange  */
14653047392SDaniel P. Berrange void qio_net_listener_set_client_func(QIONetListener *listener,
14753047392SDaniel P. Berrange                                       QIONetListenerClientFunc func,
14853047392SDaniel P. Berrange                                       gpointer data,
14953047392SDaniel P. Berrange                                       GDestroyNotify notify);
15053047392SDaniel P. Berrange 
15153047392SDaniel P. Berrange /**
15253047392SDaniel P. Berrange  * qio_net_listener_wait_client:
15353047392SDaniel P. Berrange  * @listener: the network listener object
15453047392SDaniel P. Berrange  *
15553047392SDaniel P. Berrange  * Block execution of the caller until a new client arrives
15653047392SDaniel P. Berrange  * on one of the listening sockets. If there was previously
15753047392SDaniel P. Berrange  * a callback registered with qio_net_listener_set_client_func
15853047392SDaniel P. Berrange  * it will be temporarily disabled, and re-enabled afterwards.
15953047392SDaniel P. Berrange  *
16053047392SDaniel P. Berrange  * Returns: the new client socket
16153047392SDaniel P. Berrange  */
16253047392SDaniel P. Berrange QIOChannelSocket *qio_net_listener_wait_client(QIONetListener *listener);
16353047392SDaniel P. Berrange 
16453047392SDaniel P. Berrange 
16553047392SDaniel P. Berrange /**
16653047392SDaniel P. Berrange  * qio_net_listener_disconnect:
16753047392SDaniel P. Berrange  * @listener: the network listener object
16853047392SDaniel P. Berrange  *
16953047392SDaniel P. Berrange  * Disconnect the listener, removing all I/O callback
17053047392SDaniel P. Berrange  * watches and closing the socket channels.
17153047392SDaniel P. Berrange  */
17253047392SDaniel P. Berrange void qio_net_listener_disconnect(QIONetListener *listener);
17353047392SDaniel P. Berrange 
17453047392SDaniel P. Berrange 
17553047392SDaniel P. Berrange /**
17653047392SDaniel P. Berrange  * qio_net_listener_is_connected:
17753047392SDaniel P. Berrange  * @listener: the network listener object
17853047392SDaniel P. Berrange  *
17953047392SDaniel P. Berrange  * Determine if the listener is connected to any socket
18053047392SDaniel P. Berrange  * channels
18153047392SDaniel P. Berrange  *
18253047392SDaniel P. Berrange  * Returns: true if connected, false otherwise
18353047392SDaniel P. Berrange  */
18453047392SDaniel P. Berrange bool qio_net_listener_is_connected(QIONetListener *listener);
18553047392SDaniel P. Berrange 
18653047392SDaniel P. Berrange #endif /* QIO_NET_LISTENER_H */
187