summaryrefslogtreecommitdiffstats
path: root/src/proto
diff options
context:
space:
mode:
authorMichael Brown2005-06-01 21:13:06 +0200
committerMichael Brown2005-06-01 21:13:06 +0200
commit698e87277ff3af1849d3173496631dfb5caa36e3 (patch)
treec5c8b22f93119e34490c58ad4af6e4831826adaf /src/proto
parentMake rfc2090 multicast option optional (diff)
downloadipxe-698e87277ff3af1849d3173496631dfb5caa36e3.tar.gz
ipxe-698e87277ff3af1849d3173496631dfb5caa36e3.tar.xz
ipxe-698e87277ff3af1849d3173496631dfb5caa36e3.zip
Don't try to fetch another packet once we've reached EOF.
Diffstat (limited to 'src/proto')
-rw-r--r--src/proto/tftp.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/proto/tftp.c b/src/proto/tftp.c
index 9231c516..3f6bf35a 100644
--- a/src/proto/tftp.c
+++ b/src/proto/tftp.c
@@ -35,7 +35,7 @@
* False return value always indicates an error that should abort the
* transfer.
*/
-static inline int process_tftp_data ( struct tftp_state *state,
+static inline int tftp_process_data ( struct tftp_state *state,
struct tftp_data *data,
struct buffer *buffer,
int *eof ) {
@@ -97,18 +97,18 @@ static int tftp ( char *url __unused, struct sockaddr_in *server, char *file,
state.server = *server;
/* Open the file */
- if ( ! tftp_open ( &state, file, &reply ) ) {
+ if ( ! tftp_open ( &state, file, &reply, 0 ) ) {
DBG ( "TFTP: could not open %@:%d/%s : %m\n",
server->sin_addr.s_addr, server->sin_port, file );
return 0;
}
/* Fetch file, a block at a time */
- do {
+ while ( 1 ) {
twiddle();
switch ( ntohs ( reply->common.opcode ) ) {
case TFTP_DATA:
- if ( ! process_tftp_data ( &state, &reply->data,
+ if ( ! tftp_process_data ( &state, &reply->data,
buffer, &eof ) ) {
tftp_error ( &state, TFTP_ERR_ILLEGAL_OP,
NULL );
@@ -138,13 +138,19 @@ static int tftp ( char *url __unused, struct sockaddr_in *server, char *file,
tftp_error ( &state, TFTP_ERR_ILLEGAL_OP, NULL );
return 0;
}
+ /* If we have reached EOF, stop here */
+ if ( eof )
+ break;
/* Fetch the next data block */
if ( ! tftp_ack ( &state, &reply ) ) {
DBG ( "TFTP: could not get next block: %m\n" );
- tftp_error ( &state, TFTP_ERR_ILLEGAL_OP, NULL );
+ if ( ! reply ) {
+ tftp_error ( &state, TFTP_ERR_ILLEGAL_OP,
+ NULL );
+ }
return 0;
}
- } while ( ! eof );
+ }
/* ACK the final packet, as a courtesy to the server */
tftp_ack_nowait ( &state );