1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
diff -dPNur unzip-5.52/fileio.c unzip-5.52-ds/fileio.c
--- unzip-5.52/fileio.c 2005-02-27 03:10:12.000000000 +0100
+++ unzip-5.52-ds/fileio.c 2008-04-11 22:25:31.000000000 +0200
@@ -78,7 +78,7 @@
# endif
#endif
#include "ebcdic.h" /* definition/initialization of ebcdic[] */
-
+#include "dsrecode.h"
/*
Note: Under Windows, the maximum size of the buffer that can be used
diff -dPNur unzip-5.52/unzpriv.h unzip-5.52-ds/unzpriv.h
--- unzip-5.52/unzpriv.h 2005-02-04 00:26:42.000000000 +0100
+++ unzip-5.52-ds/unzpriv.h 2008-04-11 22:25:31.000000000 +0200
@@ -2564,9 +2564,9 @@
((hostver) == 25 || (hostver) == 26 || (hostver) == 40))) || \
(hostnum) == FS_HPFS_ || \
((hostnum) == FS_NTFS_ && (hostver) == 50)) { \
- _OEM_INTERN((string)); \
+ _DS_OEM_INTERN((string)); \
} else { \
- _ISO_INTERN((string)); \
+ _DS_ISO_INTERN((string)); \
}
#endif
diff -dPNur unzip-5.52/dsrecode.h unzip-5.52-ds/dsrecode.h
--- unzip-5.52/dsrecode.h 1970-01-01 01:00:00.000000000 +0100
+++ unzip-5.52-ds/dsrecode.h 2008-04-11 22:24:24.000000000 +0200
@@ -0,0 +1,119 @@
+#include "librcc.h"
+
+static rcc_class_default_charset default_oem[] = {
+ { "ru", "IBM866" },
+ { NULL, NULL }
+};
+
+static rcc_class_default_charset default_iso[] = {
+ { "ru", "CP1251" },
+ { NULL, NULL }
+};
+
+#define OEM_CLASS 0
+#define ISO_CLASS 1
+#define OUT_CLASS 2
+static rcc_class classes[] = {
+ { "oem", RCC_CLASS_STANDARD, NULL, default_oem, "OEM_INTERN", 0 },
+ { "iso", RCC_CLASS_STANDARD, NULL, default_iso, "ISO_INTERN", 0 },
+ { "out", RCC_CLASS_STANDARD, "LC_CTYPE", NULL, "Output", 0 },
+ { NULL }
+};
+
+int initialized = 0;
+
+#ifdef RCC_LAZY
+#include <dlfcn.h>
+# define RCC_LIBRARY "librcc.so.0"
+int (*rccInit2)();
+int (*rccFree2)();
+int (*rccInitDefaultContext2)(const char *locale_variable, unsigned int max_languages, unsigned int max_classes, rcc_class_ptr defclasses, rcc_init_flags flags);
+int (*rccInitDb42)(rcc_context ctx, const char *name, rcc_db4_flags flags);
+char* (*rccSizedRecode2)(rcc_context ctx, rcc_class_id from, rcc_class_id to, const char *buf, size_t len, size_t *rlen);
+int (*rccLoad2)(rcc_context ctx, const char *name);
+
+
+static char *rccRecode2(rcc_context ctx, rcc_class_id from, rcc_class_id to, const char *buf) {
+ return rccSizedRecode2(ctx, from, to, buf, 0, NULL);
+}
+
+void *rcc_handle;
+#else /* RCC_LAZY */
+#define rccInit2 rccInit
+#define rccFree2 rccFree
+#define rccInitDefaultContext2 rccInitDefaultContext
+#define rccInitDb42 rccInitDb4
+#define rccRecode2 rccRecode
+#define rccLoad2 rccLoad
+#endif /* RCC_LAZY */
+
+static void rccUnzipFree() {
+ if (initialized > 0) {
+ rccFree2();
+#ifdef RCC_LAZY
+ dlclose(rcc_handle);
+#endif /* RCC_LAZY */
+ initialized = 0;
+ }
+}
+
+
+static int rccUnzipInit() {
+ if (initialized) return 0;
+
+#ifdef RCC_LAZY
+ rcc_handle = dlopen("/usr/lib/" RCC_LIBRARY, RTLD_NOW);
+ if (!rcc_handle) rcc_handle = dlopen("/usr/local/lib/" RCC_LIBRARY, RTLD_NOW);
+ if (!rcc_handle) {
+ initialized = -1;
+ return 1;
+ }
+
+ rccInit2 = dlsym(rcc_handle, "rccInit");
+ rccFree2 = dlsym(rcc_handle, "rccFree");
+ rccInitDefaultContext2 = dlsym(rcc_handle, "rccInitDefaultContext");
+ rccInitDb42 = dlsym(rcc_handle, "rccInitDb4");
+ rccSizedRecode2 = dlsym(rcc_handle, "rccSizedRecode");
+ rccLoad2 = dlsym(rcc_handle, "rccLoad");
+
+ if ((!rccInit2)||(!rccFree2)||(!rccInitDefaultContext2)||(!rccInitDb42)||(!rccSizedRecode2)||(!rccLoad2)) {
+ dlclose(rcc_handle);
+ initialized = -1;
+ return 1;
+ }
+#endif /* RCC_LAZY */
+
+ rccInit2();
+ rccInitDefaultContext2(NULL, 0, 0, classes, 0);
+ rccLoad2(NULL, "zip");
+ rccInitDb42(NULL, NULL, 0);
+ atexit(rccUnzipFree);
+ initialized = 1;
+ return 0;
+}
+
+
+
+void _DS_OEM_INTERN(char *string) {
+ char *str;
+ rccUnzipInit();
+ if (initialized>0) {
+ str = rccRecode2(NULL, OEM_CLASS, OUT_CLASS, string);
+ if (str) {
+ strncpy(string,str,FILNAMSIZ);
+ free(str);
+ }
+ }
+}
+
+void _DS_ISO_INTERN(char *string) {
+ char *str;
+ rccUnzipInit();
+ if (initialized>0) {
+ str = rccRecode2(NULL, ISO_CLASS, OUT_CLASS, string);
+ if (str) {
+ strncpy(string,str,FILNAMSIZ);
+ free(str);
+ }
+ }
+}
|