chardev: make socket derivable
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
This commit is contained in:
		
							parent
							
								
									1b87751fb1
								
							
						
					
					
						commit
						fa670c808a
					
				@ -25,9 +25,7 @@
 | 
				
			|||||||
#include "qemu/osdep.h"
 | 
					#include "qemu/osdep.h"
 | 
				
			||||||
#include "chardev/char.h"
 | 
					#include "chardev/char.h"
 | 
				
			||||||
#include "io/channel-socket.h"
 | 
					#include "io/channel-socket.h"
 | 
				
			||||||
#include "io/channel-tls.h"
 | 
					 | 
				
			||||||
#include "io/channel-websock.h"
 | 
					#include "io/channel-websock.h"
 | 
				
			||||||
#include "io/net-listener.h"
 | 
					 | 
				
			||||||
#include "qemu/error-report.h"
 | 
					#include "qemu/error-report.h"
 | 
				
			||||||
#include "qemu/module.h"
 | 
					#include "qemu/module.h"
 | 
				
			||||||
#include "qemu/option.h"
 | 
					#include "qemu/option.h"
 | 
				
			||||||
@ -37,61 +35,7 @@
 | 
				
			|||||||
#include "qemu/yank.h"
 | 
					#include "qemu/yank.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "chardev/char-io.h"
 | 
					#include "chardev/char-io.h"
 | 
				
			||||||
#include "qom/object.h"
 | 
					#include "chardev/char-socket.h"
 | 
				
			||||||
 | 
					 | 
				
			||||||
/***********************************************************/
 | 
					 | 
				
			||||||
/* TCP Net console */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define TCP_MAX_FDS 16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct {
 | 
					 | 
				
			||||||
    char buf[21];
 | 
					 | 
				
			||||||
    size_t buflen;
 | 
					 | 
				
			||||||
} TCPChardevTelnetInit;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum {
 | 
					 | 
				
			||||||
    TCP_CHARDEV_STATE_DISCONNECTED,
 | 
					 | 
				
			||||||
    TCP_CHARDEV_STATE_CONNECTING,
 | 
					 | 
				
			||||||
    TCP_CHARDEV_STATE_CONNECTED,
 | 
					 | 
				
			||||||
} TCPChardevState;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct SocketChardev {
 | 
					 | 
				
			||||||
    Chardev parent;
 | 
					 | 
				
			||||||
    QIOChannel *ioc; /* Client I/O channel */
 | 
					 | 
				
			||||||
    QIOChannelSocket *sioc; /* Client master channel */
 | 
					 | 
				
			||||||
    QIONetListener *listener;
 | 
					 | 
				
			||||||
    GSource *hup_source;
 | 
					 | 
				
			||||||
    QCryptoTLSCreds *tls_creds;
 | 
					 | 
				
			||||||
    char *tls_authz;
 | 
					 | 
				
			||||||
    TCPChardevState state;
 | 
					 | 
				
			||||||
    int max_size;
 | 
					 | 
				
			||||||
    int do_telnetopt;
 | 
					 | 
				
			||||||
    int do_nodelay;
 | 
					 | 
				
			||||||
    int *read_msgfds;
 | 
					 | 
				
			||||||
    size_t read_msgfds_num;
 | 
					 | 
				
			||||||
    int *write_msgfds;
 | 
					 | 
				
			||||||
    size_t write_msgfds_num;
 | 
					 | 
				
			||||||
    bool registered_yank;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SocketAddress *addr;
 | 
					 | 
				
			||||||
    bool is_listen;
 | 
					 | 
				
			||||||
    bool is_telnet;
 | 
					 | 
				
			||||||
    bool is_tn3270;
 | 
					 | 
				
			||||||
    GSource *telnet_source;
 | 
					 | 
				
			||||||
    TCPChardevTelnetInit *telnet_init;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool is_websock;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    GSource *reconnect_timer;
 | 
					 | 
				
			||||||
    int64_t reconnect_time;
 | 
					 | 
				
			||||||
    bool connect_err_reported;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QIOTask *connect_task;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
typedef struct SocketChardev SocketChardev;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DECLARE_INSTANCE_CHECKER(SocketChardev, SOCKET_CHARDEV,
 | 
					 | 
				
			||||||
                         TYPE_CHARDEV_SOCKET)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean socket_reconnect_timeout(gpointer opaque);
 | 
					static gboolean socket_reconnect_timeout(gpointer opaque);
 | 
				
			||||||
static void tcp_chr_telnet_init(Chardev *chr);
 | 
					static void tcp_chr_telnet_init(Chardev *chr);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										84
									
								
								include/chardev/char-socket.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								include/chardev/char-socket.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,84 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * QEMU System Emulator
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (c) 2003-2008 Fabrice Bellard
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					 * of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					 * in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					 * copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					 * furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The above copyright notice and this permission notice shall be included in
 | 
				
			||||||
 | 
					 * all copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
				
			||||||
 | 
					 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
 | 
					 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
				
			||||||
 | 
					 * THE SOFTWARE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef CHAR_SOCKET_H_
 | 
				
			||||||
 | 
					#define CHAR_SOCKET_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "io/channel-socket.h"
 | 
				
			||||||
 | 
					#include "io/channel-tls.h"
 | 
				
			||||||
 | 
					#include "io/net-listener.h"
 | 
				
			||||||
 | 
					#include "chardev/char.h"
 | 
				
			||||||
 | 
					#include "qom/object.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TCP_MAX_FDS 16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    char buf[21];
 | 
				
			||||||
 | 
					    size_t buflen;
 | 
				
			||||||
 | 
					} TCPChardevTelnetInit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    TCP_CHARDEV_STATE_DISCONNECTED,
 | 
				
			||||||
 | 
					    TCP_CHARDEV_STATE_CONNECTING,
 | 
				
			||||||
 | 
					    TCP_CHARDEV_STATE_CONNECTED,
 | 
				
			||||||
 | 
					} TCPChardevState;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SocketChardev {
 | 
				
			||||||
 | 
					    Chardev parent;
 | 
				
			||||||
 | 
					    QIOChannel *ioc; /* Client I/O channel */
 | 
				
			||||||
 | 
					    QIOChannelSocket *sioc; /* Client master channel */
 | 
				
			||||||
 | 
					    QIONetListener *listener;
 | 
				
			||||||
 | 
					    GSource *hup_source;
 | 
				
			||||||
 | 
					    QCryptoTLSCreds *tls_creds;
 | 
				
			||||||
 | 
					    char *tls_authz;
 | 
				
			||||||
 | 
					    TCPChardevState state;
 | 
				
			||||||
 | 
					    int max_size;
 | 
				
			||||||
 | 
					    int do_telnetopt;
 | 
				
			||||||
 | 
					    int do_nodelay;
 | 
				
			||||||
 | 
					    int *read_msgfds;
 | 
				
			||||||
 | 
					    size_t read_msgfds_num;
 | 
				
			||||||
 | 
					    int *write_msgfds;
 | 
				
			||||||
 | 
					    size_t write_msgfds_num;
 | 
				
			||||||
 | 
					    bool registered_yank;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SocketAddress *addr;
 | 
				
			||||||
 | 
					    bool is_listen;
 | 
				
			||||||
 | 
					    bool is_telnet;
 | 
				
			||||||
 | 
					    bool is_tn3270;
 | 
				
			||||||
 | 
					    GSource *telnet_source;
 | 
				
			||||||
 | 
					    TCPChardevTelnetInit *telnet_init;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool is_websock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GSource *reconnect_timer;
 | 
				
			||||||
 | 
					    int64_t reconnect_time;
 | 
				
			||||||
 | 
					    bool connect_err_reported;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QIOTask *connect_task;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					typedef struct SocketChardev SocketChardev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DECLARE_INSTANCE_CHECKER(SocketChardev, SOCKET_CHARDEV,
 | 
				
			||||||
 | 
					                         TYPE_CHARDEV_SOCKET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* CHAR_SOCKET_H_ */
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user