modification de la commande router pour le router libre
authorluc@dev1
Tue Jul 01 10:41:42 2008 +0200 (2 months ago)
changeset 142ec57ff0ff2d
parent 137e03f89592c4
child 15623f06f04824
modification de la commande router pour le router libre
src/router.c
--- a/src/router.c Wed Dec 19 19:28:13 2007 +0100
+++ b/src/router.c Tue Jul 01 10:41:42 2008 +0200
@@ -44,11 +44,12 @@
#define BAD_CMD_SIZE 3
#define CMD_TIMEOUT 2
#define ROUTER_SPOOF 5
-
+#define NO_MORE_PACKET 7
#define DELAY 5
/* Special buffer size */
#define UNLIMITED 0
+
struct cmd_router
{
@@ -71,6 +72,8 @@ static struct cmd_router cmd_router_list
{"term", 1, 1},
{"testadsl", 0, 1},
{"tftp", 0, 0},
+ {"flash", 0, 7},
+
};
int verbose_flag = 0;
@@ -84,7 +87,7 @@ static int build_cmd_buffer (int, char *
static int build_cmd_buffer (int, char **, char *, int, int *);
static int write_fd (int, char *, int);
static int read_fd (int, char *, int);
-static int wait_answer (int, struct sockaddr_in *, char *, int, int *);
+static int wait_answer (int, struct sockaddr_in *, char *, int, int *,int);
static int parse_router_cmd (int argc, char **argv)
{
@@ -224,10 +227,11 @@ static int read_fd (int fd, char *buffer
return (nb_read);
}
-static int wait_answer (int sock, struct sockaddr_in *router_sockaddr, char *buffer, int buffer_size, int *answer_size)
+static int wait_answer (int sock, struct sockaddr_in *router_sockaddr, char *buffer,
+ int buffer_size, int *answer_size,int packets_received)
{
int ret;
- int count = 3;
+ int count=1;
fd_set fds;
struct timeval tv;
struct sockaddr_in sockaddr;
@@ -235,9 +239,15 @@ static int wait_answer (int sock, struct
FD_ZERO (&fds);
FD_SET(sock, &fds);
- tv.tv_sec = DELAY;
+ tv.tv_sec = 1;
tv.tv_usec = 0;
-
+
+ if(packets_received==0)
+ {
+ count=10;
+ tv.tv_sec=DELAY;
+ }
+
do
{
ret = select (sock + 1, &fds, NULL, NULL, &tv);
@@ -268,7 +278,12 @@ static int wait_answer (int sock, struct
}
return (CMD_SUCCESS);
}
-
+
+ if(packets_received!=0)
+ {
+ return(NO_MORE_PACKET);
+ }
+
/* Timer expiration */
err("Command timeout");
@@ -280,6 +295,7 @@ int main(int argc, char **argv)
int ret, cmd_size, answer_size;
int router_sock;
int nb_write;
+ int packets_received=0;
char cmd_buffer[BUFFER_SIZE];
char answer_buffer[BUFFER_SIZE];
char *router_addr = CPE_ADDR;
@@ -337,15 +353,12 @@ int main(int argc, char **argv)
}
/* Wait for the answer */
- do
- {
- ret = wait_answer (router_sock,
- &router_sockaddr, answer_buffer,
- BUFFER_SIZE, &answer_size);
- if (ret != CMD_SUCCESS)
- {
- return (ret);
- }
+
+ ret = wait_answer (router_sock, &router_sockaddr, answer_buffer,BUFFER_SIZE, &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)
@@ -355,11 +368,16 @@ int main(int argc, char **argv)
}
if (nb_write != answer_size)
{
- err("Incomplete answer write on STDOUT (%d bytes instead of %d)",
- nb_write, answer_size);
- }
- } while (answer_size == BUFFER_SIZE);
-
- return (CMD_SUCCESS);
-}
-
+ 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(ret==NO_MORE_PACKET)
+ {
+ return(CMD_SUCCESS);
+ }
+
+return (ret);
+}