tnef 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (197) hide show
  1. data/ext/tnef/AUTHORS +7 -0
  2. data/ext/tnef/BUGS.in +5 -0
  3. data/ext/tnef/COPYING +340 -0
  4. data/ext/tnef/ChangeLog +1550 -0
  5. data/ext/tnef/INSTALL +234 -0
  6. data/ext/tnef/Makefile.am +7 -0
  7. data/ext/tnef/Makefile.in +699 -0
  8. data/ext/tnef/NEWS +177 -0
  9. data/ext/tnef/README +39 -0
  10. data/ext/tnef/THANKS +1 -0
  11. data/ext/tnef/TODO +7 -0
  12. data/ext/tnef/acinclude.m4 +47 -0
  13. data/ext/tnef/aclocal.m4 +1012 -0
  14. data/ext/tnef/configure +6815 -0
  15. data/ext/tnef/configure.in +67 -0
  16. data/ext/tnef/depcomp +584 -0
  17. data/ext/tnef/doc/FAQ +25 -0
  18. data/ext/tnef/doc/Makefile.am +6 -0
  19. data/ext/tnef/doc/Makefile.in +623 -0
  20. data/ext/tnef/doc/file-format.tex +139 -0
  21. data/ext/tnef/doc/tnef.1.in +183 -0
  22. data/ext/tnef/doc/www/Makefile.am +14 -0
  23. data/ext/tnef/doc/www/Makefile.in +542 -0
  24. data/ext/tnef/doc/www/cgi-bin/Makefile.am +14 -0
  25. data/ext/tnef/doc/www/cgi-bin/Makefile.in +340 -0
  26. data/ext/tnef/doc/www/htdocs/Makefile.am +14 -0
  27. data/ext/tnef/doc/www/htdocs/Makefile.in +340 -0
  28. data/ext/tnef/extconf.rb +3 -0
  29. data/ext/tnef/install-sh +507 -0
  30. data/ext/tnef/missing +367 -0
  31. data/ext/tnef/mkinstalldirs +161 -0
  32. data/ext/tnef/src/Makefile.am +48 -0
  33. data/ext/tnef/src/Makefile.in +700 -0
  34. data/ext/tnef/src/alloc.c +107 -0
  35. data/ext/tnef/src/alloc.h +54 -0
  36. data/ext/tnef/src/attr.c +270 -0
  37. data/ext/tnef/src/attr.h +74 -0
  38. data/ext/tnef/src/common.h +101 -0
  39. data/ext/tnef/src/config.h.in +111 -0
  40. data/ext/tnef/src/date.c +66 -0
  41. data/ext/tnef/src/date.h +43 -0
  42. data/ext/tnef/src/debug.c +45 -0
  43. data/ext/tnef/src/debug.h +32 -0
  44. data/ext/tnef/src/file.c +259 -0
  45. data/ext/tnef/src/file.h +48 -0
  46. data/ext/tnef/src/main.c +386 -0
  47. data/ext/tnef/src/mapi-names.data +430 -0
  48. data/ext/tnef/src/mapi-types.data +19 -0
  49. data/ext/tnef/src/mapi_attr.c +419 -0
  50. data/ext/tnef/src/mapi_attr.h +78 -0
  51. data/ext/tnef/src/mkdata.awk +100 -0
  52. data/ext/tnef/src/options.c +32 -0
  53. data/ext/tnef/src/options.h +67 -0
  54. data/ext/tnef/src/path.c +397 -0
  55. data/ext/tnef/src/path.h +34 -0
  56. data/ext/tnef/src/replace/Makefile.am +8 -0
  57. data/ext/tnef/src/replace/Makefile.in +435 -0
  58. data/ext/tnef/src/replace/basename.c +45 -0
  59. data/ext/tnef/src/replace/dummy.c +7 -0
  60. data/ext/tnef/src/replace/getopt_long.c +940 -0
  61. data/ext/tnef/src/replace/getopt_long.h +141 -0
  62. data/ext/tnef/src/replace/malloc.c +41 -0
  63. data/ext/tnef/src/replace/strdup.c +51 -0
  64. data/ext/tnef/src/rtf.c +362 -0
  65. data/ext/tnef/src/rtf.h +36 -0
  66. data/ext/tnef/src/tnef-names.data +34 -0
  67. data/ext/tnef/src/tnef-types.data +12 -0
  68. data/ext/tnef/src/tnef.c +396 -0
  69. data/ext/tnef/src/tnef.h +45 -0
  70. data/ext/tnef/src/util.c +112 -0
  71. data/ext/tnef/src/util.h +42 -0
  72. data/ext/tnef/src/write.c +136 -0
  73. data/ext/tnef/src/write.h +25 -0
  74. data/ext/tnef/src/xstrdup.c +41 -0
  75. data/ext/tnef/tests/Makefile.am +4 -0
  76. data/ext/tnef/tests/Makefile.in +530 -0
  77. data/ext/tnef/tests/cmdline/AUTHORS +8 -0
  78. data/ext/tnef/tests/cmdline/AUTHORS.baseline +8 -0
  79. data/ext/tnef/tests/cmdline/Makefile.am +33 -0
  80. data/ext/tnef/tests/cmdline/Makefile.in +455 -0
  81. data/ext/tnef/tests/cmdline/basic.baseline +4 -0
  82. data/ext/tnef/tests/cmdline/basic.test +39 -0
  83. data/ext/tnef/tests/cmdline/body-test.html.baseline +95 -0
  84. data/ext/tnef/tests/cmdline/body.baseline +929 -0
  85. data/ext/tnef/tests/cmdline/body.test +55 -0
  86. data/ext/tnef/tests/cmdline/debug.baseline +155 -0
  87. data/ext/tnef/tests/cmdline/debug.test +14 -0
  88. data/ext/tnef/tests/cmdline/directory.baseline +3 -0
  89. data/ext/tnef/tests/cmdline/directory.test +35 -0
  90. data/ext/tnef/tests/cmdline/help.baseline +63 -0
  91. data/ext/tnef/tests/cmdline/help.test +12 -0
  92. data/ext/tnef/tests/cmdline/interactive.test +5 -0
  93. data/ext/tnef/tests/cmdline/list.baseline +5 -0
  94. data/ext/tnef/tests/cmdline/list.test +21 -0
  95. data/ext/tnef/tests/cmdline/maxsize.baseline +828 -0
  96. data/ext/tnef/tests/cmdline/maxsize.test +43 -0
  97. data/ext/tnef/tests/cmdline/message.html.baseline +95 -0
  98. data/ext/tnef/tests/cmdline/mime-types.baseline +3 -0
  99. data/ext/tnef/tests/cmdline/mime-types.test +11 -0
  100. data/ext/tnef/tests/cmdline/overwrite.baseline +8 -0
  101. data/ext/tnef/tests/cmdline/overwrite.test +40 -0
  102. data/ext/tnef/tests/cmdline/rtf-test.rtf.baseline +0 -0
  103. data/ext/tnef/tests/cmdline/stdin.baseline +2 -0
  104. data/ext/tnef/tests/cmdline/stdin.test +18 -0
  105. data/ext/tnef/tests/cmdline/test.tnef +0 -0
  106. data/ext/tnef/tests/cmdline/triples-test-2.rtf.baseline +0 -0
  107. data/ext/tnef/tests/cmdline/triples-test-2.txt.baseline +0 -0
  108. data/ext/tnef/tests/cmdline/triples-test.txt.baseline +0 -0
  109. data/ext/tnef/tests/cmdline/use-path.baseline +0 -0
  110. data/ext/tnef/tests/cmdline/use-path.test +5 -0
  111. data/ext/tnef/tests/cmdline/verbose.baseline +5 -0
  112. data/ext/tnef/tests/cmdline/verbose.test +19 -0
  113. data/ext/tnef/tests/cmdline/version.baseline +17 -0
  114. data/ext/tnef/tests/cmdline/version.test +14 -0
  115. data/ext/tnef/tests/files/MAPI_ATTACH_DATA_OBJ.test +9 -0
  116. data/ext/tnef/tests/files/MAPI_OBJECT.test +9 -0
  117. data/ext/tnef/tests/files/Makefile.am +16 -0
  118. data/ext/tnef/tests/files/Makefile.in +636 -0
  119. data/ext/tnef/tests/files/baselines/AUTHORS.baseline +8 -0
  120. data/ext/tnef/tests/files/baselines/AUTOEXEC.BAT.baseline +0 -0
  121. data/ext/tnef/tests/files/baselines/CONFIG.SYS.baseline +0 -0
  122. data/ext/tnef/tests/files/baselines/MAPI_ATTACH_DATA_OBJ-body.rtf.baseline +0 -0
  123. data/ext/tnef/tests/files/baselines/MAPI_ATTACH_DATA_OBJ.baseline +229 -0
  124. data/ext/tnef/tests/files/baselines/MAPI_OBJECT-body.rtf.baseline +0 -0
  125. data/ext/tnef/tests/files/baselines/MAPI_OBJECT.baseline +153 -0
  126. data/ext/tnef/tests/files/baselines/Makefile.am +35 -0
  127. data/ext/tnef/tests/files/baselines/Makefile.in +361 -0
  128. data/ext/tnef/tests/files/baselines/README.baseline +31 -0
  129. data/ext/tnef/tests/files/baselines/TechlibDEC99-JAN00.doc.baseline +0 -0
  130. data/ext/tnef/tests/files/baselines/TechlibDEC99.doc.baseline +0 -0
  131. data/ext/tnef/tests/files/baselines/TechlibNOV99.doc.baseline +0 -0
  132. data/ext/tnef/tests/files/baselines/Untitled_Attachment.baseline +0 -0
  133. data/ext/tnef/tests/files/baselines/VIA_Nytt_1402.doc.baseline +0 -0
  134. data/ext/tnef/tests/files/baselines/VIA_Nytt_1402.pdf.baseline +0 -0
  135. data/ext/tnef/tests/files/baselines/VIA_Nytt_14021.htm.baseline +1914 -0
  136. data/ext/tnef/tests/files/baselines/body-body.html.baseline +95 -0
  137. data/ext/tnef/tests/files/baselines/body.baseline +124 -0
  138. data/ext/tnef/tests/files/baselines/boot.ini.baseline +6 -0
  139. data/ext/tnef/tests/files/baselines/data-before-name-body.rtf.baseline +0 -0
  140. data/ext/tnef/tests/files/baselines/data-before-name.baseline +213 -0
  141. data/ext/tnef/tests/files/baselines/garbage-at-end.baseline +73 -0
  142. data/ext/tnef/tests/files/baselines/generpts.src.baseline +1691 -0
  143. data/ext/tnef/tests/files/baselines/long-filename-body.rtf.baseline +26 -0
  144. data/ext/tnef/tests/files/baselines/long-filename.baseline +218 -0
  145. data/ext/tnef/tests/files/baselines/message.rtf.baseline +0 -0
  146. data/ext/tnef/tests/files/baselines/missing-filenames-body.rtf.baseline +20 -0
  147. data/ext/tnef/tests/files/baselines/missing-filenames.baseline +252 -0
  148. data/ext/tnef/tests/files/baselines/multi-name-property.baseline +243 -0
  149. data/ext/tnef/tests/files/baselines/one-file.baseline +155 -0
  150. data/ext/tnef/tests/files/baselines/rtf-body.rtf.baseline +0 -0
  151. data/ext/tnef/tests/files/baselines/rtf.baseline +167 -0
  152. data/ext/tnef/tests/files/baselines/triples-body.rtf.baseline +0 -0
  153. data/ext/tnef/tests/files/baselines/triples.baseline +254 -0
  154. data/ext/tnef/tests/files/baselines/two-files.baseline +186 -0
  155. data/ext/tnef/tests/files/body.test +9 -0
  156. data/ext/tnef/tests/files/data-before-name.test +9 -0
  157. data/ext/tnef/tests/files/datafiles/MAPI_ATTACH_DATA_OBJ.list +4 -0
  158. data/ext/tnef/tests/files/datafiles/MAPI_ATTACH_DATA_OBJ.tnef +0 -0
  159. data/ext/tnef/tests/files/datafiles/MAPI_OBJECT.list +2 -0
  160. data/ext/tnef/tests/files/datafiles/MAPI_OBJECT.tnef +0 -0
  161. data/ext/tnef/tests/files/datafiles/Makefile.am +27 -0
  162. data/ext/tnef/tests/files/datafiles/Makefile.in +351 -0
  163. data/ext/tnef/tests/files/datafiles/body.list +1 -0
  164. data/ext/tnef/tests/files/datafiles/body.tnef +0 -0
  165. data/ext/tnef/tests/files/datafiles/data-before-name.list +4 -0
  166. data/ext/tnef/tests/files/datafiles/data-before-name.tnef +0 -0
  167. data/ext/tnef/tests/files/datafiles/garbage-at-end.list +0 -0
  168. data/ext/tnef/tests/files/datafiles/garbage-at-end.tnef +0 -0
  169. data/ext/tnef/tests/files/datafiles/long-filename.list +1 -0
  170. data/ext/tnef/tests/files/datafiles/long-filename.tnef +0 -0
  171. data/ext/tnef/tests/files/datafiles/missing-filenames.list +1 -0
  172. data/ext/tnef/tests/files/datafiles/missing-filenames.tnef +0 -0
  173. data/ext/tnef/tests/files/datafiles/multi-name-property.list +0 -0
  174. data/ext/tnef/tests/files/datafiles/multi-name-property.tnef +0 -0
  175. data/ext/tnef/tests/files/datafiles/one-file.list +1 -0
  176. data/ext/tnef/tests/files/datafiles/one-file.tnef +0 -0
  177. data/ext/tnef/tests/files/datafiles/rtf.list +1 -0
  178. data/ext/tnef/tests/files/datafiles/rtf.tnef +0 -0
  179. data/ext/tnef/tests/files/datafiles/triples.list +1 -0
  180. data/ext/tnef/tests/files/datafiles/triples.tnef +0 -0
  181. data/ext/tnef/tests/files/datafiles/two-files.list +2 -0
  182. data/ext/tnef/tests/files/datafiles/two-files.tnef +0 -0
  183. data/ext/tnef/tests/files/file-util.sh +38 -0
  184. data/ext/tnef/tests/files/garbage-at-end.test +9 -0
  185. data/ext/tnef/tests/files/long-filename.test +9 -0
  186. data/ext/tnef/tests/files/missing-filenames.test +9 -0
  187. data/ext/tnef/tests/files/multi-name-property.test +9 -0
  188. data/ext/tnef/tests/files/one-file.test +9 -0
  189. data/ext/tnef/tests/files/rtf.test +9 -0
  190. data/ext/tnef/tests/files/triples.test +9 -0
  191. data/ext/tnef/tests/files/two-files.test +9 -0
  192. data/ext/tnef/tests/util.sh +32 -0
  193. data/ext/tnef/tnef.spec.in +44 -0
  194. data/lib/tnef.rb +30 -0
  195. data/lib/tnef/executable.rb +27 -0
  196. data/lib/tnef/version.rb +3 -0
  197. metadata +243 -0
@@ -0,0 +1,100 @@
1
+ # mkdata.awk - used to generate blah.[ch] from blah.data
2
+ #
3
+ # Copyright (C)1999-2006 Mark Simpson <damned@world.std.com>
4
+ #
5
+ # This program is free software; you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation; either version 2, or (at your option)
8
+ # any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program; if not, you can either send email to this
17
+ # program's maintainer or write to: The Free Software Foundation,
18
+ # Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
19
+ #
20
+ # Commentary:
21
+ #
22
+ # the file x.data was given on the command line
23
+ # the output of this script is redirected to the right file
24
+ # the environment variable TAG is used for the function name and comments
25
+ #
26
+
27
+ #
28
+ # Print headers and such.
29
+ #
30
+ BEGIN {
31
+ HFILE = sprintf ("%ss.h", ENVIRON["TAG"]);
32
+ HFILEDEF = HFILE;
33
+ HFILEDEF = toupper(HFILEDEF);
34
+ gsub("\\.","_",HFILEDEF);
35
+ CFILE = sprintf ("%ss.c", ENVIRON["TAG"]);
36
+ printf "/* This file generated by names.awk do not edit! */\n" > HFILE;
37
+ printf "#ifndef %s\n", HFILEDEF > HFILE;
38
+ printf "#define %s\n", HFILEDEF > HFILE;
39
+ printf "enum _%s {\n", ENVIRON["TAG"] > HFILE;
40
+
41
+ printf "/* This file generated by names.awk do not edit! */\n" > CFILE;
42
+ printf "#ifdef HAVE_CONFIG_H\n" > CFILE;
43
+ printf "#include \"config.h\"\n" > CFILE;
44
+ printf "#endif\n" > CFILE;
45
+ printf "#include \"common.h\"\n" > CFILE;
46
+ printf "#include \"%s\"\n", HFILE > CFILE;
47
+ printf "char*\n" > CFILE;
48
+ printf "get_%s_str(uint16 d)\n", ENVIRON["TAG"] > CFILE;
49
+ printf "{\n" > CFILE;
50
+ printf " static char buf[128];\n" > CFILE;
51
+ printf " static char* str;\n" > CFILE;
52
+ printf " switch(d) {\n" > CFILE;
53
+ }
54
+
55
+ #
56
+ # deal with each line if it doesn't start with a '#'
57
+ #
58
+ /^[^#]/ {
59
+ NAME = ""
60
+ for (i = 3; i < NF + 1; i=i+1) {
61
+ if ( NAME ) {
62
+ NAME = sprintf ("%s %s", NAME, $(i))
63
+ } else {
64
+ NAME = $(i)
65
+ }
66
+ }
67
+
68
+ # printf "#define %-10s\t%s\t/* %s */\n", $1, $2, NAME > HFILE;
69
+ printf "\t%-45s = %s,\n", $1, $2 > HFILE
70
+
71
+ printf " case %s:\n", $1 > CFILE;
72
+ printf " str=\"%s\";\n", NAME > CFILE;
73
+ printf " break;\n" > CFILE;
74
+ }
75
+
76
+ #
77
+ # Finish off the files
78
+ #
79
+ END {
80
+ printf "};\n" > HFILE;
81
+ printf "typedef enum _%s %s;\n", ENVIRON["TAG"], ENVIRON["TAG"] > HFILE;
82
+ printf "extern char*\n" > HFILE;
83
+ printf "get_%s_str(uint16 d);\n", ENVIRON["TAG"] > HFILE;
84
+ printf "#endif /* %s */\n", HFILEDEF > HFILE;
85
+
86
+ printf " default:\n" > CFILE;
87
+ printf " str=NULL;\n" > CFILE;
88
+ printf " break;\n" > CFILE;
89
+ printf " }\n" > CFILE;
90
+ printf " if ( str )\n" > CFILE;
91
+ printf " {\n" > CFILE;
92
+ printf " sprintf(buf,\"%%s <%%04x>\",str,d);\n" > CFILE;
93
+ printf " }\n" > CFILE;
94
+ printf " else\n" > CFILE;
95
+ printf " {\n" > CFILE;
96
+ printf " sprintf(buf,\"%%04x\",d);\n" > CFILE;
97
+ printf " }\n" > CFILE;
98
+ printf " return buf;\n" > CFILE;
99
+ printf "}\n" > CFILE;
100
+ }
@@ -0,0 +1,32 @@
1
+ /*
2
+ * options.c -- functions for dealing with program options
3
+ *
4
+ * Copyright (C)1999-2006 Mark Simpson <damned@theworld.com>
5
+ *
6
+ * This program is free software; you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation; either version 2, or (at your option)
9
+ * any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, you can either send email to this
18
+ * program's maintainer or write to: The Free Software Foundation,
19
+ * Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
20
+ *
21
+ */
22
+ #ifdef HAVE_CONFIG_H
23
+ # include "config.h"
24
+ #endif /* HAVE_CONFIG_H */
25
+
26
+ #include "common.h"
27
+
28
+ #include "options.h"
29
+
30
+ /* Global variables, used by all (or nearly all) functions */
31
+ int g_flags = NONE; /* program options */
32
+
@@ -0,0 +1,67 @@
1
+ /*
2
+ * options.h -- functions for dealing with program options
3
+ *
4
+ * Copyright (C)1999-2006 Mark Simpson <damned@theworld.com>
5
+ *
6
+ * This program is free software; you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation; either version 2, or (at your option)
9
+ * any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, you can either send email to this
18
+ * program's maintainer or write to: The Free Software Foundation,
19
+ * Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
20
+ *
21
+ */
22
+ #ifndef OPTIONS_H
23
+ #define OPTIONS_H
24
+
25
+ #if HAVE_CONFIG_H
26
+ # include "config.h"
27
+ #endif /* HAVE_CONFIG_H */
28
+
29
+ #include "common.h"
30
+
31
+ /* Global variables, used by all (or nearly all) functions */
32
+ extern int g_flags; /* program options */
33
+
34
+ /* macros for dealing with program flags */
35
+ #define DEBUG_ON ((g_flags)&DBG_OUT)
36
+ #define VERBOSE_ON ((g_flags)&VERBOSE)
37
+ #define LIST_ONLY ((g_flags)&LIST)
38
+ #define SHOW_MIME ((g_flags)&LISTMIME)
39
+ #define USE_PATHS ((g_flags)&PATHS)
40
+ #define INTERACTIVE ((g_flags)&CONFIRM)
41
+ #define OVERWRITE_FILES ((g_flags)&OVERWRITE)
42
+ #define NUMBER_FILES ((g_flags)&NUMBERED)
43
+ #define CHECKSUM_SKIP ((g_flags)&CHECKSUM_OK)
44
+ #define ENCODE_SKIP ((g_flags)&ENCODE_OK)
45
+ #define CRUFT_SKIP ((g_flags)&CRUFT_OK)
46
+ #define UNIX_FS ((g_flags)&UNIX_PATHS)
47
+ #define ABSOLUTE_OK ((g_flags)&ABSOLUTE_PATHS)
48
+
49
+ /* flags to modify behaviour of file parsing */
50
+ enum { NONE = 0x00,
51
+ VERBOSE = 0x01,
52
+ DBG_OUT = 0x02,
53
+ LIST = 0x04,
54
+ PATHS = 0x08,
55
+ OVERWRITE= 0x10,
56
+ CONFIRM = 0x20,
57
+ NUMBERED = 0x40,
58
+ SAVEBODY = 0x80,
59
+ LISTMIME = 0x100,
60
+ CHECKSUM_OK = 0x200,
61
+ ENCODE_OK = 0x400,
62
+ CRUFT_OK = 0x800,
63
+ UNIX_PATHS = 0x1000,
64
+ ABSOLUTE_PATHS = 0x2000
65
+ };
66
+
67
+ #endif /* OPTIONS_H */
@@ -0,0 +1,397 @@
1
+ /*
2
+ * path.c -- Utility functions for dealing with pathnames
3
+ *
4
+ * Copyright (C)1999-2006 Mark Simpson <damned@theworld.com>
5
+ *
6
+ * This program is free software; you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation; either version 2, or (at your option)
9
+ * any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, you can either send email to this
18
+ * program's maintainer or write to: The Free Software Foundation,
19
+ * Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
20
+ *
21
+ */
22
+ #ifdef HAVE_CONFIG_H
23
+ # include "config.h"
24
+ #endif /* HAVE_CONFIG_H */
25
+
26
+ #include "common.h"
27
+ #include <ctype.h>
28
+
29
+ #if HAVE_SYS_STAT_H
30
+ # include <sys/stat.h>
31
+ #endif
32
+
33
+ #include "alloc.h"
34
+ #include "options.h"
35
+ #include "path.h"
36
+ #include "debug.h"
37
+
38
+ /* concatenates fname1 with fname2 to make a pathname, adds '/' as needed */
39
+ /* strips trailing '/' */
40
+
41
+ char *
42
+ concat_fname (const char *fname1, const char* fname2)
43
+ {
44
+ char *filename;
45
+ int len;
46
+
47
+ if ( ( fname1 == NULL ) && ( fname2 == NULL ) ) return NULL;
48
+
49
+ if ( ( fname1 == NULL ) || ( *fname1 == '\0' ) )
50
+ {
51
+ filename = xstrdup (fname2);
52
+ }
53
+ else
54
+ {
55
+ len = strlen (fname1);
56
+ if (fname2) len += strlen (fname2);
57
+
58
+ filename = CHECKED_XMALLOC (char, (len + 2));
59
+ strcpy (filename, fname1);
60
+
61
+ if (fname2)
62
+ {
63
+ if ((filename[strlen(filename)-1] != '/')
64
+ && (fname2[0] != '/'))
65
+ {
66
+ strcat (filename, "/");
67
+ }
68
+ strcat (filename, fname2);
69
+ }
70
+ }
71
+
72
+ /* strip trailing '/' */
73
+
74
+ while ((len=strlen(filename)) > 0)
75
+ {
76
+ if ( filename[len-1] == '/' )
77
+ {
78
+ filename[len-1] = '\0';
79
+ }
80
+ else
81
+ {
82
+ break;
83
+ }
84
+ }
85
+
86
+ if ( *filename == '\0' ) filename = NULL; /* nothing left */
87
+
88
+ return filename;
89
+ }
90
+
91
+ int
92
+ file_exists (const char *fname)
93
+ {
94
+ static struct stat buf;
95
+ return (stat (fname, &buf) == 0);
96
+ }
97
+
98
+ /* finds a filename fname.N where N >= 1 and is not the name of an existing
99
+ filename. Assumes that fname does not already have such an extension */
100
+ char *
101
+ find_free_number (const char *fname)
102
+ {
103
+ size_t len = (strlen(fname)
104
+ + 1 /* '.' */
105
+ + 5 /* big enough for our purposes (i hope) */
106
+ + 1); /* NULL */
107
+ char *tmp = CHECKED_XMALLOC (char, len);
108
+ int counter = 1;
109
+ do
110
+ {
111
+ sprintf (tmp, "%s.%d", fname, counter++);
112
+ }
113
+ while (file_exists(tmp));
114
+ return tmp;
115
+ }
116
+
117
+ /* windows pathname manipulation routines */
118
+
119
+ /* per windows file manager, these aren't allowed in filenames */
120
+
121
+ static char unsanitary_windows_chars[] = {
122
+ '\\', '/', ':', '*', '?', '"', '<', '>', '|', '\0'
123
+ };
124
+
125
+ /* these aren't welcomed in unix filenames */
126
+
127
+ static char unsavory_unix_chars[] = {
128
+ ' ', ';', '`', '\'', '[', ']', '{', '}', '(', ')', '\0'
129
+ };
130
+
131
+ static int
132
+ could_be_a_windows_path( const char *fname )
133
+ {
134
+ const char *up;
135
+
136
+ if ( ( fname == NULL ) || ( *fname == '\0' ) ) return 0;
137
+
138
+ /*
139
+ we might be a windows path if...
140
+ we have at least one path separator and
141
+ we have no unsanitary windows chars and
142
+ we are reasonably printable
143
+ */
144
+
145
+ up = rindex( fname, '\\' );
146
+
147
+ if ( up )
148
+ {
149
+ up++;
150
+ if ( *up == '\0' ) return 0; /* trailing backslash doesn't cut it */
151
+ }
152
+ else
153
+ {
154
+ return 0; /* no backslash */
155
+ }
156
+
157
+ for ( up=unsanitary_windows_chars; *up; up++ )
158
+ {
159
+ if ( *up == '\\' ) continue; /* ignore backslashes */
160
+
161
+ if ( index( fname, (int)*up ) )
162
+ {
163
+ return 0; /* found something we can't stomach */
164
+ }
165
+ }
166
+
167
+ for ( up=fname; *up; up++ )
168
+ {
169
+ if ( iscntrl( (int)*up ) )
170
+ {
171
+ return 0; /* found something we can't see */
172
+ }
173
+ }
174
+
175
+ /* found nothing to the contrary, so we might just be a path */
176
+
177
+ if (DEBUG_ON) debug_print( "!!windows path possible: %s\n", fname );
178
+
179
+ return 1;
180
+ }
181
+
182
+ static unsigned char hex_digits[16] = {
183
+ '0', '1', '2', '3', '4', '5', '6', '7',
184
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
185
+ };
186
+
187
+ #define SLOP 4 /* a minimum rational buffer size */
188
+
189
+ static char *
190
+ sanitize_filename( const char *fname )
191
+ {
192
+ char *buf, *bp;
193
+ const char *cp, *up;
194
+ int flag, stet;
195
+
196
+ if ( ( fname == NULL ) || ( *fname == '\0' ) )
197
+ {
198
+ /* nothing to see here -- return small, zeroed buffer */
199
+ buf = CHECKED_XCALLOC( char, SLOP );
200
+ return buf;
201
+ }
202
+
203
+ /*
204
+ sanitize the filename by modifying unsanitary or unsavory
205
+ characters using the URL escape technique of c => %XX
206
+ return a "fresh and freeable" buffer with the sanitary filename
207
+ */
208
+
209
+ buf = CHECKED_XCALLOC( char, 3*strlen(fname)+SLOP );
210
+ bp = buf;
211
+
212
+ for ( cp=fname; *cp; cp++ )
213
+ {
214
+ flag = 0;
215
+
216
+ while (1)
217
+ {
218
+ /* control chars */
219
+
220
+ if ( iscntrl( (int)*cp ) )
221
+ {
222
+ stet = 0;
223
+ break;
224
+ }
225
+
226
+ /* unsanitary windows chars */
227
+
228
+ for ( up=unsanitary_windows_chars; *up; up++ )
229
+ {
230
+ if ( *cp == *up )
231
+ {
232
+ flag = 1;
233
+ stet = 0;
234
+ break; /* for loop... */
235
+ }
236
+ }
237
+
238
+ if ( flag ) break; /* while loop... */
239
+
240
+ if ( UNIX_FS )
241
+ {
242
+ /* non-ascii chars */
243
+
244
+ if ( !isascii( (int)*cp ) )
245
+ {
246
+ stet = 0;
247
+ break;
248
+ }
249
+
250
+ /* unsavory unix chars */
251
+
252
+ for ( up=unsavory_unix_chars; *up; up++ )
253
+ {
254
+ if ( *cp == *up )
255
+ {
256
+ flag = 1;
257
+ stet = 0;
258
+ break; /* for loop... */
259
+ }
260
+ }
261
+
262
+ if ( flag ) break; /* while loop... */
263
+ }
264
+
265
+ /* escape the escaper */
266
+
267
+ if ( *cp == '%' )
268
+ {
269
+ stet = 0;
270
+ break;
271
+ }
272
+
273
+ /* nothing obvious */
274
+
275
+ stet = 1;
276
+ break;
277
+ }
278
+
279
+ /* handle the char */
280
+
281
+ if ( stet )
282
+ {
283
+ *bp++ = *cp; /* keep it */
284
+ }
285
+ else
286
+ {
287
+ *bp++ = '%'; /* escape it */
288
+ *bp++ = hex_digits[ ((*cp)>>4)&0xf ];
289
+ *bp++ = hex_digits[ (*cp) &0xf ];
290
+ }
291
+ }
292
+
293
+ return buf;
294
+ }
295
+
296
+ /*
297
+ pathname generator
298
+
299
+ takes input filename and "sanitizes" it for filesystem use
300
+ understands windows paths and unixisms
301
+ returns NULL if totally unsavory filename
302
+ returns (freeable) pointer to sanitized filename if at all palatable
303
+ */
304
+
305
+ char *
306
+ munge_fname( const char *fname )
307
+ {
308
+ char *dir, *base, *p, *fpd, *fpb;
309
+
310
+ /* If we were not given a filename give up */
311
+ if (!fname || *fname == '\0')
312
+ {
313
+ return NULL;
314
+ }
315
+
316
+ if ( USE_PATHS )
317
+ {
318
+ /* evaluate windows path potential */
319
+
320
+ if ( could_be_a_windows_path( (char *)fname ) )
321
+ {
322
+ /* split fname after last path separator */
323
+
324
+ dir = strdup( fname ); fpd = dir;
325
+ base = rindex( dir, (int)'\\' );
326
+ base++;
327
+ *base = '\0';
328
+
329
+ base = strdup( fname ); fpb = base;
330
+ base = rindex( base, (int)'\\' );
331
+ base++;
332
+
333
+ /* flip path separators */
334
+
335
+ for ( p=dir; *p; p++ )
336
+ {
337
+ if ( *p == '\\' ) *p = '/';
338
+ }
339
+
340
+ /* handle absolute path separators */
341
+
342
+ if ( *dir == '/' )
343
+ {
344
+ if ( ABSOLUTE_OK )
345
+ {
346
+ if (VERBOSE_ON) debug_print( "WARNING: absolute path: %s", fname );
347
+ if (DEBUG_ON) debug_print( "!!absolute path: %s", fname );
348
+ }
349
+ else
350
+ {
351
+ if (VERBOSE_ON) debug_print( "WARNING: absolute path stripped: %s", fname );
352
+ if (DEBUG_ON) debug_print( "!!absolute path stripped: %s", fname );
353
+
354
+ while ( *dir == '/' ) dir++;
355
+
356
+ if ( *dir == '\0' ) dir = NULL; /* nothing left */
357
+ }
358
+ }
359
+ }
360
+ else
361
+ {
362
+ /* not recognized as a windows path */
363
+
364
+ dir = NULL; fpd = NULL;
365
+ base = strdup( fname ); fpb = base;
366
+ }
367
+ }
368
+ else
369
+ {
370
+ /* no paths allowed */
371
+
372
+ dir = NULL; fpd = NULL;
373
+ base = strdup( fname ); fpb = base;
374
+ }
375
+
376
+ /* cleanup the basename */
377
+
378
+ base = sanitize_filename( base );
379
+
380
+ /* build a pathname out of the pieces */
381
+
382
+ p = concat_fname( dir, base );
383
+
384
+ /* cleanup and return */
385
+
386
+ XFREE( fpd ); /* free what we may have allocated */
387
+ XFREE( fpb ); /* free what we may have allocated */
388
+ XFREE( base ); /* free what the sanitizer allocated */
389
+
390
+ if ( p && ( *p == '\0' ) )
391
+ {
392
+ XFREE( p ); /* free what we allocated and is no longer required */
393
+ p = NULL;
394
+ }
395
+
396
+ return p;
397
+ }