* t f PF_INET
* t t PF_INET6
*
- * NB, this matrix is only about getting the neccessary results
+ * NB, this matrix is only about getting the necessary results
* from getaddrinfo(). Some of the cases require further work
* after reading results from getaddrinfo in order to fully
* apply the logic the end user wants. eg with the last case
return fd;
}
+void socket_listen_cleanup(int fd, Error **errp)
+{
+ SocketAddress *addr;
+
+ addr = socket_local_address(fd, errp);
+
+ if (addr->type == SOCKET_ADDRESS_KIND_UNIX
+ && addr->u.q_unix.data->path) {
+ if (unlink(addr->u.q_unix.data->path) < 0 && errno != ENOENT) {
+ error_setg_errno(errp, errno,
+ "Failed to unlink socket %s",
+ addr->u.q_unix.data->path);
+ }
+ }
+
+ g_free(addr);
+}
+
int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
{
int fd;
void qapi_copy_SocketAddress(SocketAddress **p_dest,
SocketAddress *src)
{
- QmpOutputVisitor *qov;
- QmpInputVisitor *qiv;
Visitor *ov, *iv;
QObject *obj;
*p_dest = NULL;
- qov = qmp_output_visitor_new();
- ov = qmp_output_get_visitor(qov);
+ ov = qmp_output_visitor_new(&obj);
visit_type_SocketAddress(ov, NULL, &src, &error_abort);
- obj = qmp_output_get_qobject(qov);
- qmp_output_visitor_cleanup(qov);
+ visit_complete(ov, &obj);
+ visit_free(ov);
if (!obj) {
return;
}
- qiv = qmp_input_visitor_new(obj, true);
- iv = qmp_input_get_visitor(qiv);
+ iv = qmp_input_visitor_new(obj, true);
visit_type_SocketAddress(iv, NULL, p_dest, &error_abort);
- qmp_input_visitor_cleanup(qiv);
+ visit_free(iv);
qobject_decref(obj);
}
+
+char *socket_address_to_string(struct SocketAddress *addr, Error **errp)
+{
+ char *buf;
+ InetSocketAddress *inet;
+ char host_port[INET6_ADDRSTRLEN + 5 + 4];
+
+ switch (addr->type) {
+ case SOCKET_ADDRESS_KIND_INET:
+ inet = addr->u.inet.data;
+ if (strchr(inet->host, ':') == NULL) {
+ snprintf(host_port, sizeof(host_port), "%s:%s", inet->host,
+ inet->port);
+ buf = g_strdup(host_port);
+ } else {
+ snprintf(host_port, sizeof(host_port), "[%s]:%s", inet->host,
+ inet->port);
+ buf = g_strdup(host_port);
+ }
+ break;
+
+ case SOCKET_ADDRESS_KIND_UNIX:
+ buf = g_strdup(addr->u.q_unix.data->path);
+ break;
+
+ case SOCKET_ADDRESS_KIND_FD:
+ buf = g_strdup(addr->u.fd.data->str);
+ break;
+
+ default:
+ error_setg(errp, "socket family %d unsupported",
+ addr->type);
+ return NULL;
+ }
+ return buf;
+}