Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6725 | siemargl | 1 | /* |
2 | Copyright (c) 1990-2000 Info-ZIP. All rights reserved. |
||
3 | |||
4 | See the accompanying file LICENSE, version 2000-Apr-09 or later |
||
5 | (the contents of which are also included in unzip.h) for terms of use. |
||
6 | If, for some reason, these files are missing, the Info-ZIP license |
||
7 | also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html |
||
8 | */ |
||
9 | #include |
||
10 | #include |
||
11 | #include |
||
12 | |||
13 | struct |
||
14 | { |
||
15 | short flag1; |
||
16 | short flag2; |
||
17 | long offset; // The offset from &ds to unzipsfx exe |
||
18 | long sfxlen; // size of unzipsfx program |
||
19 | long sfxdsiz; // data size of unzipsfx program |
||
20 | long sfxnam; // Name offset from start of sfxprog |
||
21 | long ziplen; // size of zip file |
||
22 | } ds = {0x4afb, 0x4afb, 0}; |
||
23 | |||
24 | |||
25 | typedef struct {short len; char chrs[1];} __QP_t; |
||
26 | |||
27 | #define __QA(l) struct {short len; char chrs[(l)+1];} |
||
28 | |||
29 | #define T1 \ |
||
30 | "\nThis is a self-extracting zip archive. In order to process the\n" \ |
||
31 | "archive you will be asked to give the name of a temporary directory\n" \ |
||
32 | "which must have at least as much free space as this SFX file.\n\n" \ |
||
33 | "You will also be asked for the name of the directory to which the\n" \ |
||
34 | "files are extracted. This directory _MUST_ exist. If you do not give\n" \ |
||
35 | "an output directory, the current default is used.\n\n\n" \ |
||
36 | "Device/directory for temporary files: " |
||
37 | #define T2 "Device/directory to extract to : " |
||
38 | |||
39 | #define T1LEN (sizeof(T1)-1) |
||
40 | #define T2LEN (sizeof(T2)-1) |
||
41 | |||
42 | static void xgetcwd (__QP_t *s) |
||
43 | { |
||
44 | extern char *_sys_var; |
||
45 | static __QP_t **q; |
||
46 | |||
47 | if (q = (__QP_t ** q) (_sys_var + 0xAC + 4)) |
||
48 | { |
||
49 | memcpy (s->chrs, (*q)->chrs, (*q)->len); |
||
50 | s->len = (*q)->len; |
||
51 | *(s->chrs+s->len) = 0; |
||
52 | } |
||
53 | } |
||
54 | |||
55 | int checkdir(__QP_t *dir) |
||
56 | { |
||
57 | qdirect_t s; |
||
58 | int r,ch; |
||
59 | |||
60 | if(dir->len > 1) |
||
61 | { |
||
62 | if(*(dir->chrs + dir->len-2) == '_') |
||
63 | { |
||
64 | *(dir->chrs + dir->len-1) = 0; |
||
65 | dir->len--; |
||
66 | } |
||
67 | else |
||
68 | { |
||
69 | *(dir->chrs + dir->len-1) = '_'; |
||
70 | } |
||
71 | } |
||
72 | else |
||
73 | { |
||
74 | xgetcwd(dir); |
||
75 | } |
||
76 | |||
77 | r = ERR_NF; |
||
78 | |||
79 | if((ch = io_open(dir->chrs, 4)) > 0) |
||
80 | { |
||
81 | if((r = fs_headr(ch, -1, &s, sizeof(s))) > 0) |
||
82 | { |
||
83 | r = (s.d_type == 0xff) ? 0 : ERR_NF; |
||
84 | } |
||
85 | io_close(ch); |
||
86 | } |
||
87 | return r; |
||
88 | } |
||
89 | |||
90 | int makesfx(__QP_t *tmp) |
||
91 | { |
||
92 | char *p = (char *)&ds; |
||
93 | char *q; |
||
94 | char txt[PATH_MAX]; |
||
95 | int fd,r = 0; |
||
96 | qdirect_t qd; |
||
97 | |||
98 | memcpy(txt, tmp->chrs, tmp->len); |
||
99 | memcpy(txt+tmp->len, "SFX_EXE", 8); |
||
100 | |||
101 | q = p + ds.offset; |
||
102 | if((fd = io_open(txt, NEW_OVER)) > 0) |
||
103 | { |
||
104 | memcpy(txt+tmp->len+4, "DAT", 4); |
||
105 | memcpy(q+ds.sfxnam, txt, tmp->len+8); |
||
106 | fs_save(fd, q, ds.sfxlen); |
||
107 | qd.d_length = ds.sfxlen; |
||
108 | qd.d_datalen = ds.sfxdsiz; |
||
109 | qd.d_type = 1; |
||
110 | fs_heads(fd, -1, &qd, sizeof(qd)); |
||
111 | io_close(fd); |
||
112 | if((fd = io_open(txt, NEW_OVER)) > 0) |
||
113 | { |
||
114 | q += ds.sfxlen; |
||
115 | fs_save(fd, q, ds.ziplen); |
||
116 | io_close(fd); |
||
117 | } |
||
118 | else r = fd; |
||
119 | } |
||
120 | else r = fd; |
||
121 | return r; |
||
122 | } |
||
123 | |||
124 | #define T3 "\n\nTo extract the files, run the command \"LRUN " |
||
125 | #define T4 "Press any key to exit " |
||
126 | #define T3LEN (sizeof(T3)-1) |
||
127 | #define T4LEN (sizeof(T4)-1) |
||
128 | |||
129 | int unpackit ( __QP_t *tmpdir, __QP_t *outdir, char *basfil, int con) |
||
130 | { |
||
131 | int ch, r = 0; |
||
132 | char c; |
||
133 | |||
134 | memcpy(basfil, tmpdir->chrs,tmpdir->len); |
||
135 | memcpy(basfil+tmpdir->len,"SFX_BAS", 8); |
||
136 | |||
137 | if((ch = io_open(basfil, NEW_OVER)) > 0) |
||
138 | { |
||
139 | char *p,txt[80]; |
||
140 | int l; |
||
141 | |||
142 | p = txt; |
||
143 | *p++ = 'E'; |
||
144 | *p++ = 'W'; |
||
145 | *p++ = ' '; |
||
146 | memcpy(p, tmpdir->chrs, tmpdir->len); |
||
147 | p += tmpdir->len; |
||
148 | memcpy(p, "SFX_EXE;'-d ", 12); |
||
149 | p += 12; |
||
150 | memcpy(p, outdir->chrs, outdir->len); |
||
151 | p += outdir->len; |
||
152 | *p++ = '\''; |
||
153 | *p++ = '\n'; |
||
154 | io_sstrg(ch, -1, txt, (int)(p-txt)); |
||
155 | |||
156 | memcpy(txt, "delete ", 7); |
||
157 | p = txt + 7; |
||
158 | memcpy(p, tmpdir->chrs, tmpdir->len); |
||
159 | p += tmpdir->len; |
||
160 | memcpy(p, "SFX_EXE\n", 8); |
||
161 | p += 4; |
||
162 | l = (int)(p+4-txt); |
||
163 | io_sstrg(ch, -1, txt, l); |
||
164 | memcpy(p, "DAT\n", 4); |
||
165 | io_sstrg(ch, -1, txt, l); |
||
166 | memcpy(p, "BAS\n", 4); |
||
167 | io_sstrg(ch, -1, txt, l); |
||
168 | io_close(ch); |
||
169 | makesfx((__QP_t *)tmpdir); |
||
170 | } |
||
171 | else r = ch; |
||
172 | |||
173 | if(r == 0) |
||
174 | { |
||
175 | char t3[80]; |
||
176 | char *p; |
||
177 | p = t3; |
||
178 | memcpy(p, T3, T3LEN); |
||
179 | p += T3LEN; |
||
180 | memcpy (p, basfil, tmpdir->len+7); |
||
181 | p += tmpdir->len+7; |
||
182 | *p++ = '"'; |
||
183 | *p++ = '\n'; |
||
184 | io_sstrg(con, -1, t3, (int)(p-t3)); |
||
185 | } |
||
186 | io_sstrg(con, -1, T4, T4LEN); |
||
187 | io_fbyte(con, (5*60*50), &c); |
||
188 | return r; |
||
189 | } |
||
190 | |||
191 | int main(void) |
||
192 | { |
||
193 | int con; |
||
194 | int r,n; |
||
195 | __QA(PATH_MAX) tmpdir; |
||
196 | __QA(PATH_MAX) outdir; |
||
197 | char basfil[PATH_MAX]; |
||
198 | |||
199 | con = io_open("con_480x160a16x38", 0); |
||
200 | sd_bordr(con, -1, 7, 2); |
||
201 | sd_clear(con, -1); |
||
202 | sd_cure (con, -1); |
||
203 | |||
204 | io_sstrg(con, -1, T1, T1LEN); |
||
205 | if((tmpdir.len = io_fline(con, -1, tmpdir.chrs, PATH_MAX-1)) > 1) |
||
206 | { |
||
207 | if((r = checkdir((__QP_t *)&tmpdir)) == 0) |
||
208 | { |
||
209 | io_sstrg(con, -1, T2, T2LEN); |
||
210 | if((outdir.len = io_fline(con, -1, outdir.chrs, PATH_MAX-1)) > 0) |
||
211 | { |
||
212 | if((r = checkdir((__QP_t *)&outdir)) == 0) |
||
213 | { |
||
214 | r = unpackit ((__QP_t *)&tmpdir, (__QP_t *)&outdir, |
||
215 | basfil, con); |
||
216 | } |
||
217 | } |
||
218 | } |
||
219 | } |
||
220 | sd_bordr(con, -1, 0, 0); |
||
221 | sd_clear(con, -1); |
||
222 | io_close(con); |
||
223 | return r; |
||
224 | } |