# file: src/rpc/virnetsocket.c
# prefix: rpc
probe rpc_socket_new(void *sock, int refs, int fd, int errfd, int pid, const char *localAddr, const char *remoteAddr);
+ probe rpc_socket_send_fd(void *sock, int fd);
+ probe rpc_socket_recv_fd(void *sock, int fd);
probe rpc_socket_ref(void *sock, int refs);
probe rpc_socket_free(void *sock, int refs);
#include "event.h"
#include "threads.h"
+#include "passfd.h"
+
#define VIR_FROM_THIS VIR_FROM_RPC
#define virNetError(code, ...) \
}
+bool virNetSocketHasPassFD(virNetSocketPtr sock)
+{
+ bool hasPassFD = false;
+ virMutexLock(&sock->lock);
+ if (sock->localAddr.data.sa.sa_family == AF_UNIX)
+ hasPassFD = true;
+ virMutexUnlock(&sock->lock);
+ return hasPassFD;
+}
+
+
int virNetSocketGetPort(virNetSocketPtr sock)
{
int port;
}
+int virNetSocketSendFD(virNetSocketPtr sock, int fd)
+{
+ int ret = -1;
+ if (!virNetSocketHasPassFD(sock)) {
+ virNetError(VIR_ERR_INTERNAL_ERROR,
+ _("Sending file descriptors is not supported on this socket"));
+ return -1;
+ }
+ virMutexLock(&sock->lock);
+ PROBE(RPC_SOCKET_SEND_FD,
+ "sock=%p fd=%d", sock, fd);
+ if (sendfd(sock->fd, fd) < 0) {
+ virReportSystemError(errno,
+ _("Failed to send file descriptor %d"),
+ fd);
+ goto cleanup;
+ }
+ ret = 0;
+
+cleanup:
+ virMutexUnlock(&sock->lock);
+ return ret;
+}
+
+
+int virNetSocketRecvFD(virNetSocketPtr sock)
+{
+ int ret = -1;
+ if (!virNetSocketHasPassFD(sock)) {
+ virNetError(VIR_ERR_INTERNAL_ERROR,
+ _("Receiving file descriptors is not supported on this socket"));
+ return -1;
+ }
+ virMutexLock(&sock->lock);
+
+ if ((ret = recvfd(sock->fd, O_CLOEXEC)) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Failed to recv file descriptor"));
+ goto cleanup;
+ }
+ PROBE(RPC_SOCKET_RECV_FD,
+ "sock=%p fd=%d", sock, ret);
+
+cleanup:
+ virMutexUnlock(&sock->lock);
+ return ret;
+}
+
+
int virNetSocketListen(virNetSocketPtr sock, int backlog)
{
virMutexLock(&sock->lock);
bool virNetSocketIsLocal(virNetSocketPtr sock);
+bool virNetSocketHasPassFD(virNetSocketPtr sock);
+
int virNetSocketGetPort(virNetSocketPtr sock);
int virNetSocketGetLocalIdentity(virNetSocketPtr sock,
ssize_t virNetSocketRead(virNetSocketPtr sock, char *buf, size_t len);
ssize_t virNetSocketWrite(virNetSocketPtr sock, const char *buf, size_t len);
+int virNetSocketSendFD(virNetSocketPtr sock, int fd);
+int virNetSocketRecvFD(virNetSocketPtr sock);
+
void virNetSocketSetTLSSession(virNetSocketPtr sock,
virNetTLSSessionPtr sess);
# ifdef HAVE_SASL