aboutsummaryrefslogtreecommitdiff
path: root/include/qemu/sockets.h
blob: d935fd80da8c31126fe38da85e5725279af96717 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* 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/qapi-types-sockets.h"

/* misc helpers */
bool fd_is_socket(int fd);
int qemu_socket(int domain, int type, int protocol);

/**
 * qemu_socketpair:
 * @domain: specifies a communication domain, such as PF_UNIX
 * @type: specifies the socket type.
 * @protocol: specifies a particular protocol to be used with the  socket
 * @sv: an array to store the pair of socket created
 *
 * Creates an unnamed pair of connected sockets in the specified domain,
 * of the specified type, and using the optionally specified protocol.
 * And automatically set the close-on-exec flags on the returned sockets
 *
 * Return 0 on success.
 */
int qemu_socketpair(int domain, int type, int protocol, int sv[2]);

int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
/*
 * A variant of send(2) which handles partial send.
 *
 * Return the number of bytes transferred over the socket.
 * Set errno if fewer than `count' bytes are sent.
 *
 * This function don't work with non-blocking socket's.
 * Any of the possibilities with non-blocking socket's is bad:
 *   - return a short write (then name is wrong)
 *   - busy wait adding (errno == EAGAIN) to the loop
 */
ssize_t qemu_send_full(int s, const void *buf, size_t count)
    G_GNUC_WARN_UNUSED_RESULT;
int socket_set_cork(int fd, int v);
int socket_set_nodelay(int fd);
void qemu_socket_set_block(int fd);
int qemu_socket_try_set_nonblock(int fd);
void qemu_socket_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

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, Error **errp);

NetworkAddressFamily inet_netfamily(int family);

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

char *socket_uri(SocketAddress *addr);
SocketAddress *socket_parse(const char *str, Error **errp);
int socket_connect(SocketAddress *addr, Error **errp);
int socket_listen(SocketAddress *addr, int num, Error **errp);
void socket_listen_cleanup(int fd, Error **errp);
int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp);

/* Old, ipv4 only bits.  Don't use for new code. */
int convert_host_port(struct sockaddr_in *saddr, const char *host,
                      const char *port, Error **errp);
int parse_host_port(struct sockaddr_in *saddr, const char *str,
                    Error **errp);
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_SocketAddress() when no
 * longer required.
 *
 * Returns: the socket address struct, or NULL on error
 */
SocketAddress *
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_SocketAddress() when no
 * longer required.
 *
 * Returns: the socket address struct, or NULL on error
 */
SocketAddress *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_SocketAddress() when no
 * longer required.
 *
 * Returns: the socket address struct, or NULL on error
 */
SocketAddress *socket_remote_address(int fd, Error **errp);

/**
 * socket_address_flatten:
 * @addr: the socket address to flatten
 *
 * Convert SocketAddressLegacy to SocketAddress.  Caller is responsible
 * for freeing with qapi_free_SocketAddress().
 *
 * Returns: the argument converted to SocketAddress.
 */
SocketAddress *socket_address_flatten(SocketAddressLegacy *addr);

/**
 * socket_address_parse_named_fd:
 *
 * Modify @addr, replacing a named fd by its corresponding number.
 * Needed for callers that plan to pass @addr to a context where the
 * current monitor is not available.
 *
 * Return 0 on success.
 */
int socket_address_parse_named_fd(SocketAddress *addr, Error **errp);
#endif /* QEMU_SOCKETS_H */