1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
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:
|