mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 18:28:25 +00:00
import of dnsmasq-2.51.tar.gz
This commit is contained in:
24
src/tftp.c
24
src/tftp.c
@@ -46,12 +46,13 @@ void tftp_request(struct listener *listen, time_t now)
|
||||
struct sockaddr_in addr, peer;
|
||||
struct msghdr msg;
|
||||
struct iovec iov;
|
||||
int is_err = 1, if_index = 0;
|
||||
struct ifreq ifr;
|
||||
int is_err = 1, if_index = 0, mtu = 0;
|
||||
struct iname *tmp;
|
||||
struct tftp_transfer *transfer;
|
||||
int port = daemon->start_tftp_port; /* may be zero to use ephemeral port */
|
||||
#if defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)
|
||||
int mtu = IP_PMTUDISC_DONT;
|
||||
int mtuflag = IP_PMTUDISC_DONT;
|
||||
#endif
|
||||
|
||||
union {
|
||||
@@ -83,7 +84,10 @@ void tftp_request(struct listener *listen, time_t now)
|
||||
return;
|
||||
|
||||
if (daemon->options & OPT_NOWILD)
|
||||
addr = listen->iface->addr.in;
|
||||
{
|
||||
addr = listen->iface->addr.in;
|
||||
mtu = listen->iface->mtu;
|
||||
}
|
||||
else
|
||||
{
|
||||
char name[IF_NAMESIZE];
|
||||
@@ -125,7 +129,10 @@ void tftp_request(struct listener *listen, time_t now)
|
||||
for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
|
||||
if (tmp->name && (strcmp(tmp->name, name) == 0))
|
||||
return;
|
||||
|
||||
|
||||
strncpy(name, ifr.ifr_name, IF_NAMESIZE);
|
||||
if (ioctl(listen->tftpfd, SIOCGIFMTU, &ifr) != -1)
|
||||
mtu = ifr.ifr_mtu;
|
||||
}
|
||||
|
||||
addr.sin_port = htons(port);
|
||||
@@ -158,7 +165,7 @@ void tftp_request(struct listener *listen, time_t now)
|
||||
{
|
||||
if (bind(transfer->sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1 ||
|
||||
#if defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)
|
||||
setsockopt(transfer->sockfd, SOL_IP, IP_MTU_DISCOVER, &mtu, sizeof(mtu)) == -1 ||
|
||||
setsockopt(transfer->sockfd, SOL_IP, IP_MTU_DISCOVER, &mtuflag, sizeof(mtuflag)) == -1 ||
|
||||
#endif
|
||||
!fix_fd(transfer->sockfd))
|
||||
{
|
||||
@@ -202,6 +209,9 @@ void tftp_request(struct listener *listen, time_t now)
|
||||
transfer->blocksize = 1;
|
||||
if (transfer->blocksize > (unsigned)daemon->packet_buff_sz - 4)
|
||||
transfer->blocksize = (unsigned)daemon->packet_buff_sz - 4;
|
||||
/* 32 bytes for IP, UDP and TFTP headers */
|
||||
if (mtu != 0 && transfer->blocksize > (unsigned)mtu - 32)
|
||||
transfer->blocksize = (unsigned)mtu - 32;
|
||||
transfer->opt_blocksize = 1;
|
||||
transfer->block = 0;
|
||||
}
|
||||
@@ -213,6 +223,10 @@ void tftp_request(struct listener *listen, time_t now)
|
||||
}
|
||||
}
|
||||
|
||||
/* cope with backslashes from windows boxen. */
|
||||
while ((p = strchr(filename, '\\')))
|
||||
*p = '/';
|
||||
|
||||
strcpy(daemon->namebuff, "/");
|
||||
if (daemon->tftp_prefix)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user