home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2001 January
/
VPR0101A.BIN
/
OLS
/
TAR32053
/
tar32053.exe
/
SRC
/
TARDIR.C
< prev
next >
Wrap
C/C++ Source or Header
|
1999-05-23
|
5KB
|
181 lines
#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: RCS/tardir.c 2.6 91/02/19 14:27:58 kmori Exp $";
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h> /* for debug */
#include <sys/types.h>
#include <sys/stat.h>
#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);
}