rev |
line source |
pascal@5684
|
1 --- busybox-1.16.1/networking/Config.in
|
pascal@5684
|
2 +++ busybox-1.16.1/networking/Config.in
|
pascal@5684
|
3 @@ -852,6 +852,15 @@
|
pascal@5684
|
4 In other words: it should be run from inetd in nowait mode,
|
pascal@5684
|
5 or from udpsvd. Example: "udpsvd -E 0 69 tftpd DIR"
|
pascal@5684
|
6
|
pascal@5684
|
7 +config FEATURE_TFTPD_RIS
|
pascal@5684
|
8 + bool "Enable \"RIS\" support"
|
pascal@5684
|
9 + default y
|
pascal@5684
|
10 + depends on TFTPD
|
pascal@5684
|
11 + help
|
pascal@5684
|
12 + Add support for the Remote Installation Service. This allows
|
pascal@5684
|
13 + a client to get files starting with \ without respecting case.
|
pascal@5684
|
14 + Each \ will be replaced by a /.
|
pascal@5684
|
15 +
|
pascal@5684
|
16 config FEATURE_TFTP_GET
|
pascal@5684
|
17 bool "Enable \"get\" command"
|
pascal@5684
|
18 default y
|
pascal@5684
|
19
|
pascal@5684
|
20 --- busybox-1.16.1/networking/tftp.c
|
pascal@5684
|
21 +++ busybox-1.16.1/networking/tftp.c
|
pascal@5684
|
22 @@ -653,6 +653,63 @@
|
pascal@5684
|
23 #undef remote_file
|
pascal@5684
|
24 }
|
pascal@5684
|
25
|
pascal@5684
|
26 +#if ENABLE_FEATURE_TFTPD_RIS
|
pascal@5684
|
27 +#include <dirent.h>
|
pascal@5684
|
28 +
|
pascal@5684
|
29 +int lookup_entry(const char *comp, char *dest);
|
pascal@5684
|
30 +void lookup_file(char *filename);
|
pascal@5684
|
31 +
|
pascal@5684
|
32 +int lookup_entry(const char *comp, char *dest)
|
pascal@5684
|
33 +{
|
pascal@5684
|
34 + DIR *dirp;
|
pascal@5684
|
35 + struct dirent *dptr;
|
pascal@5684
|
36 + if (!dest) return 0;
|
pascal@5684
|
37 + dirp = opendir(dest[0] ? dest : ".");
|
pascal@5684
|
38 + while ((dptr = readdir(dirp))) {
|
pascal@5684
|
39 + if (!strcasecmp(dptr->d_name, comp)) {
|
pascal@5684
|
40 + if (dest[0]) strcat(dest, "/");
|
pascal@5684
|
41 + strcat(dest, dptr->d_name);
|
pascal@5684
|
42 + closedir(dirp);
|
pascal@5684
|
43 + return 1;
|
pascal@5684
|
44 + }
|
pascal@5684
|
45 + }
|
pascal@5684
|
46 + closedir(dirp);
|
pascal@5684
|
47 + return 0;
|
pascal@5684
|
48 +}
|
pascal@5684
|
49 +
|
pascal@5684
|
50 +void lookup_file(char *filename)
|
pascal@5684
|
51 +{
|
pascal@5684
|
52 + int found = 0;
|
pascal@5684
|
53 + int len = 0;
|
pascal@5684
|
54 + char dest[1024];
|
pascal@5684
|
55 + char comp[1024];
|
pascal@5684
|
56 + char *check = filename;
|
pascal@5684
|
57 + char *seek = NULL;
|
pascal@5684
|
58 +
|
pascal@5684
|
59 + dest[0] = 0;
|
pascal@5684
|
60 + check++;
|
pascal@5684
|
61 + while (*check) {
|
pascal@5684
|
62 + seek = strchr(check, '\\');
|
pascal@5684
|
63 + if (!seek) {
|
pascal@5684
|
64 + if ((*check) && (lookup_entry(check, dest)))
|
pascal@5684
|
65 + found = 1;
|
pascal@5684
|
66 + break;
|
pascal@5684
|
67 + }
|
pascal@5684
|
68 + len = seek - check;
|
pascal@5684
|
69 + memcpy(comp, check, len);
|
pascal@5684
|
70 + comp[len]=0;
|
pascal@5684
|
71 + if (!lookup_entry(comp, dest))
|
pascal@5684
|
72 + break;
|
pascal@5684
|
73 + check += len + 1;
|
pascal@5684
|
74 + }
|
pascal@5684
|
75 +
|
pascal@5684
|
76 + if (found) {
|
pascal@5684
|
77 + filename[0] = 0;
|
pascal@5684
|
78 + strcat(filename, dest);
|
pascal@5684
|
79 + }
|
pascal@5684
|
80 +}
|
pascal@5684
|
81 +#endif
|
pascal@5684
|
82 +
|
pascal@5684
|
83 #if ENABLE_TFTP
|
pascal@5684
|
84
|
pascal@5684
|
85 int tftp_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
pascal@5684
|
86 @@ -782,6 +839,11 @@
|
pascal@5684
|
87 goto err;
|
pascal@5684
|
88 }
|
pascal@5684
|
89 local_file = block_buf + 2;
|
pascal@5684
|
90 +#if ENABLE_FEATURE_TFTPD_RIS
|
pascal@5684
|
91 + if (local_file[0] == '\\') {
|
pascal@5684
|
92 + lookup_file(local_file);
|
pascal@5684
|
93 + }
|
pascal@5684
|
94 +#endif
|
pascal@5684
|
95 if (local_file[0] == '.' || strstr(local_file, "/.")) {
|
pascal@5684
|
96 error_msg = "dot in file name";
|
pascal@5684
|
97 goto err;
|