Add support for disabling/enabling a tcp client

This commit is contained in:
Andreas Öman 2008-05-17 07:45:33 +00:00
parent 27b9a91851
commit 1080cff57f
2 changed files with 43 additions and 5 deletions

40
tcp.c
View file

@ -526,6 +526,8 @@ tcp_session_peer_resolved(void *aux, struct sockaddr *so, const char *error)
tcp_session_t *c = aux;
struct sockaddr_in *si;
c->tcp_resolver = NULL;
if(error != NULL) {
syslog(LOG_ERR, "%s: Unable to resolve \"%s\" -- %s",
c->tcp_name, c->tcp_hostname, error);
@ -569,7 +571,8 @@ tcp_session_peer_resolved(void *aux, struct sockaddr *so, const char *error)
static void
tcp_session_try_connect(tcp_session_t *c)
{
async_resolve(c->tcp_hostname, tcp_session_peer_resolved, c);
c->tcp_resolver =
async_resolve(c->tcp_hostname, tcp_session_peer_resolved, c);
}
@ -589,7 +592,7 @@ tcp_client_reconnect_timeout(void *aux, int64_t now)
*/
void *
tcp_create_client(const char *hostname, int port, size_t session_size,
const char *name, tcp_callback_t *cb)
const char *name, tcp_callback_t *cb, int enabled)
{
tcp_session_t *c = calloc(1, session_size);
@ -597,8 +600,10 @@ tcp_create_client(const char *hostname, int port, size_t session_size,
c->tcp_name = strdup(name);
c->tcp_port = port;
c->tcp_hostname = strdup(hostname);
c->tcp_enabled = enabled;
tcp_session_try_connect(c);
if(c->tcp_enabled)
tcp_session_try_connect(c);
return c;
}
@ -689,6 +694,9 @@ tcp_create_server(int port, size_t session_size, const char *name,
void
tcp_destroy_client(tcp_session_t *ses)
{
if(ses->tcp_resolver != NULL)
async_resolve_cancel(ses->tcp_resolver);
if(ses->tcp_dispatch_handle != NULL)
tcp_disconnect(ses, 0);
@ -697,3 +705,29 @@ tcp_destroy_client(tcp_session_t *ses)
free(ses->tcp_hostname);
free(ses);
}
/**
*
*/
void
tcp_enable_disable(tcp_session_t *ses, int enabled)
{
if(ses->tcp_enabled == enabled)
return;
ses->tcp_enabled = enabled;
if(enabled) {
tcp_session_try_connect(ses);
} else {
if(ses->tcp_resolver != NULL) {
async_resolve_cancel(ses->tcp_resolver);
ses->tcp_resolver = NULL;
}
if(ses->tcp_dispatch_handle != NULL)
tcp_disconnect(ses, 0);
dtimer_disarm(&ses->tcp_timer);
}
}

8
tcp.h
View file

@ -64,11 +64,13 @@ typedef struct tcp_session {
/* These are only used when we spawn as a client */
int tcp_enabled;
dtimer_t tcp_timer;
char *tcp_name;
int tcp_port;
char *tcp_hostname;
void *tcp_resolver;
/* Output queueing */
int tcp_blocked;
@ -113,8 +115,10 @@ void tcp_qput(tcp_queue_t *tq, const uint8_t *buf, size_t len);
void tcp_output_queue(tcp_session_t *ses, tcp_queue_t *dst, tcp_queue_t *src);
void *tcp_create_client(const char *hostname, int port, size_t session_size,
const char *name, tcp_callback_t *cb);
const char *name, tcp_callback_t *cb, int enabled);
void tcp_destroy_client(tcp_session_t *ses);
void tcp_enable_disable(tcp_session_t *ses, int enabled);
#endif /* TCP_H_ */