home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.rarlab.com
/
2014.05.ftp.rarlab.com.tar
/
ftp.rarlab.com
/
rar
/
sunrar.zip
/
os.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-07-01
|
9KB
|
501 lines
int MakeDir(char *Name,UDWORD Attr)
{
#ifdef _WIN_32
if (mkdir(Name)==0)
{
SetFileAttributes(Name,Attr);
return(0);
}
return(-1);
#endif
#ifdef _UNIX
return(mkdir((Name),(mode_t)(Attr)));
#endif
}
/* Generating sound MSec milliseconds duration and Freq frequency
*/
void MakeSound(int MSec,int Freq)
{
printf("\007");
}
/* Return date format:
0 - Month-Day-Year
1 - Day-Month-Year
2 - Year-Month-Day
*/
int DateFormat(void)
{
return(1);
}
/* Check is drive removable
NumDrive: 0 - A, 1 - B, ...
*/
int IsRemovable(int NumDrive)
{
#ifdef _WIN_32
char Root[10];
sprintf(Root,"%c:\\",NumDrive+'A');
return(GetDriveType(Root)==DRIVE_REMOVABLE);
#else
return(0);
#endif
}
/* Display ANSI comments
Addr - comment address
Size - comment length
*/
void ShowAnsiComment(UBYTE *Addr,unsigned int Size)
{
fwrite(Addr,1,Size,stdout);
fflush(stdout);
}
/* Input string for password
*/
void GetPswStr(char *Str)
{
gets(Str);
}
/* return current disk number
0 - A, 1 - B, ...
or return -1 if unknown
*/
int GetCurDisk(void)
{
#ifdef _WIN_32
unsigned int Drive;
_dos_getdrive(&Drive);
return(Drive-1);
#endif
#ifdef _UNIX
return(-1);
#endif
}
int GetFileStat(char *Name,struct FileStat *FS)
{
#ifdef _WIN_32
struct find_t ff;
if (_dos_findfirst(Name,FM_ARCH|FM_DIREC|FM_RDONLY,&ff)!=0)
return(0);
FS->FileAttr=ff.attrib;
FS->IsDir=IsDir(ff.attrib);
FS->FileTime=ff.wr_time+((UDWORD)ff.wr_date<<16);
FS->FileSize=ff.size;
return(1);
#endif
#ifdef _UNIX
struct stat st;
if (stat(Name,&st)!=0)
return(0);
FS->FileAttr=st.st_mode;
FS->IsDir=st.st_mode & S_IFDIR;
FS->FileSize=st.st_size;
FS->FileTime=UnixTimeToDos(st.st_mtime);
return(1);
#endif
}
#ifdef _UNIX
UDWORD UnixTimeToDos(time_t UnixTime)
{
struct tm *t;
UDWORD DosTime;
t=localtime(&UnixTime);
DosTime=(t->tm_sec/2)|(t->tm_min<<5)|(t->tm_hour<<11)|
(t->tm_mday<<16)|((t->tm_mon+1)<<21)|((t->tm_year-80)<<25);
return(DosTime);
}
time_t DosTimeToUnix(UDWORD DosTime)
{
struct tm t;
t.tm_sec=(DosTime & 0x1f)*2;
t.tm_min=(DosTime>>5) & 0x3f;
t.tm_hour=(DosTime>>11) & 0x1f;
t.tm_mday=(DosTime>>16) & 0x1f;
t.tm_mon=((DosTime>>21)-1) & 0x0f;
t.tm_year=(DosTime>>25)+80;
t.tm_isdst=-1;
return(mktime(&t));
}
#endif
void ConvertDate(UDWORD ft)
{
static int Format=-1;
int Year;
Year=(int)(((ft>>25)+1980)%100);
if (Format==-1)
Format=DateFormat();
switch (Format)
{
case 0:
sprintf(DateStr,"%02d%02d%02d%02d%02d",
(int)(ft>>21)&0xf,(int)(ft>>16)&0x1f,Year,
(int)(ft>>11)&0x1f,(int)(ft>>5)&0x3f);
break;
case 1:
sprintf(DateStr,"%02d%02d%02d%02d%02d",
(int)(ft>>16)&0x1f,(int)(ft>>21)&0xf,Year,
(int)(ft>>11)&0x1f,(int)(ft>>5)&0x3f);
break;
default:
sprintf(DateStr,"%02d%02d%02d%02d%02d",
Year,(int)(ft>>21)&0xf,(int)(ft>>16)&0x1f,
(int)(ft>>11)&0x1f,(int)(ft>>5)&0x3f);
break;
}
}
void SetOpenFileStat(FILE *FPtr)
{
#ifdef _WIN_32
SetOpenFileTime(FPtr,NewLhd.FileTime);
#endif
}
void SetCloseFileStat(char *Name)
{
#ifdef _WIN_32
_dos_setfileattr(Name,NewLhd.FileAttr);
#endif
#ifdef _UNIX
struct utimbuf ut;
chmod(Name,(mode_t)NewLhd.FileAttr);
SetCloseFileTime(Name,NewLhd.FileTime);
#endif
}
void SetOpenFileTime(FILE *FPtr,UDWORD ft)
{
#ifdef _WIN_32
fflush(FPtr);
_dos_setftime(fileno(FPtr),ft>>16,ft);
#endif
}
void SetCloseFileTime(char *Name,UDWORD ft)
{
#ifdef _UNIX
struct utimbuf ut;
ut.actime=ut.modtime=DosTimeToUnix(ft);
utime(Name,&ut);
#endif
}
UDWORD GetOpenFileTime(FILE *FPtr)
{
#ifdef _WIN_32
unsigned int FileDate,FileTime;
_dos_getftime(fileno(FPtr),&FileDate,&FileTime);
return(((UDWORD)FileDate<<16)+FileTime);
#endif
#ifdef _UNIX
struct stat st;
fstat(fileno(FPtr),&st);
return(UnixTimeToDos(st.st_mtime));
#endif
}
int FileExist(char *FileName)
{
#ifdef ENABLE_ACCESS
return(access(FileName,0)==0);
#else
FILE *FPtr;
if ((FPtr=fopen(FileName,READBINARY))==NULL)
{
if (errno==ENOENT)
return(0);
}
else
fclose(FPtr);
return(1);
#endif
}
FILE* topen(char *Name,char *Mode,unsigned int Sharing)
{
FILE *FPtr;
FPtr=ShareOpen(Name,Mode,Sharing);
if (FPtr==NULL)
{
mprintf(MCannotFOpen,Name);
ErrExit(EEMPTY,OPEN_ERROR);
}
return(FPtr);
}
FILE* wopen(char *Name,char *Mode,unsigned int Sharing)
{
FILE *FPtr;
FPtr=ShareOpen(Name,Mode,Sharing);
if (FPtr==NULL)
mprintf(MCannotFOpen,Name);
return(FPtr);
}
FILE* ShareOpen(char *Name,char *Mode,unsigned int Sharing)
{
FILE *FPtr;
#ifdef _WIN_32
unsigned int ShFlags;
switch (Sharing)
{
case M_DENYREAD:
ShFlags=SH_DENYRD;
break;
case M_DENYWRITE:
ShFlags=SH_DENYWR;
break;
case M_DENYNONE:
ShFlags=SH_DENYNONE;
break;
case M_DENYALL:
ShFlags=SH_DENYNO;
break;
}
FPtr=_fsopen(Name,Mode,ShFlags);
#else
FPtr=fopen(Name,Mode);
#endif
return(FPtr);
}
int SplitPath(char *FullName,char *Path,char *Name,int RemoveDrive)
{
char *ChPtr;
if (RemoveDrive && (ChPtr=strchr(FullName,':'))!=NULL)
ChPtr++;
else
ChPtr=FullName;
strcpy(Name,PointToName(ChPtr));
strcpy(Path,ChPtr);
Path[strlen(ChPtr)-strlen(Name)]=0;
if (strchr(ChPtr,'?')!=NULL || strchr(ChPtr,'*')!=NULL)
return(1);
else
return(0);
}
int GetPathDisk(char *Path)
{
if (isalpha(*Path) && Path[1]==':')
return(toupper(*Path)-'A');
else
return(-1);
}
void ShowAttr(void)
{
UDWORD A;
A=NewLhd.FileAttr;
switch(NewLhd.HostOS)
{
case MS_DOS:
case OS2:
case WIN_32:
mprintf(" %c%c%c%c%c%c ",
(A & 0x08) ? 'V' : '.',
(A & 0x10) ? 'D' : '.',
(A & 0x01) ? 'R' : '.',
(A & 0x02) ? 'H' : '.',
(A & 0x04) ? 'S' : '.',
(A & 0x20) ? 'A' : '.');
break;
case UNIX:
mprintf("%c%c%c%c%c%c%c%c%c%c",
(A & 0x4000) ? 'd' : '-',
(A & 0x0100) ? 'r' : '-',
(A & 0x0080) ? 'w' : '-',
(A & 0x0040) ? ((A & 0x0800) ? 's':'x'):((A & 0x0800) ? 'S':'-'),
(A & 0x0020) ? 'r' : '-',
(A & 0x0010) ? 'w' : '-',
(A & 0x0008) ? ((A & 0x0400) ? 's':'x'):((A & 0x0400) ? 'S':'-'),
(A & 0x0004) ? 'r' : '-',
(A & 0x0002) ? 'w' : '-',
(A & 0x0001) ? 'x' : '-');
break;
}
}
int IsDir(UDWORD Attr)
{
return(Attr & FM_DIREC);
}
int IsLabel(UDWORD Attr)
{
return(Attr & FM_LABEL);
}
void ConvertFlags(void)
{
#ifdef _WIN_32
switch(NewLhd.HostOS)
{
case MS_DOS:
case OS2:
case WIN_32:
break;
case UNIX:
if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY)
NewLhd.FileAttr=FM_DIREC;
else
NewLhd.FileAttr=FM_ARCH;
break;
default:
if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY)
NewLhd.FileAttr=FM_DIREC;
else
NewLhd.FileAttr=FM_ARCH;
break;
}
#endif
#ifdef _UNIX
switch(NewLhd.HostOS)
{
case MS_DOS:
case OS2:
case WIN_32:
if (NewLhd.FileAttr & 0x10)
NewLhd.FileAttr=0x41ff;
else
if (NewLhd.FileAttr & 1)
NewLhd.FileAttr=0x816d;
else
NewLhd.FileAttr=0x81ff;
break;
case UNIX:
break;
default:
if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY)
NewLhd.FileAttr=0x41ff;
else
NewLhd.FileAttr=0x81ff;
break;
}
#endif
}
DIR * DirOpen(char *Name)
{
char DirName[NM],*NPtr,*DPtr;
int I;
if (Name[0] && Name[1]==':')
{
strncpy(DirName,Name,2);
DirName[2]=0;
NPtr=&Name[2];
DPtr=&DirName[2];
}
else
{
NPtr=Name;
DPtr=DirName;
}
if (*NPtr)
{
strcpy(DPtr,NPtr);
I=strlen(DPtr)-1;
if (IsPathDiv(DPtr[I]))
if (I>0)
DPtr[I]=0;
else
strcat(DPtr,".");
}
else
*DPtr=0;
if (*DPtr==0)
strcpy(DPtr,".");
return(opendir(DirName));
}
int IsPathDiv(int Ch)
{
if (Ch=='\\' || Ch=='/')
return(1);
return(0);
}
int IsDriveDiv(int Ch)
{
#ifdef _UNIX
return(0);
#else
return(Ch==':');
#endif
}
void ConvertUnknownHeader(void)
{
int I;
if (NewLhd.HostOS>UNIX)
{
NewLhd.HostOS=MS_DOS;
if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY)
NewLhd.FileAttr=0x10;
else
NewLhd.FileAttr=0x20;
}
for (I=0;ArcFileName[I];I++)
if (IsPathDiv(ArcFileName[I]))
ArcFileName[I]=CPATHDIVIDER;
}
int CheckForDevice(FILE *CheckFile)
{
#ifdef _UNIX
return(0);
#else
return(isatty(fileno(CheckFile)));
#endif
}