summaryrefslogtreecommitdiff
path: root/include/qemu/sockets.h
blob: 82b7460ea436aadde361dfcfd4dfdf3cdb843856 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* headers to use the BSD sockets */

#ifndef QEMU_SOCKETS_H
#define QEMU_SOCKETS_H

#ifdef _WIN32

int inet_aton(const char *cp, struct in_addr *ia);

#endif /* !_WIN32 */

#include "qapi-types.h"

/* misc helpers */
int qemu_socket(int domain, int type, int protocol);
int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
int socket_set_cork(int fd, int v);
int socket_set_nodelay(int fd);
void qemu_set_block(int fd);
void qemu_set_nonblock(int fd);
int socket_set_fast_reuse(int fd);

#ifdef WIN32
/* Windows has different names for the same constants with the same values */
#define SHUT_RD   0
#define SHUT_WR   1
#define SHUT_RDWR 2
#endif

/* callback function for nonblocking connect
 * valid fd on success, negative error code on failure
 */
typedef void NonBlockingConnectHandler(int fd, Error *err, void *opaque);

int inet_ai_family_from_address(InetSocketAddress *addr,
                                Error **errp);
int inet_parse(InetSocketAddress *addr, const char *str, Error **errp);
int inet_connect(const char *str, Error **errp);
int inet_connect_saddr(InetSocketAddress *saddr,
                       NonBlockingConnectHandler *callback, void *opaque,
                       Error **errp);

NetworkAddressFamily inet_netfamily(int family);

int unix_listen(const char *path, char *ostr, int olen, Error **errp);
int unix_connect(const char *path, Error **errp);

SocketAddressLegacy *socket_parse(const char *str, Error **errp);
int socket_connect(SocketAddressLegacy *addr, NonBlockingConnectHandler *callback,
                   void *opaque, Error **errp);
int socket_listen(SocketAddressLegacy *addr, Error **errp);
void socket_listen_cleanup(int fd, Error **errp);
int socket_dgram(SocketAddressLegacy *remote, SocketAddressLegacy *local, Error **errp);

/* Old, ipv4 only bits.  Don't use for new code. */
int parse_host_port(struct sockaddr_in *saddr, const char *str);
int socket_init(void);

/**
 * socket_sockaddr_to_address:
 * @sa: socket address struct
 * @salen: size of @sa struct
 * @errp: pointer to uninitialized error object
 *
 * Get the string representation of the socket
 * address. A pointer to the allocated address information
 * struct will be returned, which the caller is required to
 * release with a call qapi_free_SocketAddressLegacy() when no
 * longer required.
 *
 * Returns: the socket address struct, or NULL on error
 */
SocketAddressLegacy *
socket_sockaddr_to_address(struct sockaddr_storage *sa,
                           socklen_t salen,
                           Error **errp);

/**
 * socket_local_address:
 * @fd: the socket file handle
 * @errp: pointer to uninitialized error object
 *
 * Get the string representation of the local socket
 * address. A pointer to the allocated address information
 * struct will be returned, which the caller is required to
 * release with a call qapi_free_SocketAddressLegacy() when no
 * longer required.
 *
 * Returns: the socket address struct, or NULL on error
 */
SocketAddressLegacy *socket_local_address(int fd, Error **errp);

/**
 * socket_remote_address:
 * @fd: the socket file handle
 * @errp: pointer to uninitialized error object
 *
 * Get the string representation of the remote socket
 * address. A pointer to the allocated address information
 * struct will be returned, which the caller is required to
 * release with a call qapi_free_SocketAddressLegacy() when no
 * longer required.
 *
 * Returns: the socket address struct, or NULL on error
 */
SocketAddressLegacy *socket_remote_address(int fd, Error **errp);

/**
 * socket_address_to_string:
 * @addr: the socket address struct
 * @errp: pointer to uninitialized error object
 *
 * Get the string representation of the socket
 * address. A pointer to the char array containing
 * string format will be returned, the caller is
 * required to release the returned value when no
 * longer required with g_free.
 *
 * Returns: the socket address in string format, or NULL on error
 */
char *socket_address_to_string(struct SocketAddressLegacy *addr, Error **errp);

/**
 * socket_address_crumple:
 * @addr_flat: the socket address to crumple
 *
 * Convert SocketAddress to SocketAddressLegacy.  Caller is responsible
 * for freeing with qapi_free_SocketAddressLegacy().
 *
 * Returns: the argument converted to SocketAddressLegacy.
 */
SocketAddressLegacy *socket_address_crumple(SocketAddress *addr);

#endif /* QEMU_SOCKETS_H */