1 /* ------------------------------------------------------------------------ */
3 /* util.c -- LHarc Util */
5 /* Modified Nobutaka Watazaki */
7 /* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
8 /* Ver. 1.14e Support for sfx archives 1999.05.28 T.Okamoto */
9 /* ------------------------------------------------------------------------ */
12 * util.c - part of LHa for UNIX Feb 26 1992 modified by Masaru Oki Mar 4
13 * 1992 modified by Masaru Oki #ifndef USESTRCASECMP added. Mar 31 1992
14 * modified by Masaru Oki #ifdef NOMEMSET added.
18 /* ------------------------------------------------------------------------ */
19 extern unsigned short crc;
21 /* ------------------------------------------------------------------------ */
23 copyfile(f1, f2, size, crc_flg) /* return: size of source file */
27 int crc_flg;/* 0: no crc, 1: crc check, 2: extract, 3:
34 if ((buf = (char *) malloc(BUFFERSIZE)) == NULL)
35 fatal_error("virtual memory exhausted.\n");
37 if ((crc_flg == 2 || crc_flg) && text_mode)
41 if (crc_flg == 3 && text_mode) {
42 xsize = fread_txt(buf, BUFFERSIZE, f1);
46 fatal_error("file read error\n");
50 xsize = (size > BUFFERSIZE) ? BUFFERSIZE : size;
51 if (fread(buf, 1, xsize, f1) != xsize) {
52 fatal_error("file read error\n");
57 if (crc_flg == 2 && text_mode) {
58 if (fwrite_txt(buf, xsize, f2)) {
59 fatal_error("file write error\n");
63 if (fwrite(buf, 1, xsize, f2) != xsize) {
64 fatal_error("file write error\n");
73 if (crc_flg != 3 || !text_mode)
80 /* ------------------------------------------------------------------------ */
82 encode_stored_crc(ifp, ofp, size, original_size_var, write_size_var)
85 long *original_size_var;
92 size = copyfile(ifp, ofp, size, 3);
93 *original_size_var = *write_size_var = size;
98 /* ------------------------------------------------------------------------ */
99 /* convert path delimit
100 erreturns *filename */
101 /* ------------------------------------------------------------------------ */
103 convdelim(path, delim)
109 #ifdef MULTIBYTE_CHAR
114 for (p = path; (c = *p) != 0; p++) {
115 #ifdef MULTIBYTE_CHAR
119 else if (MULTIBYTE_FIRST_P(c)) {
124 if (c == '\\' || c == DELIM || c == DELIM2) {
132 /* ------------------------------------------------------------------------ */
133 /* If TRUE, archive file name is msdos SFX file name. */
135 archive_is_msdos_sfx1(name)
138 int len = strlen(name);
140 return ((len >= 4) &&
141 (strucmp(".COM", name + len - 4) == 0 ||
142 strucmp(".EXE", name + len - 4) == 0)) ||
144 (strucmp(".x", name + len - 2) == 0));
147 /* ------------------------------------------------------------------------ */
148 /* skip SFX header */
150 skip_msdos_sfx1_code(fp)
153 unsigned char buffer[MAXSFXCODE];
154 unsigned char *p, *q;
157 n = fread(buffer, sizeof(char), MAXSFXCODE, fp);
159 for (p = buffer + 2, q = buffer + n - /* 5 */ (I_HEADER_LEVEL+1)-2; p < q; p++) {
160 /* found "-l??-" keyword (as METHOD type string) */
161 if (p[0] == '-' && p[1] == 'l' && p[4] == '-') {
162 /* size and checksum validate check */
163 if ( (p[I_HEADER_LEVEL-2] == 0 || p[I_HEADER_LEVEL-2] == 0)
164 && p[I_HEADER_SIZE-2] > 20
165 && p[I_HEADER_CHECKSUM-2] == calc_sum(p, p[-2])) {
166 fseek(fp, ((p - 2) - buffer) - n, SEEK_CUR);
168 } else if (p[I_HEADER_LEVEL-2] == 2 && p[I_HEADER_SIZE-2] >= 24
169 && p[I_ATTRIBUTE-2] == 0x20) {
170 fseek(fp, ((p - 2) - buffer) - n, SEEK_CUR);
176 fseek(fp, -n, SEEK_CUR);
184 /* ------------------------------------------------------------------------ */
192 if ((p = (char *) malloc(strlen(buf) + 1)) == NULL)
200 * memmove( char *dst , char *src , size_t cnt )
203 /* ------------------------------------------------------------------------ */
204 #if defined(NOBSTRING) && !defined(__STDC__)
206 memmove(dst, src, cnt)
207 register char *dst, *src;
227 * rename - change the name of file 91.11.02 by Tomohiro Ishikawa
228 * (ishikawa@gaia.cow.melco.CO.JP) 92.01.20 little modified (added #ifdef) by
229 * Masaru Oki 92.01.28 added mkdir() and rmdir() by Tomohiro Ishikawa
232 #if !defined(HAVE_FTRUNCATE) && !defined(_MINIX)
234 /* ------------------------------------------------------------------------ */
242 if (stat(from, &s1) < 0)
244 /* is 'FROM' file a directory? */
245 if ((s1.st_mode & S_IFMT) == S_IFDIR) {
249 if (stat(to, &s2) >= 0) { /* 'TO' exists! */
250 /* is 'TO' file a directory? */
251 if ((s2.st_mode & S_IFMT) == S_IFDIR) {
258 if (link(from, to) < 0)
260 if (unlink(from) < 0)
264 #endif /* !HAVE_FTRUNCATE */
265 /* ------------------------------------------------------------------------ */
269 #define MKDIRPATH "/bin/mkdir"
272 #define RMDIRPATH "/bin/rmdir"
280 if ((cmdname = (char *) malloc(strlen(RMDIRPATH) + 1 + strlen(path) + 1))
283 strcpy(cmdname, RMDIRPATH);
284 *(cmdname + strlen(RMDIRPATH)) = ' ';
285 strcpy(cmdname + strlen(RMDIRPATH) + 1, path);
286 if ((stat = system(cmdname)) < 0)
287 rtn = -1; /* fork or exec error */
288 else if (stat) { /* RMDIR command error */
296 /* ------------------------------------------------------------------------ */
303 char *cmdname, *cmdpath = MKDIRPATH;
304 if ((cmdname = (char *) strrchr(cmdpath, '/')) == (char *) 0)
306 if ((child = fork()) < 0)
307 return (-1); /* fork error */
308 else if (child) { /* parent process */
309 while (child != wait(&stat)) /* ignore signals */
312 else { /* child process */
314 maskvalue = umask(0); /* get current umask() value */
315 umask(maskvalue | (0777 & ~mode)); /* set it! */
316 execl(cmdpath, cmdname, path, (char *) 0);
317 /* never come here except execl is error */
321 errno = EIO; /* cannot get error num. */
329 * strucmp modified: Oct 29 1991 by Masaru Oki
332 #ifndef HAVE_STRCASECMP
337 if (n >= 'a' && n <= 'z')
338 return n & (~('a' - 'A'));
342 /* ------------------------------------------------------------------------ */
345 register char *s, *t;
347 while (my_toupper(*s++) == my_toupper(*t++))
356 /* ------------------------------------------------------------------------ */
358 /* Public Domain memset(3) */
370 /* Local Variables: */