--tftp-lowercase option.
diff --git a/CHANGELOG b/CHANGELOG
index fee3305..5300f6d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -93,6 +93,9 @@
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 @@
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=<connections>
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 @@
#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 @@
#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 @@
{ "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 @@
{ 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, "<integer>", 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, "<start>,<end>", 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, "[=<integer>]", 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 @@
}
/* 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)
{