From 61ce600b20a620c3c93a4e50b445812211bd0371 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Fri, 20 Apr 2012 21:28:49 +0100 Subject: [PATCH] --tftp-lowercase option. --- CHANGELOG | 3 +++ man/dnsmasq.8 | 6 ++++++ src/dnsmasq.h | 3 ++- src/option.c | 3 +++ src/tftp.c | 9 ++++++--- 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index fee3305..5300f6d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -93,6 +93,9 @@ version 2.61 Give correct from-cache answers to explict CNAME queries. Thanks to Rob Zwissler for spotting this. + Add --dhcp-lowercase option. Thanks to Oliver Rath for the + patch. + version 2.60 Fix compilation problem in Mac OS X Lion. Thanks to Olaf diff --git a/man/dnsmasq.8 b/man/dnsmasq.8 index c43aee5..0a3b5df 100644 --- a/man/dnsmasq.8 +++ b/man/dnsmasq.8 @@ -1385,6 +1385,12 @@ are accessible. It is not recommended to run dnsmasq as root with TFTP enabled, and certainly not without specifying --tftp-root. Doing so can expose any world-readable file on the server to any host on the net. .TP +.B --tftp-lowercase +Convert filenames in TFTP requests to all lowercase. This is useful +for requests from Windows machines, which have case-insensitive +filesystems and tend to play fast-and-loose with case in filenames. +Note that dnsmasq's tftp server always converts "\\" to "/" in filenames. +.TP .B --tftp-max= Set the maximum number of concurrent TFTP connections allowed. This defaults to 50. When serving a large number of TFTP connections, diff --git a/src/dnsmasq.h b/src/dnsmasq.h index 082c923..3b4eac2 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -217,7 +217,8 @@ struct event_desc { #define OPT_CONNTRACK 35 #define OPT_FQDN_UPDATE 36 #define OPT_RA 37 -#define OPT_LAST 38 +#define OPT_TFTP_LC 38 +#define OPT_LAST 39 /* extra flags for my_syslog, we use a couple of facilities since they are known not to occupy the same bits as priorities, no matter how syslog.h is set up. */ diff --git a/src/option.c b/src/option.c index 611b599..5cb7d7b 100644 --- a/src/option.c +++ b/src/option.c @@ -117,6 +117,7 @@ struct myoption { #define LOPT_RA 306 #define LOPT_DUID 307 #define LOPT_HOST_REC 308 +#define LOPT_TFTP_LC 309 #ifdef HAVE_GETOPT_LONG static const struct option opts[] = @@ -196,6 +197,7 @@ static const struct myoption opts[] = { "tftp-unique-root", 0, 0, LOPT_APREF }, { "tftp-root", 1, 0, LOPT_PREFIX }, { "tftp-max", 1, 0, LOPT_TFTP_MAX }, + { "tftp-lowercase", 0, 0, LOPT_TFTP_LC }, { "ptr-record", 1, 0, LOPT_PTR }, { "naptr-record", 1, 0, LOPT_NAPTR }, { "bridge-interface", 1, 0 , LOPT_BRIDGE }, @@ -342,6 +344,7 @@ static struct { { LOPT_SECURE, OPT_TFTP_SECURE, NULL, gettext_noop("Allow access only to files owned by the user running dnsmasq."), NULL }, { LOPT_TFTP_MAX, ARG_ONE, "", gettext_noop("Maximum number of conncurrent TFTP transfers (defaults to %s)."), "#" }, { LOPT_NOBLOCK, OPT_TFTP_NOBLOCK, NULL, gettext_noop("Disable the TFTP blocksize extension."), NULL }, + { LOPT_TFTP_LC, OPT_TFTP_LC, NULL, gettext_noop("Convert TFTP filenames to lowercase"), NULL }, { LOPT_TFTPPORTS, ARG_ONE, ",", gettext_noop("Ephemeral port range for use by TFTP transfers."), NULL }, { LOPT_LOG_OPTS, OPT_LOG_OPTS, NULL, gettext_noop("Extra logging for DHCP."), NULL }, { LOPT_MAX_LOGS, ARG_ONE, "[=]", gettext_noop("Enable async. logging; optionally set queue length."), NULL }, diff --git a/src/tftp.c b/src/tftp.c index a67fcaa..bda04f3 100644 --- a/src/tftp.c +++ b/src/tftp.c @@ -345,9 +345,12 @@ void tftp_request(struct listener *listen, time_t now) } /* cope with backslashes from windows boxen. */ - while ((p = strchr(filename, '\\'))) - *p = '/'; - + for (p = filename; *p; p++) + if (*p == '\\') + *p = '/'; + else if (option_bool(OPT_TFTP_LC)) + *p = tolower(*p); + strcpy(daemon->namebuff, "/"); if (prefix) {