aboutsummaryrefslogtreecommitdiff
path: root/networking/tftp.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/tftp.c')
-rw-r--r--networking/tftp.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/networking/tftp.c b/networking/tftp.c
index 0b25f752d..ac3a86afb 100644
--- a/networking/tftp.c
+++ b/networking/tftp.c
@@ -23,10 +23,10 @@
#if ENABLE_FEATURE_TFTP_GET || ENABLE_FEATURE_TFTP_PUT
-#define TFTP_BLOCKSIZE_DEFAULT 512 /* according to RFC 1350, don't change */
-#define TFTP_TIMEOUT 50000 /* 50ms, in microseconds */
-#define TFTP_MAXTIMEOUT 999000 /* about 1 second, in microseconds */
-#define TFTP_NUM_RETRIES 12 /* number of backed-off retries */
+#define TFTP_BLOCKSIZE_DEFAULT 512 /* according to RFC 1350, don't change */
+#define TFTP_TIMEOUT_MS 50
+#define TFTP_MAXTIMEOUT_MS 2000
+#define TFTP_NUM_RETRIES 12 /* number of backed-off retries */
/* opcodes we support */
#define TFTP_RRQ 1
@@ -114,9 +114,8 @@ static int tftp( USE_GETPUT(const int cmd,)
const char *remotefile, const int localfd,
unsigned port, int tftp_bufsize)
{
- struct timeval tv;
- fd_set rfds;
- int socketfd;
+ struct pollfd pfd[1];
+#define socketfd (pfd[0].fd)
int len;
int send_len;
USE_FEATURE_TFTP_BLOCKSIZE(smallint want_option_ack = 0;)
@@ -124,7 +123,7 @@ static int tftp( USE_GETPUT(const int cmd,)
uint16_t opcode;
uint16_t block_nr = 1;
uint16_t recv_blk;
- int retries, waittime;
+ int retries, waittime_ms;
char *cp;
unsigned org_port;
@@ -208,7 +207,7 @@ static int tftp( USE_GETPUT(const int cmd,)
* for potential resend */
retries = TFTP_NUM_RETRIES; /* re-initialize */
- waittime = TFTP_TIMEOUT;
+ waittime_ms = TFTP_TIMEOUT_MS;
send_again:
#if ENABLE_DEBUG_TFTP
@@ -224,11 +223,9 @@ static int tftp( USE_GETPUT(const int cmd,)
recv_again:
/* Receive packet */
- tv.tv_sec = 0;
- tv.tv_usec = waittime;
- FD_ZERO(&rfds);
- FD_SET(socketfd, &rfds);
- switch (select(socketfd + 1, &rfds, NULL, NULL, &tv)) {
+ /*pfd[0].fd = socketfd;*/
+ pfd[0].events = POLLIN;
+ switch (poll(pfd, 1, waittime_ms)) {
unsigned from_port;
case 1:
from->len = peer_lsa->len;
@@ -258,14 +255,14 @@ static int tftp( USE_GETPUT(const int cmd,)
}
/* exponential backoff with limit */
- waittime += waittime/2;
- if (waittime > TFTP_MAXTIMEOUT) {
- waittime = TFTP_MAXTIMEOUT;
+ waittime_ms += waittime_ms/2;
+ if (waittime_ms > TFTP_MAXTIMEOUT_MS) {
+ waittime_ms = TFTP_MAXTIMEOUT_MS;
}
goto send_again; /* resend last sent pkt */
default:
- bb_perror_msg("select");
+ bb_perror_msg("poll");
goto ret;
}
process_pkt: