#include <sys/socket.h> if it exists;

Add option to control the max blksize negotiated.
This commit is contained in:
hpa 2003-08-23 00:31:20 +00:00
parent b3941f251a
commit 530706aebe
6 changed files with 49 additions and 9 deletions

View file

@ -1,5 +1,10 @@
$Id$
Changes in 0.35:
Add an option to control the maximum value of blksize
negotiated.
Changes in 0.34:
Additional Solaris gcc compiler bug workarounds; these
actually make the code somewhat cleaner.

View file

@ -96,7 +96,17 @@
#include <errno.h>
#include <signal.h>
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#else
#ifdef HAVE_WINSOCK2_H
#include <winsock2.h>
#else
#ifdef HAVE_WINSOCK_H
#include <winsock.h>
#endif
#endif
#endif
/* Test for EAGAIN/EWOULDBLOCK */
#ifdef EAGAIN

View file

@ -77,6 +77,9 @@ AC_CHECK_HEADERS(arpa/inet.h)
AC_HEADER_TIME
dnl This is needed on some versions of FreeBSD...
AC_CHECK_HEADERS(machine/param.h)
AC_CHECK_HEADERS(sys/socket.h)
AC_CHECK_HEADERS(winsock2.h)
AC_CHECK_HEADERS(winsock.h)
AC_CHECK_TYPES(intmax_t)
AC_CHECK_TYPES(long long)
@ -89,7 +92,7 @@ AC_TYPE_PID_T
AC_TYPE_MODE_T
AC_TYPE_SIZE_T
AC_SEARCH_LIBS(socket, socket, , [AC_MSG_ERROR(socket library not found)])
AC_SEARCH_LIBS(socket, [socket ws2_32 wsock32], , [AC_MSG_ERROR(socket library not found)])
AC_SEARCH_LIBS(gethostbyname, [nsl resolv], , [AC_MSG_ERROR(gethostbyname not found)])
AC_SEARCH_LIBS(inet_aton, [nsl resolv], , [AC_MSG_ERROR(inet_aton not found)])
AC_SEARCH_LIBS(herror, [nsl resolv], , [AC_MSG_ERROR(herror not found)])

View file

@ -150,6 +150,15 @@ This flag can be specified multiple times for even higher verbosity.
Indicate that a specific RFC 2347 TFTP option should never be
accepted.
.TP
\fB\-B\fP \fImax-block-size\fP
Specifies the maximum permitted block size. The permitted range for
this parameter is from 512 to 65464. Some embedded clients request
large block sizes and yet do not handle fragmented packets correctly;
for these clients, it is recommended to set this value to the smallest
MTU on your network minus 32 bytes (20 bytes for IP, 8 for UDP, and 4
for TFTP; less if you use IP options on your network.) For example,
on a standard Ethernet (MTU 1500) a value of 1468 is reasonable.
.TP
.B \-V
Print the version number and configuration to standard output, then
exit gracefully.

View file

@ -94,6 +94,8 @@ sigjmp_buf timeoutbuf;
#define PKTSIZE MAX_SEGSIZE+4
char buf[PKTSIZE];
char ackbuf[PKTSIZE];
unsigned int max_blksize = MAX_SEGSIZE;
struct sockaddr_in from;
int fromlen;
off_t tsize;
@ -279,7 +281,7 @@ main(int argc, char **argv)
openlog(__progname, LOG_PID|LOG_NDELAY, LOG_DAEMON);
while ((c = getopt(argc, argv, "cspvVla:u:U:r:t:T:m:")) != -1)
while ((c = getopt(argc, argv, "cspvVla:B:u:U:r:t:T:m:")) != -1)
switch (c) {
case 'c':
cancreate = 1;
@ -299,6 +301,17 @@ main(int argc, char **argv)
case 't':
waittime = atoi(optarg);
break;
case 'B':
{
char *vp;
max_blksize = (unsigned int)strtoul(optarg, &vp, 10);
if ( max_blksize < 512 || max_blksize > MAX_SEGSIZE || *vp ) {
syslog(LOG_ERR, "Bad maximum blocksize value (range 512-%d): %s",
MAX_SEGSIZE, optarg);
exit(EX_USAGE);
}
}
break;
case 'T':
{
char *vp;
@ -817,8 +830,8 @@ set_blksize(char *val, char **ret)
if (sz < 8)
return(0);
else if (sz > MAX_SEGSIZE)
sz = MAX_SEGSIZE;
else if (sz > max_blksize)
sz = max_blksize;
segsize = sz;
sprintf(*ret = b_ret, "%u", sz);
@ -845,8 +858,8 @@ set_blksize2(char *val, char **ret)
if (sz < 8)
return(0);
else if (sz > MAX_SEGSIZE)
sz = MAX_SEGSIZE;
else if (sz > max_blksize)
sz = max_blksize;
/* Convert to a power of two */
if ( sz & (sz-1) ) {

View file

@ -1 +1 @@
0.34
0.35