mds/net-ftp/tftp-hpa/files/tftp-hpa-filecase.diff

101 lines
2.2 KiB
Diff
Raw Normal View History

Submitted By: Mario Fetka (mario dot fetka at gmail dot com)
Date: 2009-03-19
Initial Package Version: 0.49
Origin: http://oss.netfarm.it/guides/ris-linux.php
Upstream Status: unknown
Description: A patch for hpa-tftp to permit case insensitive file lookups
diff -Naur tftp-hpa-0.49.orig/tftpd/tftpd.c tftp-hpa-0.49/tftpd/tftpd.c
--- tftp-hpa-0.49.orig/tftpd/tftpd.c 2009-03-19 17:50:47.883141096 +0000
+++ tftp-hpa-0.49/tftpd/tftpd.c 2009-03-19 18:00:20.991735706 +0000
@@ -46,6 +46,7 @@
#include <pwd.h>
#include <limits.h>
#include <syslog.h>
+#include <dirent.h>
#include "common/tftpsubs.h"
#include "recvfrom.h"
@@ -972,6 +973,9 @@
static void tftp_sendfile(struct formats *, struct tftphdr *, int);
static void tftp_recvfile(struct formats *, struct tftphdr *, int);
+int lookup_entry(const char *comp, char *dest);
+void lookup_file(char *filename);
+
struct formats {
const char *f_mode;
char *(*f_rewrite) (char *, int, const char **);
@@ -1332,6 +1336,63 @@
}
#endif
+int lookup_entry(const char *comp, char *dest)
+{
+ DIR *dirp;
+ struct dirent *dptr;
+ dirp = opendir(dest[0] ? dest : ".");
+ if (!dirp) return 0;
+ while ((dptr = readdir(dirp)))
+ {
+ if (!strcasecmp(dptr->d_name, comp))
+ {
+ if (dest[0]) strcat(dest, "/");
+ strcat(dest, dptr->d_name);
+ closedir(dirp);
+ return 1;
+ }
+ }
+ closedir(dirp);
+ return 0;
+}
+
+
+void lookup_file(char *filename)
+{
+ int found = 0;
+ int len = 0;
+ char dest[1024];
+ char comp[1024];
+ char *check = filename;
+ char *seek = NULL;
+
+ dest[0] = 0;
+ check++;
+ while (*check)
+ {
+ seek = strchr(check, '\\');
+ if (!seek)
+ {
+ if ((*check) && (lookup_entry(check, dest)))
+ found = 1;
+ break;
+ }
+ len = seek - check;
+ memcpy(comp, check, len);
+ comp[len]=0;
+ if (!lookup_entry(comp, dest))
+ break;
+ check += len + 1;
+ }
+
+ if (found)
+ {
+ filename[0] = 0;
+ strcat(filename, dest);
+ }
+}
+
+
static FILE *file;
/*
* Validate file access. Since we
@@ -1357,6 +1418,7 @@
tsize_ok = 0;
*errmsg = NULL;
+ if (*filename == '\\') lookup_file(filename);
if (!secure) {
if (*filename != '/') {
*errmsg = "Only absolute filenames allowed";