bind to specific address
This commit is contained in:
parent
bb7898419f
commit
1e8b5ea2cd
@ -450,6 +450,24 @@ g_tcp_local_bind(int sck, char* port)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error, zero is good */
|
||||
int APP_CC
|
||||
g_tcp_bind_address(int sck, char* port, const char* address)
|
||||
{
|
||||
struct sockaddr_in s;
|
||||
|
||||
memset(&s, 0, sizeof(struct sockaddr_in));
|
||||
s.sin_family = AF_INET;
|
||||
s.sin_port = htons((tui16)atoi(port));
|
||||
s.sin_addr.s_addr = INADDR_ANY;
|
||||
if (inet_aton(address, &s.sin_addr) < 0)
|
||||
{
|
||||
return -1; /* bad address */
|
||||
}
|
||||
return bind(sck, (struct sockaddr*)&s, sizeof(struct sockaddr_in));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* returns error, zero is good */
|
||||
int APP_CC
|
||||
|
@ -76,6 +76,8 @@ g_tcp_bind(int sck, char* port);
|
||||
int APP_CC
|
||||
g_tcp_local_bind(int sck, char* port);
|
||||
int APP_CC
|
||||
g_tcp_bind_address(int sck, char* port, const char* address);
|
||||
int APP_CC
|
||||
g_tcp_listen(int sck);
|
||||
int APP_CC
|
||||
g_tcp_accept(int sck);
|
||||
|
@ -342,7 +342,7 @@ trans_connect(struct trans* self, const char* server, const char* port,
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_listen(struct trans* self, char* port)
|
||||
trans_listen_address(struct trans* self, char* port, const char* address)
|
||||
{
|
||||
if (self->sck != 0)
|
||||
{
|
||||
@ -352,7 +352,7 @@ trans_listen(struct trans* self, char* port)
|
||||
{
|
||||
self->sck = g_tcp_socket();
|
||||
g_tcp_set_non_blocking(self->sck);
|
||||
if (g_tcp_bind(self->sck, port) == 0)
|
||||
if (g_tcp_bind_address(self->sck, port, address) == 0)
|
||||
{
|
||||
if (g_tcp_listen(self->sck) == 0)
|
||||
{
|
||||
@ -384,6 +384,13 @@ trans_listen(struct trans* self, char* port)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int APP_CC
|
||||
trans_listen(struct trans* self, char* port)
|
||||
{
|
||||
return trans_listen_address(self, port, "0.0.0.0");
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
struct stream* APP_CC
|
||||
trans_get_in_s(struct trans* self)
|
||||
|
@ -79,6 +79,8 @@ int APP_CC
|
||||
trans_connect(struct trans* self, const char* server, const char* port,
|
||||
int timeout);
|
||||
int APP_CC
|
||||
trans_listen_address(struct trans* self, char* port, const char* address);
|
||||
int APP_CC
|
||||
trans_listen(struct trans* self, char* port);
|
||||
struct stream* APP_CC
|
||||
trans_get_in_s(struct trans* self);
|
||||
|
@ -119,7 +119,8 @@ xrdp_process_run(void* in_val)
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
xrdp_listen_get_port(char* port, int port_bytes)
|
||||
xrdp_listen_get_port_address(char* port, int port_bytes,
|
||||
char* address, int address_bytes)
|
||||
{
|
||||
int fd;
|
||||
int error;
|
||||
@ -131,7 +132,9 @@ xrdp_listen_get_port(char* port, int port_bytes)
|
||||
|
||||
/* default to port 3389 */
|
||||
g_strncpy(port, "3389", port_bytes - 1);
|
||||
/* see if port is in xrdp.ini file */
|
||||
/* Default to all */
|
||||
g_strncpy(address, "0.0.0.0", address_bytes - 1);
|
||||
/* see if port or address is in xrdp.ini file */
|
||||
g_snprintf(cfg_file, 255, "%s/xrdp.ini", XRDP_CFG_PATH);
|
||||
fd = g_file_open(cfg_file);
|
||||
if (fd > 0)
|
||||
@ -155,7 +158,11 @@ xrdp_listen_get_port(char* port, int port_bytes)
|
||||
{
|
||||
g_strncpy(port, val, port_bytes - 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (g_strcasecmp(val, "address") == 0)
|
||||
{
|
||||
val = (char*)list_get_item(values, index);
|
||||
g_strncpy(address, val, address_bytes - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -203,6 +210,7 @@ xrdp_listen_main_loop(struct xrdp_listen* self)
|
||||
int cont;
|
||||
int timeout;
|
||||
char port[8];
|
||||
char address[256];
|
||||
tbus robjs[8];
|
||||
tbus term_obj;
|
||||
tbus sync_obj;
|
||||
@ -210,13 +218,14 @@ xrdp_listen_main_loop(struct xrdp_listen* self)
|
||||
tbus done_obj;
|
||||
|
||||
self->status = 1;
|
||||
if (xrdp_listen_get_port(port, sizeof(port)) != 0)
|
||||
if (xrdp_listen_get_port_address(port, sizeof(port),
|
||||
address, sizeof(address)) != 0)
|
||||
{
|
||||
g_writeln("xrdp_listen_main_loop: xrdp_listen_get_port failed");
|
||||
self->status = -1;
|
||||
return 1;
|
||||
}
|
||||
error = trans_listen(self->listen_trans, port);
|
||||
error = trans_listen_address(self->listen_trans, port,address);
|
||||
if (error == 0)
|
||||
{
|
||||
self->listen_trans->trans_conn_in = xrdp_listen_conn_in;
|
||||
|
Loading…
Reference in New Issue
Block a user