summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/os_calls.c36
-rw-r--r--common/os_calls.h11
-rw-r--r--common/trans.c20
-rw-r--r--common/trans.h6
4 files changed, 72 insertions, 1 deletions
diff --git a/common/os_calls.c b/common/os_calls.c
index 43064c40..fb55376a 100644
--- a/common/os_calls.c
+++ b/common/os_calls.c
@@ -41,6 +41,9 @@
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/socket.h>
+#if defined(XRDP_ENABLE_VSOCK)
+#include <linux/vm_sockets.h>
+#endif
#include <sys/un.h>
#include <sys/time.h>
#include <sys/times.h>
@@ -583,6 +586,19 @@ g_sck_local_socket(void)
}
/*****************************************************************************/
+#if defined(XRDP_ENABLE_VSOCK)
+int
+g_sck_vsock_socket(void)
+{
+#if defined(_WIN32)
+ return 0;
+#else
+ return socket(PF_VSOCK, SOCK_STREAM, 0);
+#endif
+}
+#endif
+
+/*****************************************************************************/
/* returns error */
int
g_sck_get_peer_cred(int sck, int *pid, int *uid, int *gid)
@@ -990,6 +1006,26 @@ g_sck_local_bind(int sck, const char *port)
#endif
}
+/*****************************************************************************/
+#if defined(XRDP_ENABLE_VSOCK)
+int
+g_sck_vsock_bind(int sck, const char *port)
+{
+#if defined(_WIN32)
+ return -1;
+#else
+ struct sockaddr_vm s;
+
+ memset(&s, 0, sizeof(struct sockaddr_vm));
+ s.svm_family = AF_VSOCK;
+ s.svm_port = atoi(port);
+ s.svm_cid = VMADDR_CID_ANY;
+
+ return bind(sck, (struct sockaddr *)&s, sizeof(struct sockaddr_vm));
+#endif
+}
+#endif
+
#if defined(XRDP_ENABLE_IPV6)
/*****************************************************************************/
/* Helper function for g_tcp_bind_address. */
diff --git a/common/os_calls.h b/common/os_calls.h
index 98f87b3e..d21b4d9c 100644
--- a/common/os_calls.h
+++ b/common/os_calls.h
@@ -37,6 +37,11 @@
#define g_tcp_select g_sck_select
#define g_close_wait_obj g_delete_wait_obj
+#if defined(XRDP_ENABLE_VSOCK)
+#define g_vsock_socket g_sck_vsock_socket
+#define g_vsock_bind g_sck_vsock_bind
+#endif
+
int g_rm_temp_dir(void);
int g_mk_socket_path(const char* app_name);
void g_init(const char* app_name);
@@ -62,6 +67,9 @@ int g_sck_get_send_buffer_bytes(int sck, int *bytes);
int g_sck_set_recv_buffer_bytes(int sck, int bytes);
int g_sck_get_recv_buffer_bytes(int sck, int *bytes);
int g_sck_local_socket(void);
+#if defined(XRDP_ENABLE_VSOCK)
+int g_sck_vsock_socket(void);
+#endif
int g_sck_get_peer_cred(int sck, int *pid, int *uid, int *gid);
void g_sck_close(int sck);
int g_tcp_connect(int sck, const char* address, const char* port);
@@ -69,6 +77,9 @@ int g_sck_local_connect(int sck, const char* port);
int g_sck_set_non_blocking(int sck);
int g_tcp_bind(int sck, const char *port);
int g_sck_local_bind(int sck, const char* port);
+#if defined(XRDP_ENABLE_VSOCK)
+int g_sck_vsock_bind(int sck, const char* port);
+#endif
int g_tcp_bind_address(int sck, const char* port, const char* address);
int g_sck_listen(int sck);
int g_tcp_accept(int sck);
diff --git a/common/trans.c b/common/trans.c
index d73764de..8a271722 100644
--- a/common/trans.c
+++ b/common/trans.c
@@ -831,6 +831,26 @@ trans_listen_address(struct trans *self, char *port, const char *address)
}
}
}
+#if defined(XRDP_ENABLE_VSOCK)
+ else if (self->mode == TRANS_MODE_VSOCK) /* vsock socket */
+ {
+ self->sck = g_vsock_socket();
+ if (self->sck < 0)
+ return 1;
+
+ g_tcp_set_non_blocking(self->sck);
+
+ if (g_vsock_bind(self->sck, port) == 0)
+ {
+ if (g_tcp_listen(self->sck) == 0)
+ {
+ self->status = TRANS_STATUS_UP; /* ok */
+ self->type1 = TRANS_TYPE_LISTENER; /* listener */
+ return 0;
+ }
+ }
+ }
+#endif
return 1;
}
diff --git a/common/trans.h b/common/trans.h
index 77d1ed17..8b0b5a70 100644
--- a/common/trans.h
+++ b/common/trans.h
@@ -27,6 +27,10 @@
#define TRANS_MODE_TCP 1
#define TRANS_MODE_UNIX 2
+#if defined(XRDP_ENABLE_VSOCK)
+#define TRANS_MODE_VSOCK 3
+#endif
+
#define TRANS_TYPE_LISTENER 1
#define TRANS_TYPE_SERVER 2
#define TRANS_TYPE_CLIENT 3
@@ -62,7 +66,7 @@ struct source_info
struct trans
{
tbus sck; /* socket handle */
- int mode; /* 1 tcp, 2 unix socket */
+ int mode; /* 1 tcp, 2 unix socket, 3 vsock */
int status;
int type1; /* 1 listener 2 server 3 client */
ttrans_data_in trans_data_in;