diff -urN atftp.old/tftp.c atftp.dev/tftp.c --- atftp.old/tftp.c 2006-03-25 16:41:49.000000000 +0100 +++ atftp.dev/tftp.c 2006-03-25 18:10:04.000000000 +0100 @@ -967,6 +967,7 @@ { "tftp-timeout", 1, NULL, 'T'}, { "mode", 1, NULL, 'M'}, { "option", 1, NULL, 'O'}, + { "retry", 1, NULL, 'R'}, #if 1 { "timeout", 1, NULL, 't'}, { "blksize", 1, NULL, 'b'}, @@ -986,11 +987,16 @@ }; /* Support old argument until 0.8 */ - while ((c = getopt_long(argc, argv, /*"gpl:r:Vh"*/ "gpl:r:Vht:b:sm", + while ((c = getopt_long(argc, argv, /*"gpl:r:Vh"*/ "gpl:r:Vht:b:smR:", options, &option_index)) != EOF) { switch (c) { + case 'R': + snprintf(string, sizeof(string), "option retry %s", optarg); + make_arg(string, &ac, &av); + process_cmd(ac, av); + break; case 'g': interactive = 0; if ((action == PUT) || (action == MGET)) diff -urN atftp.old/tftp_def.c atftp.dev/tftp_def.c --- atftp.old/tftp_def.c 2004-02-13 04:16:09.000000000 +0100 +++ atftp.dev/tftp_def.c 2006-03-25 18:10:04.000000000 +0100 @@ -37,6 +37,7 @@ { "timeout", "5", 0, 1 }, /* 2348, 2349, 2090. */ { "blksize", "512", 0, 1 }, /* This is the default option */ { "multicast", "", 0, 1 }, /* structure */ + { "retry", "5", 0, 1 }, { "", "", 0, 0} }; diff -urN atftp.old/tftp_def.h atftp.dev/tftp_def.h --- atftp.old/tftp_def.h 2004-02-13 04:16:09.000000000 +0100 +++ atftp.dev/tftp_def.h 2006-03-25 17:19:15.000000000 +0100 @@ -40,7 +40,8 @@ #define OPT_TIMEOUT 3 #define OPT_BLKSIZE 4 #define OPT_MULTICAST 5 -#define OPT_NUMBER 7 +#define OPT_RETRY 6 +#define OPT_NUMBER 8 #define OPT_SIZE 12 #define VAL_SIZE MAXLEN diff -urN atftp.old/tftp_file.c atftp.dev/tftp_file.c --- atftp.old/tftp_file.c 2004-02-13 04:16:09.000000000 +0100 +++ atftp.dev/tftp_file.c 2006-03-25 18:10:04.000000000 +0100 @@ -123,6 +123,7 @@ struct tftphdr *tftphdr = (struct tftphdr *)data->data_buffer; FILE *fp = NULL; /* the local file pointer */ int number_of_timeout = 0; + int num_retry = atoi(data->tftp_options[OPT_RETRY].value); int convert = 0; /* if true, do netascii convertion */ int oacks = 0; /* count OACK for improved error checking */ @@ -141,7 +142,7 @@ int prev_block_number = 0; /* needed to support netascii convertion */ int temp = 0; - + data->file_size = 0; tftp_cancel = 0; from.sin_addr.s_addr = 0; @@ -288,7 +289,7 @@ case GET_TIMEOUT: number_of_timeout++; fprintf(stderr, "timeout: retrying...\n"); - if (number_of_timeout > NB_OF_RETRY) + if ((num_retry > 0) && (number_of_timeout > num_retry)) state = S_ABORT; else state = timeout_state; @@ -325,7 +326,7 @@ number_of_timeout++; fprintf(stderr, "tftp: packet discard <%s:%d>.\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port)); - if (number_of_timeout > NB_OF_RETRY) + if ((num_retry > 0) && (number_of_timeout > num_retry)) state = S_ABORT; break; case ERR: @@ -614,6 +615,7 @@ struct tftphdr *tftphdr = (struct tftphdr *)data->data_buffer; FILE *fp; /* the local file pointer */ int number_of_timeout = 0; + int num_retry = atoi(data->tftp_options[OPT_RETRY].value); struct stat file_stat; int convert = 0; /* if true, do netascii convertion */ char string[MAXLEN]; @@ -751,7 +753,7 @@ case GET_TIMEOUT: number_of_timeout++; fprintf(stderr, "timeout: retrying...\n"); - if (number_of_timeout > NB_OF_RETRY) + if ((num_retry > 0) && (number_of_timeout > num_retry)) state = S_ABORT; else state = timeout_state; @@ -797,7 +799,7 @@ number_of_timeout++; fprintf(stderr, "tftp: packet discard <%s:%d>.\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port)); - if (number_of_timeout > NB_OF_RETRY) + if ((num_retry > 0) && (number_of_timeout > num_retry)) state = S_ABORT; break; case ERR: