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 buf = (char *)xmalloc(BUFFERSIZE);
36 if ((crc_flg == 2 || crc_flg) && text_mode)
40 if (crc_flg == 3 && text_mode) {
41 xsize = fread_txt(buf, BUFFERSIZE, f1);
45 fatal_error("file read error\n");
49 xsize = (size > BUFFERSIZE) ? BUFFERSIZE : size;
50 if (fread(buf, 1, xsize, f1) != xsize) {
51 fatal_error("file read error\n");
56 if (crc_flg == 2 && text_mode) {
57 if (fwrite_txt(buf, xsize, f2)) {
58 fatal_error("file write error\n");
62 if (fwrite(buf, 1, xsize, f2) != xsize) {
63 fatal_error("file write error\n");
72 if (crc_flg != 3 || !text_mode)
79 /* ------------------------------------------------------------------------ */
81 encode_stored_crc(ifp, ofp, size, original_size_var, write_size_var)
84 long *original_size_var;
91 size = copyfile(ifp, ofp, size, 3);
92 *original_size_var = *write_size_var = size;
97 /* ------------------------------------------------------------------------ */
98 /* convert path delimit
99 erreturns *filename */
100 /* ------------------------------------------------------------------------ */
102 convdelim(path, delim)
108 #ifdef MULTIBYTE_CHAR
113 for (p = path; (c = *p) != 0; p++) {
114 #ifdef MULTIBYTE_CHAR
118 else if (MULTIBYTE_FIRST_P(c)) {
123 if (c == '\\' || c == DELIM || c == DELIM2) {
131 /* ------------------------------------------------------------------------ */
132 /* If TRUE, archive file name is msdos SFX file name. */
134 archive_is_msdos_sfx1(name)
137 int len = strlen(name);
139 return ((len >= 4) &&
140 (strucmp(".COM", name + len - 4) == 0 ||
141 strucmp(".EXE", name + len - 4) == 0)) ||
143 (strucmp(".x", name + len - 2) == 0));
146 /* ------------------------------------------------------------------------ */
147 /* skip SFX header */
149 skip_msdos_sfx1_code(fp)
152 unsigned char buffer[MAXSFXCODE];
153 unsigned char *p, *q;
156 n = fread(buffer, sizeof(char), MAXSFXCODE, fp);
158 for (p = buffer + 2, q = buffer + n - /* 5 */ (I_HEADER_LEVEL+1)-2; p < q; p++) {
159 /* found "-l??-" keyword (as METHOD type string) */
160 if (p[0] == '-' && p[1] == 'l' && p[4] == '-') {
161 /* size and checksum validate check */
162 if ( (p[I_HEADER_LEVEL-2] == 0 || p[I_HEADER_LEVEL-2] == 0)
163 && p[I_HEADER_SIZE-2] > 20
164 && p[I_HEADER_CHECKSUM-2] == calc_sum(p, p[-2])) {
165 fseek(fp, ((p - 2) - buffer) - n, SEEK_CUR);
167 } else if (p[I_HEADER_LEVEL-2] == 2 && p[I_HEADER_SIZE-2] >= 24
168 && p[I_ATTRIBUTE-2] == 0x20) {
169 fseek(fp, ((p - 2) - buffer) - n, SEEK_CUR);
175 fseek(fp, -n, SEEK_CUR);
183 /* ------------------------------------------------------------------------ */
191 if ((p = (char *) malloc(strlen(buf) + 1)) == NULL)
199 * memmove( char *dst , char *src , size_t cnt )
202 /* ------------------------------------------------------------------------ */
203 #if defined(NOBSTRING) && !defined(__STDC__)
205 memmove(dst, src, cnt)
206 register char *dst, *src;
226 * rename - change the name of file 91.11.02 by Tomohiro Ishikawa
227 * (ishikawa@gaia.cow.melco.CO.JP) 92.01.20 little modified (added #ifdef) by
228 * Masaru Oki 92.01.28 added mkdir() and rmdir() by Tomohiro Ishikawa
231 #if !defined(HAVE_FTRUNCATE) && !defined(_MINIX)
233 /* ------------------------------------------------------------------------ */
236 const char *from, *to;
241 if (stat(from, &s1) < 0)
243 /* is 'FROM' file a directory? */
244 if ((s1.st_mode & S_IFMT) == S_IFDIR) {
248 if (stat(to, &s2) >= 0) { /* 'TO' exists! */
249 /* is 'TO' file a directory? */
250 if ((s2.st_mode & S_IFMT) == S_IFDIR) {
257 if (link(from, to) < 0)
259 if (unlink(from) < 0)
263 #endif /* !HAVE_FTRUNCATE */
264 /* ------------------------------------------------------------------------ */
268 #define MKDIRPATH "/bin/mkdir"
271 #define RMDIRPATH "/bin/rmdir"
279 if ((cmdname = (char *) malloc(strlen(RMDIRPATH) + 1 + strlen(path) + 1))
282 strcpy(cmdname, RMDIRPATH);
283 *(cmdname + strlen(RMDIRPATH)) = ' ';
284 strcpy(cmdname + strlen(RMDIRPATH) + 1, path);
285 if ((stat = system(cmdname)) < 0)
286 rtn = -1; /* fork or exec error */
287 else if (stat) { /* RMDIR command error */
295 /* ------------------------------------------------------------------------ */
302 char *cmdname, *cmdpath = MKDIRPATH;
303 if ((cmdname = (char *) strrchr(cmdpath, '/')) == (char *) 0)
305 if ((child = fork()) < 0)
306 return (-1); /* fork error */
307 else if (child) { /* parent process */
308 while (child != wait(&stat)) /* ignore signals */
311 else { /* child process */
313 maskvalue = umask(0); /* get current umask() value */
314 umask(maskvalue | (0777 & ~mode)); /* set it! */
315 execl(cmdpath, cmdname, path, (char *) 0);
316 /* never come here except execl is error */
320 errno = EIO; /* cannot get error num. */
328 * strucmp modified: Oct 29 1991 by Masaru Oki
331 #ifndef HAVE_STRCASECMP
336 if (n >= 'a' && n <= 'z')
337 return n & (~('a' - 'A'));
341 /* ------------------------------------------------------------------------ */
344 register char *s, *t;
346 while (my_toupper(*s++) == my_toupper(*t++))
355 /* ------------------------------------------------------------------------ */
357 /* Public Domain memset(3) */
370 /* Local Variables: */
373 /* compile-command:"gcc -c util.c" */