=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tftp/tftp.c,v retrieving revision 1.23 retrieving revision 1.24 diff -c -r1.23 -r1.24 *** src/usr.bin/tftp/tftp.c 2012/05/01 04:23:21 1.23 --- src/usr.bin/tftp/tftp.c 2014/10/21 06:15:16 1.24 *************** *** 1,4 **** ! /* $OpenBSD: tftp.c,v 1.23 2012/05/01 04:23:21 gsoares Exp $ */ /* $NetBSD: tftp.c,v 1.5 1995/04/29 05:55:25 cgd Exp $ */ /* --- 1,4 ---- ! /* $OpenBSD: tftp.c,v 1.24 2014/10/21 06:15:16 dlg Exp $ */ /* $NetBSD: tftp.c,v 1.5 1995/04/29 05:55:25 cgd Exp $ */ /* *************** *** 132,152 **** unsigned long amount; socklen_t fromlen; int convert; /* true if converting crlf -> lf */ ! int n, nfds, error, timeouts, block, size; startclock(); /* start stat's clock */ dp = r_init(); /* reset fillbuf/read-ahead code */ ap = (struct tftphdr *)ackbuf; file = fdopen(fd, "r"); convert = !strcmp(mode, "netascii"); - block = 0; amount = 0; memcpy(&peer, &peeraddr, peeraddr.ss_len); memset(&serv, 0, sizeof(serv)); do { /* read data from file */ ! if (!block) size = makerequest(WRQ, name, dp, mode) - 4; else { size = readit(file, &dp, convert, segment_size); --- 132,153 ---- unsigned long amount; socklen_t fromlen; int convert; /* true if converting crlf -> lf */ ! int n, nfds, error, timeouts, size; ! uint16_t block = 0; ! int firsttrip = 1; startclock(); /* start stat's clock */ dp = r_init(); /* reset fillbuf/read-ahead code */ ap = (struct tftphdr *)ackbuf; file = fdopen(fd, "r"); convert = !strcmp(mode, "netascii"); amount = 0; memcpy(&peer, &peeraddr, peeraddr.ss_len); memset(&serv, 0, sizeof(serv)); do { /* read data from file */ ! if (firsttrip) size = makerequest(WRQ, name, dp, mode) - 4; else { size = readit(file, &dp, convert, segment_size); *************** *** 155,161 **** break; } dp->th_opcode = htons((u_short)DATA); ! dp->th_block = htons((u_short)block); } /* send data to server and wait for server ACK */ --- 156,162 ---- break; } dp->th_opcode = htons((u_short)DATA); ! dp->th_block = htons(block); } /* send data to server and wait for server ACK */ *************** *** 174,180 **** warn("sendto"); goto abort; } ! if (block > 0) read_ahead(file, convert, segment_size); } error = 0; --- 175,181 ---- warn("sendto"); goto abort; } ! if (!firsttrip) read_ahead(file, convert, segment_size); } error = 0; *************** *** 246,255 **** error = 1; /* received packet does not match */ } ! if (block > 0) amount += size; block++; ! } while ((size == segment_size || block == 1) && !intrflag); abort: fclose(file); --- 247,259 ---- error = 1; /* received packet does not match */ } ! if (firsttrip) { ! size = segment_size; ! firsttrip = 0; ! } else amount += size; block++; ! } while ((size == segment_size) && !intrflag); abort: fclose(file); *************** *** 274,281 **** unsigned long amount; socklen_t fromlen; int convert; /* true if converting crlf -> lf */ ! int n, nfds, error, timeouts, block, size; int firsttrip; startclock(); /* start stat's clock */ dp = w_init(); /* reset fillbuf/read-ahead code */ --- 278,286 ---- unsigned long amount; socklen_t fromlen; int convert; /* true if converting crlf -> lf */ ! int n, nfds, error, timeouts, size; int firsttrip; + uint16_t block; startclock(); /* start stat's clock */ dp = w_init(); /* reset fillbuf/read-ahead code */ *************** *** 297,303 **** firsttrip = 0; } else { ap->th_opcode = htons((u_short)ACK); ! ap->th_block = htons((u_short)(block)); size = 4; block++; } --- 302,308 ---- firsttrip = 0; } else { ap->th_opcode = htons((u_short)ACK); ! ap->th_block = htons(block); size = 4; block++; } *************** *** 402,408 **** abort: /* ok to ack, since user has seen err msg */ ap->th_opcode = htons((u_short)ACK); ! ap->th_block = htons((u_short)block); (void)sendto(f, ackbuf, 4, 0, (struct sockaddr *)&peer, peer.ss_len); write_behind(file, convert); /* flush last buffer */ --- 407,413 ---- abort: /* ok to ack, since user has seen err msg */ ap->th_opcode = htons((u_short)ACK); ! ap->th_block = htons(block); (void)sendto(f, ackbuf, 4, 0, (struct sockaddr *)&peer, peer.ss_len); write_behind(file, convert); /* flush last buffer */