diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/os_calls.c | 36 | ||||
| -rw-r--r-- | common/os_calls.h | 11 | ||||
| -rw-r--r-- | common/trans.c | 20 | ||||
| -rw-r--r-- | common/trans.h | 6 |
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; |
