#ifndef __DEFCONF_H #include "defconf.h" #endif /* This file was hacked for kmtar for WIN32 at 1996-05-06. by tantan SGL00213@niftyserve.or.jp */ /* * tardir.c - handle tar directory */ #ifdef RCSID static char rcsid[] = "$Header: /circus/cvsroot/tar32_1/Src/SRC/TARDIR.C,v 1.1.1.1 1999/12/19 06:04:50 tsuneo Exp $"; #endif #include #include #include #include #include /* for debug */ #include #include #include "defs.h" #include "tar.h" #include "tardir.h" #include "main.h" #include "misc.h" #include "nkf.h" #include "tar32.h" static int signed_char_type=0; /* In LSI-C unsigned char is default */ unsigned compsum(HEADER *block) { int i; unsigned sum; sum = 0; for (i = 0; i < NAMSIZ + 8 + 8 + 8 + 12 + 12; i++) sum += signed_char_type ? block->dummy[i]: (unsigned char) block->dummy[i]; sum += ' ' * 8; for (i += 8; i < TBLOCK; i++) sum += signed_char_type ? block->dummy[i]: (unsigned char) block->dummy[i]; return (sum); } /* 書庫からファイル名を得るときにファイル名をsrcからdestに変換する。*/ global void get_filename_conversion(char *dest,char *src) { #ifdef USE_NKF_DLL /* ...tsuneo */ SetNkfOption(OPTION_nkf_get_filename_conversion); NkfConvert(dest,src); #else strcpy(dest,src); #endif } global char decode_dir_e(char *name, struct stat *p, HEADER *block) { unsigned sum; char nametmp[FNAME_BUF]; #ifndef MSC #define _off_t long #define time_t long #endif p->st_mode = (unsigned short)strtol(block->dbuf.mode, NULL, 8); p->st_size = (_off_t)strtol(block->dbuf.size, NULL, 8); p->st_mtime = (time_t)strtol(block->dbuf.mtime, NULL, 8); #if (MSC_VER==7) p->st_mtime += 0x83ABD000; #endif #ifdef WIN32 p->st_uid = (short)strtol(block->dbuf.uid, NULL, 8); p->st_gid = (short)strtol(block->dbuf.gid, NULL, 8); #else p->st_uid = strtol(block->dbuf.uid, NULL, 8); p->st_gid = strtol(block->dbuf.gid, NULL, 8); #endif sum = strtol(block->dbuf.chksum, NULL, 8); strncpy(nametmp, block->dbuf.name,NAMSIZ /* 100*/);/*... tsuneo*/ nametmp[FNAME_BUF - 1] = '\0'; get_filename_conversion(name,nametmp); if (sum != compsum(block)) return ('e'); return (block->dbuf.typeflag); } global char decode_dir(char *name, struct stat *p, HEADER *block) { char type; if ((type = decode_dir_e(name, p, block)) == 'e'){ char temp; signed_char_type = 1; temp = decode_dir_e(name, p, block); signed_char_type = 0; if (temp != 'e'){ if (Vflag) printf("Warrning: header check sum. this file seems to ceated by old MS-C version.\n"); type = temp; } } if (type == 'e'){ Exitcode=ERROR_FILE_CRC; puts("dir: Check sum error"); //fatal("dir", "Check sum error"); } return (type); } /* 書庫に格納する前にファイル名をsrcからdestに変換する */ /* encode_dir及びaddfile_lname(main.c)で使われている*/ global void set_filename_conversion(char *dest,char *src) { #ifdef USE_NKF_DLL /* ...tsuneo */ SetNkfOption(OPTION_nkf_set_filename_conversion); NkfConvert(dest,src); #else strcpy(dest,src); #endif } global void encode_dir(HEADER *block, char *name, struct stat *p, char flag) { char *user; char nametmp[FNAME_BUF]; set_filename_conversion(nametmp,name); strncpy(block->dbuf.name, nametmp,NAMSIZ-1); /* tarnt 0.96->0.97 */ if ((p->st_mode & S_IFMT) == S_IFDIR) addsl(block->dbuf.name); sprintf(block->dbuf.mode, "%6o ", (unsigned int)p->st_mode); strcpy(block->dbuf.uid, "000000 "); strcpy(block->dbuf.gid, "000000 "); sprintf(block->dbuf.size, "%11lo ", p->st_size); /*#ifdef MSC*/ #if (MSC_VER==7) p->st_mtime -= 0x83ABD000; #endif sprintf(block->dbuf.mtime, "%11lo ", p->st_mtime); block->dbuf.typeflag = flag; memset(block->dbuf.linkname, 0, NAMSIZ); if (Gflag) { memcpy(block->dbuf.magic, TOMAGIC, TOMAGLEN); } else { memcpy(block->dbuf.magic, TMAGIC, TMAGLEN); memcpy(block->dbuf.version, TVERSION, TVERSLEN); } if ((user = getenv("USER")) != NULL) strncpy(block->dbuf.uname, user, sizeof block->dbuf.uname); #ifdef WIN32 else if ((user = getenv("USERNAME")) != NULL) strncpy(block->dbuf.uname, user, sizeof block->dbuf.uname); #endif else strcpy(block->dbuf.uname, "root"); sprintf(block->dbuf.chksum, "%6o ", compsum(block)); } global int eofblock(char *block) { int n; for (n = TBLOCK; n; n--) { if (*block++) return (0); } return (1); }