This is util.c in view mode; [Download] [Up]
/* ------------------------------------------------------------------------ */ /* LHa for UNIX */ /* util.c -- LHarc Util */ /* */ /* Modified Nobutaka Watazaki */ /* */ /* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */ /* ------------------------------------------------------------------------ */ #include "lha.h" /* * util.c - part of LHa for UNIX Feb 26 1992 modified by Masaru Oki Mar 4 * 1992 modified by Masaru Oki #ifndef USESTRCASECMP added. Mar 31 1992 * modified by Masaru Oki #ifdef NOMEMSET added. */ #include <errno.h> /* ------------------------------------------------------------------------ */ extern unsigned short crc; extern int quiet; /* ------------------------------------------------------------------------ */ long copyfile(f1, f2, size, crc_flg) /* return: size of source file */ FILE *f1; FILE *f2; long size; int crc_flg;/* 0: no crc, 1: crc check, 2: extract, 3: * append */ { unsigned short xsize; char *buf; long rsize = 0; if ((buf = (char *) malloc(BUFFERSIZE)) == NULL) fatal_error("virtual memory exhausted.\n"); crc = 0; if ((crc_flg == 2 || crc_flg) && text_mode) init_code_cache(); while (size > 0) { /* read */ if (crc_flg == 3 && text_mode) { xsize = fread_txt(buf, BUFFERSIZE, f1); if (xsize == 0) break; if (ferror(f1)) { fatal_error("file read error\n"); } } else { xsize = (size > BUFFERSIZE) ? BUFFERSIZE : size; if (fread(buf, 1, xsize, f1) != xsize) { fatal_error("file read error\n"); } } /* write */ if (f2) { if (crc_flg == 2 && text_mode) { if (fwrite_txt(buf, xsize, f2)) { fatal_error("file write error\n"); } } else { if (fwrite(buf, 1, xsize, f2) != xsize) { fatal_error("file write error\n"); } } } /* calculate crc */ if (crc_flg) { calccrc(buf, xsize); } rsize += xsize; if (crc_flg != 3 || !text_mode) size -= xsize; } free(buf); return rsize; } /* ------------------------------------------------------------------------ */ int encode_stored_crc(ifp, ofp, size, original_size_var, write_size_var) FILE *ifp, *ofp; long size; long *original_size_var; long *write_size_var; { int save_quiet; save_quiet = quiet; quiet = 1; size = copyfile(ifp, ofp, size, 3); *original_size_var = *write_size_var = size; quiet = save_quiet; return crc; } /* ------------------------------------------------------------------------ */ /* convert path delimit erreturns *filename */ /* ------------------------------------------------------------------------ */ unsigned char * convdelim(path, delim) unsigned char *path; unsigned char delim; { unsigned char c; unsigned char *p; #ifdef MULTIBYTE_CHAR int kflg; kflg = 0; #endif for (p = path; (c = *p) != 0; p++) { #ifdef MULTIBYTE_CHAR if (kflg) { kflg = 0; } else if (iskanji(c)) { kflg = 1; } else #endif if (c == '\\' || c == DELIM || c == DELIM2) { *p = delim; path = p + 1; } } return path; } /* ------------------------------------------------------------------------ */ /* If TRUE, archive file name is msdos SFX file name. */ boolean archive_is_msdos_sfx1(name) char *name; { int len = strlen(name); return ((len >= 4) && (strucmp(".COM", name + len - 4) == 0 || strucmp(".EXE", name + len - 4) == 0)) || ((len >= 2) && (strucmp(".x", name + len - 2) == 0)); } /* ------------------------------------------------------------------------ */ /* skip SFX header */ boolean skip_msdos_sfx1_code(fp) FILE *fp; { unsigned char buffer[4096]; unsigned char *p, *q; int n; n = fread(buffer, sizeof(char), 4096, fp); for (p = buffer + 2, q = buffer + n - 5; p < q; p++) { /* found "-l??-" keyword (as METHOD type string) */ if (p[0] == '-' && p[1] == 'l' && p[4] == '-') { /* size and checksum validate check */ if (p[-2] > 20 && p[-1] == calc_sum(p, p[-2])) { fseek(fp, ((p - 2) - buffer) - n, SEEK_CUR); return TRUE; } } } fseek(fp, -n, SEEK_CUR); return FALSE; } /* * strdup(3) */ /* ------------------------------------------------------------------------ */ #ifdef NOSTRDUP char * strdup(buf) char *buf; { char *p; if ((p = (char *) malloc(strlen(buf) + 1)) == NULL) return NULL; strcpy(p, buf); return p; } #endif /* * memmove( char *dst , char *src , size_t cnt ) */ /* ------------------------------------------------------------------------ */ #if defined(NOBSTRING) && !defined(__STDC__) void * memmove(dst, src, cnt) register char *dst, *src; register int cnt; { if (dst == src) return dst; if (src > dst) { while (--cnt >= 0) *dst++ = *src++; } else { dst += cnt; src += cnt; while (--cnt >= 0) *--dst = *--src; } return dst; } #endif /* * rename - change the name of file 91.11.02 by Tomohiro Ishikawa * (ishikawa@gaia.cow.melco.CO.JP) 92.01.20 little modified (added #ifdef) by * Masaru Oki 92.01.28 added mkdir() and rmdir() by Tomohiro Ishikawa */ #if defined(NOFTRUNCATE) && !defined(_MINIX) /* ------------------------------------------------------------------------ */ int rename(from, to) char *from, *to; { struct stat s1, s2; extern int errno; if (stat(from, &s1) < 0) return (-1); /* is 'FROM' file a directory? */ if ((s1.st_mode & S_IFMT) == S_IFDIR) { errno = ENOTDIR; return (-1); } if (stat(to, &s2) >= 0) { /* 'TO' exists! */ /* is 'TO' file a directory? */ if ((s2.st_mode & S_IFMT) == S_IFDIR) { errno = EISDIR; return (-1); } if (unlink(to) < 0) return (-1); } if (link(from, to) < 0) return (-1); if (unlink(from) < 0) return (-1); return (0); } #endif /* NOFTRUNCATE */ /* ------------------------------------------------------------------------ */ #ifdef NOMKDIR #ifndef MKDIRPATH #define MKDIRPATH "/bin/mkdir" #endif #ifndef RMDIRPATH #define RMDIRPATH "/bin/rmdir" #endif int rmdir(path) char *path; { int stat, rtn = 0; char *cmdname; if ((cmdname = (char *) malloc(strlen(RMDIRPATH) + 1 + strlen(path) + 1)) == 0) return (-1); strcpy(cmdname, RMDIRPATH); *(cmdname + strlen(RMDIRPATH)) = ' '; strcpy(cmdname + strlen(RMDIRPATH) + 1, path); if ((stat = system(cmdname)) < 0) rtn = -1; /* fork or exec error */ else if (stat) { /* RMDIR command error */ errno = EIO; rtn = -1; } free(cmdname); return (rtn); } /* ------------------------------------------------------------------------ */ int mkdir(path, mode) char *path; int mode; { int child, stat; char *cmdname, *cmdpath = MKDIRPATH; if ((cmdname = (char *) strrchr(cmdpath, '/')) == (char *) 0) cmdname = cmdpath; if ((child = fork()) < 0) return (-1); /* fork error */ else if (child) { /* parent process */ while (child != wait(&stat)) /* ignore signals */ continue; } else { /* child process */ int maskvalue; maskvalue = umask(0); /* get current umask() value */ umask(maskvalue | (0777 & ~mode)); /* set it! */ execl(cmdpath, cmdname, path, (char *) 0); /* never come here except execl is error */ return (-1); } if (stat != 0) { errno = EIO; /* cannot get error num. */ return (-1); } return (0); } #endif /* * strucmp modified: Oct 29 1991 by Masaru Oki */ #ifndef USESTRCASECMP static int my_toupper(n) register int n; { if (n >= 'a' && n <= 'z') return n & (~('a' - 'A')); return n; } /* ------------------------------------------------------------------------ */ int strucmp(s, t) register char *s, *t; { while (my_toupper(*s++) == my_toupper(*t++)) if (!*s || !*t) break; if (!*s && !*t) return 0; return 1; } #endif /* ------------------------------------------------------------------------ */ #ifdef NOMEMSET /* Public Domain memset(3) */ char * memset(s, c, n) char *s; int c, n; { char *p = s; while (n--) *p++ = (char) c; return s; } #endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.