add functions for printf'ing to a tcp_queue and a function for moving a queue onto the output queue

This commit is contained in:
Andreas Öman 2007-11-04 09:34:35 +00:00
parent 3725d4d544
commit 217cb2b318
2 changed files with 60 additions and 4 deletions

56
tcp.c
View file

@ -33,6 +33,34 @@
#include "tcp.h"
/*
* printf data on a TCP queue
*/
void
tcp_qprintf(tcp_queue_t *tq, const char *fmt, ...)
{
va_list ap;
char buf[5000];
void *out;
tcp_data_t *td;
td = malloc(sizeof(tcp_data_t));
td->td_offset = 0;
va_start(ap, fmt);
td->td_datalen = vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
out = malloc(td->td_datalen);
memcpy(out, buf, td->td_datalen);
td->td_data = out;
TAILQ_INSERT_TAIL(&tq->tq_messages, td, td_link);
tq->tq_depth += td->td_datalen;
}
/*
* printfs data on a TCP connection
*/
@ -54,8 +82,6 @@ tcp_printf(tcp_session_t *ses, const char *fmt, ...)
tcp_send_msg(ses, &ses->tcp_q_hi, out, l);
}
/**
* Line parser for TCP based connections. Note that callback cannot
* destroy the session on its own. It must return an error to perform
@ -115,7 +141,7 @@ tcp_line_read(tcp_session_t *ses, tcp_line_input_t *callback)
/**
* Create an output queue
*/
static void
void
tcp_init_queue(tcp_queue_t *tq, int maxdepth)
{
TAILQ_INIT(&tq->tq_messages);
@ -126,7 +152,7 @@ tcp_init_queue(tcp_queue_t *tq, int maxdepth)
/**
* Flusing all pending data from a queue
*/
static void
void
tcp_flush_queue(tcp_queue_t *tq)
{
tcp_data_t *td;
@ -233,6 +259,28 @@ tcp_send_msg(tcp_session_t *ses, tcp_queue_t *tq, const void *data,
}
/*
* Move a tcp queue onto a session
*/
void
tcp_output_queue(tcp_session_t *ses, tcp_queue_t *dst, tcp_queue_t *src)
{
tcp_data_t *td;
if(dst == NULL)
dst = &ses->tcp_q_low;
while((td = TAILQ_FIRST(&src->tq_messages)) != NULL) {
TAILQ_REMOVE(&src->tq_messages, td, td_link);
TAILQ_INSERT_TAIL(&dst->tq_messages, td, td_link);
dst->tq_depth += td->td_datalen;
}
if(!ses->tcp_blocked)
tcp_transmit(ses);
src->tq_depth = 0;
}
/**
* Disconnect handler

8
tcp.h
View file

@ -74,6 +74,10 @@ typedef struct tcp_session {
} tcp_session_t;
void tcp_init_queue(tcp_queue_t *tq, int maxdepth);
void tcp_flush_queue(tcp_queue_t *tq);
void tcp_disconnect(tcp_session_t *ses, int err);
void tcp_create_server(int port, size_t session_size, const char *name,
@ -88,4 +92,8 @@ int tcp_send_msg(tcp_session_t *ses, tcp_queue_t *tq, const void *data,
void tcp_printf(tcp_session_t *ses, const char *fmt, ...);
void tcp_qprintf(tcp_queue_t *tq, const char *fmt, ...);
void tcp_output_queue(tcp_session_t *ses, tcp_queue_t *dst, tcp_queue_t *src);
#endif /* TCP_H_ */