Index: atftp-0.7/tftp.c =================================================================== --- atftp-0.7.orig/tftp.c 2007-08-02 23:04:23.000000000 +0200 +++ atftp-0.7/tftp.c 2007-08-02 23:04:23.000000000 +0200 @@ -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)) Index: atftp-0.7/tftp_def.c =================================================================== --- atftp-0.7.orig/tftp_def.c 2007-08-02 23:04:23.000000000 +0200 +++ atftp-0.7/tftp_def.c 2007-08-02 23:04:23.000000000 +0200 @@ -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} }; Index: atftp-0.7/tftp_def.h =================================================================== --- atftp-0.7.orig/tftp_def.h 2007-08-02 23:04:23.000000000 +0200 +++ atftp-0.7/tftp_def.h 2007-08-02 23:04:23.000000000 +0200 @@ -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 Index: atftp-0.7/tftp_file.c =================================================================== --- atftp-0.7.orig/tftp_file.c 2007-08-02 23:04:23.000000000 +0200 +++ atftp-0.7/tftp_file.c 2007-08-02 23:04:23.000000000 +0200 @@ -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: