new version of the terminal command "router" :all packets are put in one buffer
authorluc@dev1
Fri Jul 11 11:29:07 2008 +0200 (8 weeks ago)
changeset 15623f06f04824
parent 142ec57ff0ff2d
child 1619b681e56c37
new version of the terminal command "router" :all packets are put in one buffer
src/router.c
--- a/src/router.c Tue Jul 01 10:41:42 2008 +0200
+++ b/src/router.c Fri Jul 11 11:29:07 2008 +0200
@@ -35,7 +35,7 @@
#endif
#define BUFFER_SIZE 1200
-
+#define MAX_BUFFER_SIZE 5000
/* Exit code */
#define CMD_VALID 0
#define CMD_SUCCESS 0
@@ -228,7 +228,7 @@ static int read_fd (int fd, char *buffer
}
static int wait_answer (int sock, struct sockaddr_in *router_sockaddr, char *buffer,
- int buffer_size, int *answer_size,int packets_received)
+ int buffer_size, int *temporary_answer_size,int packets_received)
{
int ret;
int count=1;
@@ -262,11 +262,11 @@ static int wait_answer (int sock, struct
/* Read the command answer */
if (FD_ISSET (sock, &fds))
{
- *answer_size = recv_udp (sock, buffer, buffer_size, &sockaddr);
- if (*answer_size < 0)
+ *temporary_answer_size = recv_udp (sock, buffer, buffer_size, &sockaddr);
+ if (*temporary_answer_size < 0)
{
err("Fail to read command answer (errno=%d)", errno);
- return (*answer_size);
+ return (*temporary_answer_size);
}
/* Check the answer sender */
if ((sockaddr.sin_addr.s_addr != router_sockaddr->sin_addr.s_addr) ||
@@ -292,12 +292,13 @@ static int wait_answer (int sock, struct
int main(int argc, char **argv)
{
- int ret, cmd_size, answer_size;
+ int ret, cmd_size, temporary_answer_size,final_answer_size=0;
int router_sock;
int nb_write;
int packets_received=0;
char cmd_buffer[BUFFER_SIZE];
- char answer_buffer[BUFFER_SIZE];
+ char temporary_answer_buffer[BUFFER_SIZE];
+ char final_answer_buffer[MAX_BUFFER_SIZE];
char *router_addr = CPE_ADDR;
struct sockaddr_in router_sockaddr;
@@ -354,29 +355,52 @@ int main(int argc, char **argv)
/* Wait for the answer */
- ret = wait_answer (router_sock, &router_sockaddr, answer_buffer,BUFFER_SIZE, &answer_size,packets_received);
+ ret = wait_answer (router_sock, &router_sockaddr, temporary_answer_buffer,BUFFER_SIZE, &temporary_answer_size,packets_received);
while(ret==CMD_SUCCESS)
{
packets_received++;
- /* Print data on STDOUT */
- nb_write = write_fd (STDOUT_FILENO, answer_buffer, answer_size);
- if (nb_write < 0)
- {
- err("Fail to write answer on STDOUT (errno=%d)", errno);
- return (nb_write);
- }
- if (nb_write != answer_size)
- {
- err("Incomplete answer write on STDOUT (%d bytes instead of %d)",
- nb_write, answer_size);
- }
-
- ret = wait_answer (router_sock, &router_sockaddr, answer_buffer,BUFFER_SIZE, &answer_size,packets_received);
- }
+
+ if((final_answer_size+temporary_answer_size)>=MAX_BUFFER_SIZE-1)
+ {
+ err("Answer of the router is too long");
+ return(ret);
+ }
+
+ /*Add the answer to the final answer buffer */
+ if(final_answer_size==0)
+ {
+ strcpy(&(final_answer_buffer[final_answer_size]),temporary_answer_buffer);
+ }
+
+ else
+ {
+ final_answer_buffer[final_answer_size-1]='\n';
+ strcpy(&(final_answer_buffer[final_answer_size]),temporary_answer_buffer);
+ }
+ final_answer_size+=temporary_answer_size;
+ ret= wait_answer (router_sock, &router_sockaddr, temporary_answer_buffer,BUFFER_SIZE, &temporary_answer_size,packets_received);
+ }
+
+
if(ret==NO_MORE_PACKET)
{
- return(CMD_SUCCESS);
+ /* Print data on STDOUT */
+ nb_write = write_fd (STDOUT_FILENO, final_answer_buffer, final_answer_size);
+
+ if (nb_write < 0)
+ {
+ err("Fail to write answer on STDOUT (errno=%d)", errno);
+ return (nb_write);
+ }
+
+ if (nb_write != final_answer_size)
+ {
+ err("Incomplete answer write on STDOUT (%d bytes instead of %d)",nb_write, temporary_answer_size);
+ return(nb_write);
+ }
+
+ return(CMD_SUCCESS);
}
return (ret);