hrev45188 adds 2 changesets to branch 'master' old head: 90ae2e54f6ccaca73c011a2aa4cdd660417108ad new head: e449bae89186bea95f123280559c5195be5017e7 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=e449bae+%5E90ae2e5 ---------------------------------------------------------------------------- 44e22d2: Vim, KeymapSwitcher and UnRAR packages updated * Version of Vim package for x86_64 added; * Version of KeymapSwitcher package for x86_64 added; * KeymapSwitcher package fixed to preserve Cmd <-> Ctrl swap settings on keymaps switch. Fixes #9142; * UnRAR updated from 3.7.8 to 4.2.4, fixed for multibyte characters support and build for x86_64. Partially fixes #4879; e449bae: bin/unrar outsorced to UnRAR 4.2.4 opt.package [ Siarzhuk Zharski <zharik@xxxxxx> ] ---------------------------------------------------------------------------- 125 files changed, 50 insertions(+), 22935 deletions(-) build/jam/HaikuImage | 2 +- build/jam/OptionalPackages | 59 +- src/bin/Jamfile | 1 - src/bin/unrar/Jamfile | 47 - src/bin/unrar/arccmt.cpp | 215 ---- src/bin/unrar/archive.cpp | 267 ----- src/bin/unrar/archive.hpp | 126 -- src/bin/unrar/arcread.cpp | 653 ----------- src/bin/unrar/array.hpp | 122 -- src/bin/unrar/beosea.cpp | 113 -- src/bin/unrar/cmddata.cpp | 1287 -------------------- src/bin/unrar/cmddata.hpp | 57 - src/bin/unrar/coder.cpp | 47 - src/bin/unrar/coder.hpp | 24 - src/bin/unrar/compress.hpp | 36 - src/bin/unrar/consio.cpp | 289 ----- src/bin/unrar/consio.hpp | 46 - src/bin/unrar/crc.cpp | 61 - src/bin/unrar/crc.hpp | 10 - src/bin/unrar/crypt.cpp | 381 ------ src/bin/unrar/crypt.hpp | 62 - src/bin/unrar/dll.cpp | 365 ------ src/bin/unrar/dll.def | 12 - src/bin/unrar/dll.hpp | 138 --- src/bin/unrar/encname.cpp | 57 - src/bin/unrar/encname.hpp | 20 - src/bin/unrar/errhnd.cpp | 374 ------ src/bin/unrar/errhnd.hpp | 62 - src/bin/unrar/extinfo.cpp | 76 -- src/bin/unrar/extinfo.hpp | 8 - src/bin/unrar/extract.cpp | 873 -------------- src/bin/unrar/extract.hpp | 42 - src/bin/unrar/filcreat.cpp | 239 ---- src/bin/unrar/filcreat.hpp | 13 - src/bin/unrar/file.cpp | 704 ----------- src/bin/unrar/file.hpp | 100 -- src/bin/unrar/filefn.cpp | 570 --------- src/bin/unrar/filefn.hpp | 41 - src/bin/unrar/filestr.cpp | 145 --- src/bin/unrar/filestr.hpp | 8 - src/bin/unrar/find.cpp | 296 ----- src/bin/unrar/find.hpp | 48 - src/bin/unrar/getbits.cpp | 24 - src/bin/unrar/getbits.hpp | 38 - src/bin/unrar/global.cpp | 4 - src/bin/unrar/global.hpp | 14 - src/bin/unrar/headers.hpp | 306 ----- src/bin/unrar/int64.cpp | 274 ----- src/bin/unrar/int64.hpp | 86 -- src/bin/unrar/isnt.cpp | 17 - src/bin/unrar/isnt.hpp | 6 - src/bin/unrar/license.txt | 40 - src/bin/unrar/list.cpp | 388 ------ src/bin/unrar/list.hpp | 6 - src/bin/unrar/loclang.hpp | 349 ------ src/bin/unrar/log.cpp | 24 - src/bin/unrar/log.hpp | 18 - src/bin/unrar/match.cpp | 262 ----- src/bin/unrar/match.hpp | 12 - src/bin/unrar/model.cpp | 610 ---------- src/bin/unrar/model.hpp | 132 --- src/bin/unrar/msc.dep | 2532 ---------------------------------------- src/bin/unrar/options.cpp | 28 - src/bin/unrar/options.hpp | 142 --- src/bin/unrar/os.hpp | 246 ---- src/bin/unrar/os2ea.cpp | 94 -- src/bin/unrar/pathfn.cpp | 714 ----------- src/bin/unrar/pathfn.hpp | 46 - src/bin/unrar/rar.cpp | 144 --- src/bin/unrar/rar.hpp | 80 -- src/bin/unrar/rardefs.hpp | 24 - src/bin/unrar/rarfn.hpp | 7 - src/bin/unrar/rarlang.hpp | 10 - src/bin/unrar/raros.hpp | 41 - src/bin/unrar/rartypes.hpp | 23 - src/bin/unrar/rarvm.cpp | 1113 ------------------ src/bin/unrar/rarvm.hpp | 109 -- src/bin/unrar/rarvmtbl.cpp | 53 - src/bin/unrar/rawread.cpp | 126 -- src/bin/unrar/rawread.hpp | 32 - src/bin/unrar/rdwrfn.cpp | 264 ----- src/bin/unrar/rdwrfn.hpp | 83 -- src/bin/unrar/readme.txt | 63 - src/bin/unrar/recvol.cpp | 367 ------ src/bin/unrar/recvol.hpp | 16 - src/bin/unrar/resource.cpp | 12 - src/bin/unrar/resource.hpp | 14 - src/bin/unrar/rijndael.cpp | 298 ----- src/bin/unrar/rijndael.hpp | 37 - src/bin/unrar/rs.cpp | 143 --- src/bin/unrar/rs.hpp | 32 - src/bin/unrar/savepos.cpp | 15 - src/bin/unrar/savepos.hpp | 15 - src/bin/unrar/scantree.cpp | 292 ----- src/bin/unrar/scantree.hpp | 52 - src/bin/unrar/sha1.cpp | 231 ---- src/bin/unrar/sha1.hpp | 17 - src/bin/unrar/smallfn.cpp | 23 - src/bin/unrar/smallfn.hpp | 8 - [ *** stats truncated: 26 lines dropped *** ] ############################################################################ Commit: 44e22d214f5d0bb4a6a6d05db787fa40fccf09a2 URL: http://cgit.haiku-os.org/haiku/commit/?id=44e22d2 Author: Siarzhuk Zharski <zharik@xxxxxx> Date: Tue Jan 22 08:16:38 2013 UTC Ticket: https://dev.haiku-os.org/ticket/4879 Ticket: https://dev.haiku-os.org/ticket/9142 Vim, KeymapSwitcher and UnRAR packages updated * Version of Vim package for x86_64 added; * Version of KeymapSwitcher package for x86_64 added; * KeymapSwitcher package fixed to preserve Cmd <-> Ctrl swap settings on keymaps switch. Fixes #9142; * UnRAR updated from 3.7.8 to 4.2.4, fixed for multibyte characters support and build for x86_64. Partially fixes #4879; ---------------------------------------------------------------------------- diff --git a/build/jam/OptionalPackages b/build/jam/OptionalPackages index 3952594..b0d4a60 100644 --- a/build/jam/OptionalPackages +++ b/build/jam/OptionalPackages @@ -95,6 +95,7 @@ if $(HAIKU_ADD_ALTERNATIVE_GCC_LIBS) = 1 # TimGMSoundFont - a good quality General MIDI Sound Font # TrackerNewTemplates - template files for Tracker's New menu # Transmission - a fast, easy, and free BitTorrent Client +# UnRAR - utility to list, test and extract RAR archives # UserlandFS - aids native file system development (like FUSE) # Vim - Vi IMproved. Highly configurable text editor # Vision - powerful native IRC client @@ -1330,22 +1331,29 @@ if [ IsOptionalHaikuImagePackageAdded ICU-devel ] { # KeymapSwitcher if [ IsOptionalHaikuImagePackageAdded KeymapSwitcher ] { - if $(TARGET_ARCH) != x86 { - Echo "No optional package KeymapSwitcher available for $(TARGET_ARCH)" ; - } else { + if $(TARGET_ARCH) = x86 { if $(HAIKU_GCC_VERSION[1]) >= 4 { InstallOptionalHaikuImagePackage - KeymapSwitcher-1.2.7-r1a4-x86-gcc4-2012-11-01.zip - : $(baseURL)/KeymapSwitcher-1.2.7-r1a4-x86-gcc4-2012-11-01.zip + KeymapSwitcher-1.2.7-x86-gcc4-2013-01-08.zip + : $(baseURL)/KeymapSwitcher-1.2.7-x86-gcc4-2013-01-08.zip : : : false ; } else { InstallOptionalHaikuImagePackage - KeymapSwitcher-1.2.7-r1a4-x86-gcc2-2012-11-01.zip - : $(baseURL)/KeymapSwitcher-1.2.7-r1a4-x86-gcc2-2012-11-01.zip + KeymapSwitcher-1.2.7-x86-gcc2-2013-01-08.zip + : $(baseURL)/KeymapSwitcher-1.2.7-x86-gcc2-2013-01-08.zip : : : false ; } AddSymlinkToHaikuImage home config settings deskbar Preferences : /boot/common/bin/KeymapSwitcher ; + } else if $(TARGET_ARCH) = x86_64 { + InstallOptionalHaikuImagePackage + KeymapSwitcher-1.2.7-x86_64-2013-01-08.zip + : $(baseURL)/KeymapSwitcher-1.2.7-x86_64-2013-01-08.zip + : : true ; + AddSymlinkToHaikuImage home config settings deskbar Preferences + : /boot/common/bin/KeymapSwitcher ; + } else { + Echo "No optional package KeymapSwitcher available for $(TARGET_ARCH)" ; } } @@ -2080,6 +2088,31 @@ if [ IsOptionalHaikuImagePackageAdded Transmission ] { } +# UnRAR +if [ IsOptionalHaikuImagePackageAdded UnRAR ] { + if $(TARGET_ARCH) = x86 { + if $(HAIKU_GCC_VERSION[1]) >= 4 { + InstallOptionalHaikuImagePackage + UnRAR-4.2.4-x86-gcc4-2013-01-21.zip + : $(baseURL)/UnRAR-4.2.4-x86-gcc4-2013-01-21.zip + : : true ; + } else { + InstallOptionalHaikuImagePackage + UnRAR-4.2.4-x86-gcc2-2013-01-21.zip + : $(baseURL)/UnRAR-4.2.4-x86-gcc2-2013-01-21.zip + : : true ; + } + } else if $(TARGET_ARCH) = x86_64 { + InstallOptionalHaikuImagePackage + UnRAR-4.2.4-x86_64-2013-01-21.zip + : $(baseURL)/UnRAR-4.2.4-x86_64-2013-01-21.zip + : : true ; + } else { + Echo "No optional package UnRAR available for $(TARGET_ARCH)" ; + } +} + + # UserlandFS if [ IsOptionalHaikuImagePackageAdded UserlandFS ] { local arch = $(TARGET_ARCH) ; @@ -2135,9 +2168,7 @@ if [ IsOptionalHaikuImagePackageAdded UserlandFS ] { # Vim if [ IsOptionalHaikuImagePackageAdded Vim ] { - if $(TARGET_ARCH) != x86 { - Echo "No optional package Vim available for $(TARGET_ARCH)" ; - } else { + if $(TARGET_ARCH) = x86 { if $(HAIKU_GCC_VERSION[1]) >= 4 { InstallOptionalHaikuImagePackage vim-7.3-r1a4-x86-gcc4-2012-09-26.zip : $(baseURL)/vim-7.3-r1a4-x86-gcc4-2012-09-26.zip @@ -2149,6 +2180,14 @@ if [ IsOptionalHaikuImagePackageAdded Vim ] { } AddSymlinkToHaikuImage home config settings deskbar Applications : /boot/common/bin/gvim ; + } else if $(TARGET_ARCH) = x86_64 { + InstallOptionalHaikuImagePackage vim-7.3-x86_64-2013-01-19.zip + : $(baseURL)/vim-7.3-x86_64-2013-01-19.zip + : : true ; + AddSymlinkToHaikuImage home config settings deskbar Applications + : /boot/common/bin/gvim ; + } else { + Echo "No optional package Vim available for $(TARGET_ARCH)" ; } } ############################################################################ Revision: hrev45188 Commit: e449bae89186bea95f123280559c5195be5017e7 URL: http://cgit.haiku-os.org/haiku/commit/?id=e449bae Author: Siarzhuk Zharski <zharik@xxxxxx> Date: Tue Jan 22 08:27:44 2013 UTC bin/unrar outsorced to UnRAR 4.2.4 opt.package ---------------------------------------------------------------------------- diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index a90dca6..3dddaaf 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -35,7 +35,7 @@ SYSTEM_BIN = [ FFilterByBuildFeatures split stat strace stty su sum sync sysinfo tac tail tcpdump tcptester tee telnet telnetd test timeout top touch tput tr traceroute translate trash true truncate tsort tty - uname unchop unexpand unmount uniq unlink unrar unshar unzip unzipsfx + uname unchop unexpand unmount uniq unlink unshar unzip unzipsfx <bin>updatedb uptime urlwrapper useradd uudecode uuencode vdir version vmstat waitfor watch wc wget whoami writembr@x86 xargs xres yes diff --git a/src/bin/Jamfile b/src/bin/Jamfile index dccce63..4d1f653 100644 --- a/src/bin/Jamfile +++ b/src/bin/Jamfile @@ -274,7 +274,6 @@ SubInclude HAIKU_TOP src bin rmd160 ; SubInclude HAIKU_TOP src bin screen_blanker ; SubInclude HAIKU_TOP src bin screenmode ; SubInclude HAIKU_TOP src bin sharutils ; -SubInclude HAIKU_TOP src bin unrar ; SubInclude HAIKU_TOP src bin writembr ; SubInclude HAIKU_TOP src bin zic ; diff --git a/src/bin/unrar/Jamfile b/src/bin/unrar/Jamfile deleted file mode 100644 index b7a0dce..0000000 --- a/src/bin/unrar/Jamfile +++ /dev/null @@ -1,47 +0,0 @@ -SubDir HAIKU_TOP src bin unrar ; - -BinCommand unrar : - rar.cpp - strlist.cpp - strfn.cpp - pathfn.cpp - int64.cpp - savepos.cpp - global.cpp - file.cpp - filefn.cpp - filcreat.cpp - archive.cpp - arcread.cpp - unicode.cpp - system.cpp - isnt.cpp - crypt.cpp - crc.cpp - rawread.cpp - encname.cpp - resource.cpp - match.cpp - timefn.cpp - rdwrfn.cpp - consio.cpp - options.cpp - ulinks.cpp - errhnd.cpp - rarvm.cpp - rijndael.cpp - getbits.cpp - sha1.cpp - extinfo.cpp - extract.cpp - volume.cpp - list.cpp - find.cpp - unpack.cpp - cmddata.cpp - scantree.cpp - filestr.cpp - recvol.cpp - rs.cpp - : be $(TARGET_LIBSUPC++) : unrar.rdef -; diff --git a/src/bin/unrar/arccmt.cpp b/src/bin/unrar/arccmt.cpp deleted file mode 100644 index 6ada2f0..0000000 --- a/src/bin/unrar/arccmt.cpp +++ /dev/null @@ -1,215 +0,0 @@ -bool Archive::GetComment(Array<byte> *CmtData,Array<wchar> *CmtDataW) -{ - if (!MainComment) - return(false); - SaveFilePos SavePos(*this); - - ushort CmtLength; -#ifndef SFX_MODULE - if (OldFormat) - { - Seek(SFXSize+SIZEOF_OLDMHD,SEEK_SET); - CmtLength=GetByte()+(GetByte()<<8); - } - else -#endif - { - if (NewMhd.Flags & MHD_COMMENT) - { - Seek(SFXSize+SIZEOF_MARKHEAD+SIZEOF_NEWMHD,SEEK_SET); - ReadHeader(); - } - else - { - Seek(SFXSize+SIZEOF_MARKHEAD+NewMhd.HeadSize,SEEK_SET); - return(SearchSubBlock(SUBHEAD_TYPE_CMT)!=0 && ReadCommentData(CmtData,CmtDataW)!=0); - } -#ifndef SFX_MODULE - if (CommHead.HeadCRC!=HeaderCRC) - { - Log(FileName,St(MLogCommHead)); - Alarm(); - return(false); - } - CmtLength=CommHead.HeadSize-SIZEOF_COMMHEAD; -#endif - } -#ifndef SFX_MODULE - if (OldFormat && (OldMhd.Flags & MHD_PACK_COMMENT) || !OldFormat && CommHead.Method!=0x30) - { - if (!OldFormat && (CommHead.UnpVer < 15 || CommHead.UnpVer > UNP_VER || CommHead.Method > 0x35)) - return(false); - ComprDataIO DataIO; - Unpack Unpack(&DataIO); - Unpack.Init(); - DataIO.SetTestMode(true); - uint UnpCmtLength; - if (OldFormat) - { -#ifdef NOCRYPT - return(false); -#else - UnpCmtLength=GetByte()+(GetByte()<<8); - CmtLength-=2; - DataIO.SetCmt13Encryption(); -#endif - } - else - UnpCmtLength=CommHead.UnpSize; - DataIO.SetFiles(this,NULL); - DataIO.EnableShowProgress(false); - DataIO.SetPackedSizeToRead(CmtLength); - Unpack.SetDestSize(UnpCmtLength); - Unpack.DoUnpack(CommHead.UnpVer,false); - - if (!OldFormat && ((~DataIO.UnpFileCRC)&0xffff)!=CommHead.CommCRC) - { - Log(FileName,St(MLogCommBrk)); - Alarm(); - return(false); - } - else - { - unsigned char *UnpData; - uint UnpDataSize; - DataIO.GetUnpackedData(&UnpData,&UnpDataSize); - CmtData->Alloc(UnpDataSize); - memcpy(&((*CmtData)[0]),UnpData,UnpDataSize); - } - } - else - { - CmtData->Alloc(CmtLength); - - Read(&((*CmtData)[0]),CmtLength); - if (!OldFormat && CommHead.CommCRC!=(~CRC(0xffffffff,&((*CmtData)[0]),CmtLength)&0xffff)) - { - Log(FileName,St(MLogCommBrk)); - Alarm(); - CmtData->Reset(); - return(false); - } - } -#endif -#if defined(_WIN_32) && !defined(_WIN_CE) - if (CmtData->Size()>0) - { - int CmtSize=CmtData->Size(); - OemToCharBuff((char *)CmtData->Addr(),(char *)CmtData->Addr(),CmtSize); - - if (CmtDataW!=NULL) - { - CmtDataW->Alloc(CmtSize+1); - CmtData->Push(0); - CharToWide((char *)CmtData->Addr(),CmtDataW->Addr(),CmtSize+1); - CmtData->Alloc(CmtSize); - CmtDataW->Alloc(strlenw(CmtDataW->Addr())); - } - } -#endif - return(CmtData->Size()>0); -} - - -int Archive::ReadCommentData(Array<byte> *CmtData,Array<wchar> *CmtDataW) -{ - bool Unicode=SubHead.SubFlags & SUBHEAD_FLAGS_CMT_UNICODE; - if (!ReadSubData(CmtData,NULL)) - return(0); - int CmtSize=CmtData->Size(); - if (Unicode) - { - CmtSize/=2; - Array<wchar> DataW(CmtSize+1); - RawToWide(CmtData->Addr(),DataW.Addr(),CmtSize); - DataW[CmtSize]=0; - int DestSize=CmtSize*4; - CmtData->Alloc(DestSize+1); - WideToChar(DataW.Addr(),(char *)CmtData->Addr(),DestSize); - (*CmtData)[DestSize]=0; - CmtSize=strlen((char *)CmtData->Addr()); - CmtData->Alloc(CmtSize); - if (CmtDataW!=NULL) - { - *CmtDataW=DataW; - CmtDataW->Alloc(CmtSize); - } - } - else - if (CmtDataW!=NULL) - { - CmtData->Push(0); - CmtDataW->Alloc(CmtSize+1); - CharToWide((char *)CmtData->Addr(),CmtDataW->Addr(),CmtSize+1); - CmtData->Alloc(CmtSize); - CmtDataW->Alloc(strlenw(CmtDataW->Addr())); - } - return(CmtSize); -} - - -void Archive::ViewComment() -{ -#ifndef GUI - if (Cmd->DisableComment) - return; - Array<byte> CmtBuf; - if (GetComment(&CmtBuf,NULL)) - { - int CmtSize=CmtBuf.Size(); - char *ChPtr=(char *)memchr(&CmtBuf[0],0x1A,CmtSize); - if (ChPtr!=NULL) - CmtSize=ChPtr-(char *)&CmtBuf[0]; - mprintf("\n"); - OutComment((char *)&CmtBuf[0],CmtSize); - } -#endif -} - - -#ifndef SFX_MODULE -void Archive::ViewFileComment() -{ - if (!(NewLhd.Flags & LHD_COMMENT) || Cmd->DisableComment || OldFormat) - return; -#ifndef GUI - mprintf(St(MFileComment)); -#endif - const int MaxSize=0x8000; - Array<char> CmtBuf(MaxSize); - SaveFilePos SavePos(*this); - Seek(CurBlockPos+SIZEOF_NEWLHD+NewLhd.NameSize,SEEK_SET); - Int64 SaveCurBlockPos=CurBlockPos; - Int64 SaveNextBlockPos=NextBlockPos; - - int Size=ReadHeader(); - - CurBlockPos=SaveCurBlockPos; - NextBlockPos=SaveNextBlockPos; - - if (Size<7 || CommHead.HeadType!=COMM_HEAD) - return; - if (CommHead.HeadCRC!=HeaderCRC) - { -#ifndef GUI - Log(FileName,St(MLogCommHead)); -#endif - return; - } - if (CommHead.UnpVer < 15 || CommHead.UnpVer > UNP_VER || - CommHead.Method > 0x30 || CommHead.UnpSize > MaxSize) - return; - Read(&CmtBuf[0],CommHead.UnpSize); - if (CommHead.CommCRC!=((~CRC(0xffffffff,&CmtBuf[0],CommHead.UnpSize)&0xffff))) - { - Log(FileName,St(MLogBrokFCmt)); - } - else - { - OutComment(&CmtBuf[0],CommHead.UnpSize); -#ifndef GUI - mprintf("\n"); -#endif - } -} -#endif diff --git a/src/bin/unrar/archive.cpp b/src/bin/unrar/archive.cpp deleted file mode 100644 index 3460f99..0000000 --- a/src/bin/unrar/archive.cpp +++ /dev/null @@ -1,267 +0,0 @@ -#include "rar.hpp" - -#ifndef SHELL_EXT -#include "arccmt.cpp" -#endif - - -Archive::Archive(RAROptions *InitCmd) -{ - Cmd=InitCmd==NULL ? &DummyCmd:InitCmd; - OpenShared=Cmd->OpenShared; - OldFormat=false; - Solid=false; - Volume=false; - MainComment=false; - Locked=false; - Signed=false; - NotFirstVolume=false; - SFXSize=0; - LatestTime.Reset(); - Protected=false; - Encrypted=false; - BrokenFileHeader=false; - LastReadBlock=0; - - CurBlockPos=0; - NextBlockPos=0; - - RecoveryPos=SIZEOF_MARKHEAD; - RecoverySectors=-1; - - memset(&NewMhd,0,sizeof(NewMhd)); - NewMhd.HeadType=MAIN_HEAD; - NewMhd.HeadSize=SIZEOF_NEWMHD; - HeaderCRC=0; - VolWrite=0; - AddingFilesSize=0; - AddingHeadersSize=0; -#if !defined(SHELL_EXT) && !defined(NOCRYPT) - *HeadersSalt=0; - *SubDataSalt=0; -#endif - *FirstVolumeName=0; - *FirstVolumeNameW=0; - - Splitting=false; - NewArchive=false; - - SilentOpen=false; - -} - - -#ifndef SHELL_EXT -void Archive::CheckArc(bool EnableBroken) -{ - if (!IsArchive(EnableBroken)) - { - Log(FileName,St(MBadArc),FileName); - ErrHandler.Exit(FATAL_ERROR); - } -} -#endif - - -#if !defined(SHELL_EXT) && !defined(SFX_MODULE) -void Archive::CheckOpen(char *Name,wchar *NameW) -{ - TOpen(Name,NameW); - CheckArc(false); -} -#endif - - -bool Archive::WCheckOpen(char *Name,wchar *NameW) -{ - if (!WOpen(Name,NameW)) - return(false); - if (!IsArchive(false)) - { -#ifndef SHELL_EXT - Log(FileName,St(MNotRAR),FileName); -#endif - Close(); - return(false); - } - return(true); -} - - -bool Archive::IsSignature(byte *D) -{ - bool Valid=false; - if (D[0]==0x52) -#ifndef SFX_MODULE - if (D[1]==0x45 && D[2]==0x7e && D[3]==0x5e) - { - OldFormat=true; - Valid=true; - } - else -#endif - if (D[1]==0x61 && D[2]==0x72 && D[3]==0x21 && D[4]==0x1a && D[5]==0x07 && D[6]==0x00) - { - OldFormat=false; - Valid=true; - } - return(Valid); -} - - -bool Archive::IsArchive(bool EnableBroken) -{ - Encrypted=false; -#ifndef SFX_MODULE - if (IsDevice()) - { -#ifndef SHELL_EXT - Log(FileName,St(MInvalidName),FileName); -#endif - return(false); - } -#endif - if (Read(MarkHead.Mark,SIZEOF_MARKHEAD)!=SIZEOF_MARKHEAD) - return(false); - SFXSize=0; - if (IsSignature(MarkHead.Mark)) - { - if (OldFormat) - Seek(0,SEEK_SET); - } - else - { - Array<char> Buffer(MAXSFXSIZE); - long CurPos=int64to32(Tell()); - int ReadSize=Read(&Buffer[0],Buffer.Size()-16); - for (int I=0;I<ReadSize;I++) - if (Buffer[I]==0x52 && IsSignature((byte *)&Buffer[I])) - { - if (OldFormat && I>0 && CurPos<28 && ReadSize>31) - { - char *D=&Buffer[28-CurPos]; - if (D[0]!=0x52 || D[1]!=0x53 || D[2]!=0x46 || D[3]!=0x58) - continue; - } - SFXSize=CurPos+I; - Seek(SFXSize,SEEK_SET); - if (!OldFormat) - Read(MarkHead.Mark,SIZEOF_MARKHEAD); - break; - } - if (SFXSize==0) - return(false); - } - ReadHeader(); - SeekToNext(); -#ifndef SFX_MODULE - if (OldFormat) - { - NewMhd.Flags=OldMhd.Flags & 0x3f; - NewMhd.HeadSize=OldMhd.HeadSize; - } - else -#endif - { - if (HeaderCRC!=NewMhd.HeadCRC) - { -#ifndef SHELL_EXT - Log(FileName,St(MLogMainHead)); -#endif - Alarm(); - if (!EnableBroken) - return(false); - } - } - Volume=(NewMhd.Flags & MHD_VOLUME); - Solid=(NewMhd.Flags & MHD_SOLID)!=0; - MainComment=(NewMhd.Flags & MHD_COMMENT)!=0; - Locked=(NewMhd.Flags & MHD_LOCK)!=0; - Signed=(NewMhd.PosAV!=0); - Protected=(NewMhd.Flags & MHD_PROTECT)!=0; - Encrypted=(NewMhd.Flags & MHD_PASSWORD)!=0; - - if (NewMhd.EncryptVer>UNP_VER) - { -#ifdef RARDLL - Cmd->DllError=ERAR_UNKNOWN_FORMAT; -#else - ErrHandler.SetErrorCode(WARNING); - #if !defined(SILENT) && !defined(SFX_MODULE) - Log(FileName,St(MUnknownMeth),FileName); - Log(FileName,St(MVerRequired),NewMhd.EncryptVer/10,NewMhd.EncryptVer%10); - #endif -#endif - return(false); - } -#ifdef RARDLL - SilentOpen=true; -#endif - - //if not encrypted, we'll check it below - NotFirstVolume=Encrypted && (NewMhd.Flags & MHD_FIRSTVOLUME)==0; - - if (!SilentOpen || !Encrypted) - { - SaveFilePos SavePos(*this); - Int64 SaveCurBlockPos=CurBlockPos,SaveNextBlockPos=NextBlockPos; - - NotFirstVolume=false; - while (ReadHeader()) - { - int HeaderType=GetHeaderType(); - if (HeaderType==NEWSUB_HEAD) - { - if (SubHead.CmpName(SUBHEAD_TYPE_CMT)) - MainComment=true; - if ((SubHead.Flags & LHD_SPLIT_BEFORE) || - Volume && (NewMhd.Flags & MHD_FIRSTVOLUME)==0) - NotFirstVolume=true; - } - else - { - if (HeaderType==FILE_HEAD && ((NewLhd.Flags & LHD_SPLIT_BEFORE)!=0 || - Volume && NewLhd.UnpVer>=29 && (NewMhd.Flags & MHD_FIRSTVOLUME)==0)) - NotFirstVolume=true; - break; - } - SeekToNext(); - } - CurBlockPos=SaveCurBlockPos; - NextBlockPos=SaveNextBlockPos; - } - if (!Volume || !NotFirstVolume) - { - strcpy(FirstVolumeName,FileName); - strcpyw(FirstVolumeNameW,FileNameW); - } - - return(true); -} - - - - -void Archive::SeekToNext() -{ - Seek(NextBlockPos,SEEK_SET); -} - - -#ifndef SFX_MODULE -int Archive::GetRecoverySize(bool Required) -{ - if (!Protected) - return(0); - if (RecoverySectors!=-1 || !Required) - return(RecoverySectors); - SaveFilePos SavePos(*this); - Seek(SFXSize,SEEK_SET); - SearchSubBlock(SUBHEAD_TYPE_RR); - return(RecoverySectors); -} -#endif - - - - diff --git a/src/bin/unrar/archive.hpp b/src/bin/unrar/archive.hpp deleted file mode 100644 index 1e0675e..0000000 --- a/src/bin/unrar/archive.hpp +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef _RAR_ARCHIVE_ -#define _RAR_ARCHIVE_ - -class Pack; - -enum {EN_LOCK=1,EN_VOL=2,EN_FIRSTVOL=4}; - -class Archive:public File -{ - private: - bool IsSignature(byte *D); - void UpdateLatestTime(FileHeader *CurBlock); - void ConvertNameCase(char *Name); - void ConvertNameCase(wchar *Name); - void ConvertUnknownHeader(); - int ReadOldHeader(); - void PrepareExtraTime(FileHeader *hd,EXTTIME_MODE etm,EXTTIME_MODE etc,EXTTIME_MODE eta,EXTTIME_MODE etarc,Array<byte> &TimeData); - -#if !defined(SHELL_EXT) && !defined(NOCRYPT) - CryptData HeadersCrypt; - byte HeadersSalt[SALT_SIZE]; -#endif -#ifndef SHELL_EXT - ComprDataIO SubDataIO; - byte SubDataSalt[SALT_SIZE]; -#endif - RAROptions *Cmd,DummyCmd; - - MarkHeader MarkHead; - OldMainHeader OldMhd; - - int RecoverySectors; - Int64 RecoveryPos; - - RarTime LatestTime; - int LastReadBlock; - int CurHeaderType; - - bool SilentOpen; - public: - Archive(RAROptions *InitCmd=NULL); - bool IsArchive(bool EnableBroken); - int SearchBlock(int BlockType); - int SearchSubBlock(const char *Type); - int ReadBlock(int BlockType); - void WriteBlock(int BlockType,BaseBlock *wb=NULL); - int PrepareNamesToWrite(char *Name,wchar *NameW,char *DestName,byte *DestNameW); - void SetLhdSize(); - int ReadHeader(); - void CheckArc(bool EnableBroken); - void CheckOpen(char *Name,wchar *NameW=NULL); - bool WCheckOpen(char *Name,wchar *NameW=NULL); - bool TestLock(int Mode); - void MakeTemp(); - void CopyMainHeader(Archive &Src,bool CopySFX=true,char *NameToDisplay=NULL); - bool ProcessToFileHead(Archive &Src,bool LastBlockAdded, - Pack *Pack=NULL,const char *SkipName=NULL); - void TmpToArc(Archive &Src); - void CloseNew(int AdjustRecovery,bool CloseVolume); - void WriteEndBlock(bool CloseVolume); - void CopyFileRecord(Archive &Src); - void CopyArchiveData(Archive &Src); - bool GetComment(Array<byte> *CmtData,Array<wchar> *CmtDataW); - void ViewComment(); - void ViewFileComment(); - void SetLatestTime(RarTime *NewTime); - void SeekToNext(); - bool CheckAccess(); - bool IsArcDir(); - bool IsArcLabel(); - void ConvertAttributes(); - int GetRecoverySize(bool Required); - void VolSubtractHeaderSize(int SubSize); - void AddSubData(byte *SrcData,int DataSize,File *SrcFile,char *Name,bool AllowSplit); - bool ReadSubData(Array<byte> *UnpData,File *DestFile); - int GetHeaderType() {return(CurHeaderType);}; - int ReadCommentData(Array<byte> *CmtData,Array<wchar> *CmtDataW); - void WriteCommentData(byte *Data,int DataSize,bool FileComment); - RAROptions* GetRAROptions() {return(Cmd);} - void SetSilentOpen(bool Mode) {SilentOpen=Mode;} - - BaseBlock ShortBlock; - MainHeader NewMhd; - FileHeader NewLhd; - EndArcHeader EndArcHead; - SubBlockHeader SubBlockHead; - FileHeader SubHead; - CommentHeader CommHead; - ProtectHeader ProtectHead; - AVHeader AVHead; - SignHeader SignHead; - UnixOwnersHeader UOHead; - MacFInfoHeader MACHead; - EAHeader EAHead; - StreamHeader StreamHead; - - Int64 CurBlockPos; - Int64 NextBlockPos; - - bool OldFormat; - bool Solid; - bool Volume; - bool MainComment; - bool Locked; - bool Signed; - bool NotFirstVolume; - bool Protected; - bool Encrypted; - uint SFXSize; - bool BrokenFileHeader; - - bool Splitting; - - ushort HeaderCRC; - - Int64 VolWrite; - Int64 AddingFilesSize; - uint AddingHeadersSize; - - bool NewArchive; - - char FirstVolumeName[NM]; - wchar FirstVolumeNameW[NM]; -}; - -#endif diff --git a/src/bin/unrar/arcread.cpp b/src/bin/unrar/arcread.cpp deleted file mode 100644 index 43a23db..0000000 --- a/src/bin/unrar/arcread.cpp +++ /dev/null @@ -1,653 +0,0 @@ -#include "rar.hpp" - -int Archive::SearchBlock(int BlockType) -{ - int Size,Count=0; - while ((Size=ReadHeader())!=0 && - (BlockType==ENDARC_HEAD || GetHeaderType()!=ENDARC_HEAD)) - { - if ((++Count & 127)==0) - Wait(); - if (GetHeaderType()==BlockType) - return(Size); - SeekToNext(); - } - return(0); -} - - -int Archive::SearchSubBlock(const char *Type) -{ - int Size; - while ((Size=ReadHeader())!=0 && GetHeaderType()!=ENDARC_HEAD) - { - if (GetHeaderType()==NEWSUB_HEAD && SubHead.CmpName(Type)) - return(Size); - SeekToNext(); - } - return(0); -} - - -int Archive::ReadHeader() -{ - CurBlockPos=Tell(); - -#ifndef SFX_MODULE - if (OldFormat) - return(ReadOldHeader()); -#endif - - RawRead Raw(this); - - bool Decrypt=Encrypted && CurBlockPos>=SFXSize+SIZEOF_MARKHEAD+SIZEOF_NEWMHD; - - if (Decrypt) - { -#if defined(SHELL_EXT) || defined(NOCRYPT) - return(0); -#else - if (Read(HeadersSalt,SALT_SIZE)!=SALT_SIZE) - return(0); - if (*Cmd->Password==0) -#ifdef RARDLL - if (Cmd->Callback==NULL || - Cmd->Callback(UCM_NEEDPASSWORD,Cmd->UserData,(LONG)Cmd->Password,sizeof(Cmd->Password))==-1) - { - Close(); - ErrHandler.Exit(USER_BREAK); - } - -#else - if (!GetPassword(PASSWORD_ARCHIVE,FileName,Cmd->Password,sizeof(Cmd->Password))) - { - Close(); - ErrHandler.Exit(USER_BREAK); - } -#endif - HeadersCrypt.SetCryptKeys(Cmd->Password,HeadersSalt,false,false,NewMhd.EncryptVer>=36); - Raw.SetCrypt(&HeadersCrypt); -#endif - } - - Raw.Read(SIZEOF_SHORTBLOCKHEAD); - if (Raw.Size()==0) - { - Int64 ArcSize=FileLength(); - if (CurBlockPos>ArcSize || NextBlockPos>ArcSize) - { - #ifndef SHELL_EXT - Log(FileName,St(MLogUnexpEOF)); - #endif - ErrHandler.SetErrorCode(WARNING); - } - return(0); - } - - Raw.Get(ShortBlock.HeadCRC); - byte HeadType; - Raw.Get(HeadType); - ShortBlock.HeadType=(HEADER_TYPE)HeadType; - Raw.Get(ShortBlock.Flags); - Raw.Get(ShortBlock.HeadSize); - if (ShortBlock.HeadSize<SIZEOF_SHORTBLOCKHEAD) - { -#ifndef SHELL_EXT - Log(FileName,St(MLogFileHead),"???"); -#endif - BrokenFileHeader=true; - ErrHandler.SetErrorCode(CRC_ERROR); - return(0); - } - - if (ShortBlock.HeadType==COMM_HEAD) - Raw.Read(SIZEOF_COMMHEAD-SIZEOF_SHORTBLOCKHEAD); - else - if (ShortBlock.HeadType==MAIN_HEAD && (ShortBlock.Flags & MHD_COMMENT)!=0) - Raw.Read(SIZEOF_NEWMHD-SIZEOF_SHORTBLOCKHEAD); - else - Raw.Read(ShortBlock.HeadSize-SIZEOF_SHORTBLOCKHEAD); - - NextBlockPos=CurBlockPos+ShortBlock.HeadSize; - - switch(ShortBlock.HeadType) - { - case MAIN_HEAD: - *(BaseBlock *)&NewMhd=ShortBlock; - Raw.Get(NewMhd.HighPosAV); - Raw.Get(NewMhd.PosAV); - if (NewMhd.Flags & MHD_ENCRYPTVER) - Raw.Get(NewMhd.EncryptVer); - break; - case ENDARC_HEAD: - *(BaseBlock *)&EndArcHead=ShortBlock; - if (EndArcHead.Flags & EARC_DATACRC) - Raw.Get(EndArcHead.ArcDataCRC); - if (EndArcHead.Flags & EARC_VOLNUMBER) - Raw.Get(EndArcHead.VolNumber); - break; - case FILE_HEAD: - case NEWSUB_HEAD: - { - FileHeader *hd=ShortBlock.HeadType==FILE_HEAD ? &NewLhd:&SubHead; - *(BaseBlock *)hd=ShortBlock; - Raw.Get(hd->PackSize); - Raw.Get(hd->UnpSize); - Raw.Get(hd->HostOS); - Raw.Get(hd->FileCRC); - Raw.Get(hd->FileTime); - Raw.Get(hd->UnpVer); - Raw.Get(hd->Method); - Raw.Get(hd->NameSize); - Raw.Get(hd->FileAttr); - if (hd->Flags & LHD_LARGE) - { - Raw.Get(hd->HighPackSize); - Raw.Get(hd->HighUnpSize); - } - else - { - hd->HighPackSize=hd->HighUnpSize=0; - if (hd->UnpSize==0xffffffff) - { - hd->UnpSize=int64to32(INT64MAX); - hd->HighUnpSize=int64to32(INT64MAX>>32); - } - } - hd->FullPackSize=int32to64(hd->HighPackSize,hd->PackSize); - hd->FullUnpSize=int32to64(hd->HighUnpSize,hd->UnpSize); - - char FileName[NM*4]; - int NameSize=Min(hd->NameSize,sizeof(FileName)-1); - Raw.Get((byte *)FileName,NameSize); - FileName[NameSize]=0; - - strncpyz(hd->FileName,FileName,ASIZE(hd->FileName)); - - if (hd->HeadType==NEWSUB_HEAD) - { - int DataSize=hd->HeadSize-hd->NameSize-SIZEOF_NEWLHD; - if (hd->Flags & LHD_SALT) - DataSize-=SALT_SIZE; - if (DataSize>0) - { - hd->SubData.Alloc(DataSize); - Raw.Get(&hd->SubData[0],DataSize); - if (hd->CmpName(SUBHEAD_TYPE_RR)) - { - byte *D=&hd->SubData[8]; - RecoverySectors=D[0]+((uint)D[1]<<8)+((uint)D[2]<<16)+((uint)D[3]<<24); - } - } - } - else - if (hd->HeadType==FILE_HEAD) - { - if (hd->Flags & LHD_UNICODE) - { - EncodeFileName NameCoder; - int Length=strlen(FileName); - if (Length==hd->NameSize) - { - UtfToWide(FileName,hd->FileNameW,sizeof(hd->FileNameW)/sizeof(hd->FileNameW[0])-1); - WideToChar(hd->FileNameW,hd->FileName,sizeof(hd->FileName)/sizeof(hd->FileName[0])-1); - ExtToInt(hd->FileName,hd->FileName); - } - else - { - Length++; - NameCoder.Decode(FileName,(byte *)FileName+Length, - hd->NameSize-Length,hd->FileNameW, - sizeof(hd->FileNameW)/sizeof(hd->FileNameW[0])); - } - if (*hd->FileNameW==0) - hd->Flags &= ~LHD_UNICODE; - } - else - *hd->FileNameW=0; -#ifndef SFX_MODULE - ConvertNameCase(hd->FileName); - ConvertNameCase(hd->FileNameW); -#endif - ConvertUnknownHeader(); - } - if (hd->Flags & LHD_SALT) - Raw.Get(hd->Salt,SALT_SIZE); - hd->mtime.SetDos(hd->FileTime); - hd->ctime.Reset(); - hd->atime.Reset(); - hd->arctime.Reset(); - if (hd->Flags & LHD_EXTTIME) - { - ushort Flags; - Raw.Get(Flags); - RarTime *tbl[4]; - tbl[0]=&NewLhd.mtime; - tbl[1]=&NewLhd.ctime; - tbl[2]=&NewLhd.atime; - tbl[3]=&NewLhd.arctime; - for (int I=0;I<4;I++) - { - RarTime *CurTime=tbl[I]; - uint rmode=Flags>>(3-I)*4; - if ((rmode & 8)==0) - continue; - if (I!=0) - { - uint DosTime; - Raw.Get(DosTime); - CurTime->SetDos(DosTime); - } - RarLocalTime rlt; - CurTime->GetLocal(&rlt); - if (rmode & 4) - rlt.Second++; - rlt.Reminder=0; - int count=rmode&3; - for (int J=0;J<count;J++) - { - byte CurByte; - Raw.Get(CurByte); - rlt.Reminder|=(((uint)CurByte)<<((J+3-count)*8)); - } - CurTime->SetLocal(&rlt); - } - } - NextBlockPos+=hd->FullPackSize; - bool CRCProcessedOnly=(hd->Flags & LHD_COMMENT)!=0; - HeaderCRC=~Raw.GetCRC(CRCProcessedOnly)&0xffff; - if (hd->HeadCRC!=HeaderCRC) - { - if (hd->HeadType==NEWSUB_HEAD) - strcat(hd->FileName,"- ???"); - BrokenFileHeader=true; - ErrHandler.SetErrorCode(WARNING); -#ifndef SHELL_EXT - Log(Archive::FileName,St(MLogFileHead),IntNameToExt(hd->FileName)); - Alarm(); -#endif - } - } - break; -#ifndef SFX_MODULE - case COMM_HEAD: - *(BaseBlock *)&CommHead=ShortBlock; - Raw.Get(CommHead.UnpSize); - Raw.Get(CommHead.UnpVer); - Raw.Get(CommHead.Method); - Raw.Get(CommHead.CommCRC); - break; - case SIGN_HEAD: - *(BaseBlock *)&SignHead=ShortBlock; - Raw.Get(SignHead.CreationTime); - Raw.Get(SignHead.ArcNameSize); - Raw.Get(SignHead.UserNameSize); - break; - case AV_HEAD: - *(BaseBlock *)&AVHead=ShortBlock; - Raw.Get(AVHead.UnpVer); - Raw.Get(AVHead.Method); - Raw.Get(AVHead.AVVer); - Raw.Get(AVHead.AVInfoCRC); - break; - case PROTECT_HEAD: - *(BaseBlock *)&ProtectHead=ShortBlock; - Raw.Get(ProtectHead.DataSize); - Raw.Get(ProtectHead.Version); - Raw.Get(ProtectHead.RecSectors); - Raw.Get(ProtectHead.TotalBlocks); - Raw.Get(ProtectHead.Mark,8); - NextBlockPos+=ProtectHead.DataSize; - RecoverySectors=ProtectHead.RecSectors; - break; - case SUB_HEAD: - *(BaseBlock *)&SubBlockHead=ShortBlock; - Raw.Get(SubBlockHead.DataSize); - NextBlockPos+=SubBlockHead.DataSize; - Raw.Get(SubBlockHead.SubType); - Raw.Get(SubBlockHead.Level); - switch(SubBlockHead.SubType) - { - case UO_HEAD: - *(SubBlockHeader *)&UOHead=SubBlockHead; - Raw.Get(UOHead.OwnerNameSize); - Raw.Get(UOHead.GroupNameSize); - if (UOHead.OwnerNameSize>NM-1) - UOHead.OwnerNameSize=NM-1; - if (UOHead.GroupNameSize>NM-1) - UOHead.GroupNameSize=NM-1; - Raw.Get((byte *)UOHead.OwnerName,UOHead.OwnerNameSize); - Raw.Get((byte *)UOHead.GroupName,UOHead.GroupNameSize); - UOHead.OwnerName[UOHead.OwnerNameSize]=0; - UOHead.GroupName[UOHead.GroupNameSize]=0; - break; - case MAC_HEAD: - *(SubBlockHeader *)&MACHead=SubBlockHead; - Raw.Get(MACHead.fileType); - Raw.Get(MACHead.fileCreator); - break; - case EA_HEAD: - case BEEA_HEAD: - case NTACL_HEAD: - *(SubBlockHeader *)&EAHead=SubBlockHead; - Raw.Get(EAHead.UnpSize); - Raw.Get(EAHead.UnpVer); - Raw.Get(EAHead.Method); - Raw.Get(EAHead.EACRC); - break; - case STREAM_HEAD: - *(SubBlockHeader *)&StreamHead=SubBlockHead; - Raw.Get(StreamHead.UnpSize); - Raw.Get(StreamHead.UnpVer); - Raw.Get(StreamHead.Method); - Raw.Get(StreamHead.StreamCRC); - Raw.Get(StreamHead.StreamNameSize); - if (StreamHead.StreamNameSize>NM-1) - StreamHead.StreamNameSize=NM-1; - Raw.Get((byte *)StreamHead.StreamName,StreamHead.StreamNameSize); - StreamHead.StreamName[StreamHead.StreamNameSize]=0; - break; - } - break; -#endif - default: - if (ShortBlock.Flags & LONG_BLOCK) - { - uint DataSize; - Raw.Get(DataSize); - NextBlockPos+=DataSize; - } - break; - } - HeaderCRC=~Raw.GetCRC(false)&0xffff; - CurHeaderType=ShortBlock.HeadType; - if (Decrypt) - { - NextBlockPos+=Raw.PaddedSize()+SALT_SIZE; - - if (ShortBlock.HeadCRC!=HeaderCRC) - { - bool Recovered=false; - if (ShortBlock.HeadType==ENDARC_HEAD && (EndArcHead.Flags & EARC_REVSPACE)!=0) - { - SaveFilePos SavePos(*this); - Int64 Length=Tell(); - Seek(Length-7,SEEK_SET); - Recovered=true; - for (int J=0;J<7;J++) - if (GetByte()!=0) - Recovered=false; - } - if (!Recovered) - { -#ifndef SILENT - Log(FileName,St(MEncrBadCRC),FileName); -#endif - Close(); - - BrokenFileHeader=true; - ErrHandler.SetErrorCode(CRC_ERROR); - return(0); -// ErrHandler.Exit(CRC_ERROR); - } - } - } - - if (NextBlockPos<=CurBlockPos) - { -#ifndef SHELL_EXT - Log(FileName,St(MLogFileHead),"???"); -#endif - BrokenFileHeader=true; - ErrHandler.SetErrorCode(CRC_ERROR); - return(0); - } - return(Raw.Size()); -} - - -#ifndef SFX_MODULE -int Archive::ReadOldHeader() -{ - RawRead Raw(this); - if (CurBlockPos<=SFXSize) - { - Raw.Read(SIZEOF_OLDMHD); - Raw.Get(OldMhd.Mark,4); - Raw.Get(OldMhd.HeadSize); - Raw.Get(OldMhd.Flags); - NextBlockPos=CurBlockPos+OldMhd.HeadSize; - CurHeaderType=MAIN_HEAD; - } - else - { - OldFileHeader OldLhd; - Raw.Read(SIZEOF_OLDLHD); - NewLhd.HeadType=FILE_HEAD; - Raw.Get(NewLhd.PackSize); - Raw.Get(NewLhd.UnpSize); - Raw.Get(OldLhd.FileCRC); - Raw.Get(NewLhd.HeadSize); - Raw.Get(NewLhd.FileTime); - Raw.Get(OldLhd.FileAttr); - Raw.Get(OldLhd.Flags); - Raw.Get(OldLhd.UnpVer); - Raw.Get(OldLhd.NameSize); - Raw.Get(OldLhd.Method); - - NewLhd.Flags=OldLhd.Flags|LONG_BLOCK; - NewLhd.UnpVer=(OldLhd.UnpVer==2) ? 13 : 10; - NewLhd.Method=OldLhd.Method+0x30; - NewLhd.NameSize=OldLhd.NameSize; - NewLhd.FileAttr=OldLhd.FileAttr; - NewLhd.FileCRC=OldLhd.FileCRC; - NewLhd.FullPackSize=NewLhd.PackSize; - NewLhd.FullUnpSize=NewLhd.UnpSize; - - NewLhd.mtime.SetDos(NewLhd.FileTime); - NewLhd.ctime.Reset(); - NewLhd.atime.Reset(); - NewLhd.arctime.Reset(); - - Raw.Read(OldLhd.NameSize); - Raw.Get((byte *)NewLhd.FileName,OldLhd.NameSize); - NewLhd.FileName[OldLhd.NameSize]=0; - ConvertNameCase(NewLhd.FileName); - *NewLhd.FileNameW=0; - - if (Raw.Size()!=0) - NextBlockPos=CurBlockPos+NewLhd.HeadSize+NewLhd.PackSize; - CurHeaderType=FILE_HEAD; - } - return(NextBlockPos>CurBlockPos ? Raw.Size():0); -} -#endif - - -void Archive::ConvertNameCase(char *Name) -{ - if (Cmd->ConvertNames==NAMES_UPPERCASE) - { - IntToExt(Name,Name); - strupper(Name); - ExtToInt(Name,Name); - } - if (Cmd->ConvertNames==NAMES_LOWERCASE) - { - IntToExt(Name,Name); - strlower(Name); - ExtToInt(Name,Name); - } -} - - -#ifndef SFX_MODULE -void Archive::ConvertNameCase(wchar *Name) -{ - if (Cmd->ConvertNames==NAMES_UPPERCASE) - strupperw(Name); - if (Cmd->ConvertNames==NAMES_LOWERCASE) - strlowerw(Name); -} -#endif - - -bool Archive::IsArcDir() -{ - return((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY); -} - - -bool Archive::IsArcLabel() -{ - return(NewLhd.HostOS<=HOST_WIN32 && (NewLhd.FileAttr & 8)); -} - - -void Archive::ConvertAttributes() -{ -#if defined(_WIN_32) || defined(_EMX) - switch(NewLhd.HostOS) - { - case HOST_MSDOS: - case HOST_OS2: - case HOST_WIN32: - break; - case HOST_UNIX: - case HOST_BEOS: - if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY) - NewLhd.FileAttr=0x10; - else - NewLhd.FileAttr=0x20; - break; - default: - if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY) - NewLhd.FileAttr=0x10; - else - NewLhd.FileAttr=0x20; - break; - } -#endif -#ifdef _UNIX - static mode_t mask = (mode_t) -1; - - if (mask == (mode_t) -1) - { - mask = umask(022); - umask(mask); - } - switch(NewLhd.HostOS) - { - case HOST_MSDOS: - case HOST_OS2: - case HOST_WIN32: - if (NewLhd.FileAttr & 0x10) - NewLhd.FileAttr=0x41ff & ~mask; - else - if (NewLhd.FileAttr & 1) - NewLhd.FileAttr=0x8124 & ~mask; - else - NewLhd.FileAttr=0x81b6 & ~mask; - break; - case HOST_UNIX: - case HOST_BEOS: - break; - default: - if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY) - NewLhd.FileAttr=0x41ff & ~mask; - else - NewLhd.FileAttr=0x81b6 & ~mask; - break; - } -#endif -} - - -void Archive::ConvertUnknownHeader() -{ - if (NewLhd.UnpVer<20 && (NewLhd.FileAttr & 0x10)) - NewLhd.Flags|=LHD_DIRECTORY; - if (NewLhd.HostOS>=HOST_MAX) - { - if ((NewLhd.Flags & LHD_WINDOWMASK)==LHD_DIRECTORY) - NewLhd.FileAttr=0x10; - else - NewLhd.FileAttr=0x20; - } - for (char *s=NewLhd.FileName;*s!=0;s=charnext(s)) - { - if (*s=='/' || *s=='\\') - *s=CPATHDIVIDER; -#if defined(_APPLE) && !defined(UNICODE_SUPPORTED) - if ((byte)*s<32 || (byte)*s>127) - *s='_'; -#endif - } - for (wchar *s=NewLhd.FileNameW;*s!=0;s++) - if (*s=='/' || *s=='\\') - *s=CPATHDIVIDER; -} - - -#ifndef SHELL_EXT -bool Archive::ReadSubData(Array<byte> *UnpData,File *DestFile) -{ - if (HeaderCRC!=SubHead.HeadCRC) - { -#ifndef SHELL_EXT - Log(FileName,St(MSubHeadCorrupt)); -#endif - ErrHandler.SetErrorCode(CRC_ERROR); - return(false); - } - if (SubHead.Method<0x30 || SubHead.Method>0x35 || SubHead.UnpVer>/*PACK_VER*/36) - { -#ifndef SHELL_EXT - Log(FileName,St(MSubHeadUnknown)); -#endif - return(false); - } - - if (SubHead.PackSize==0 && (SubHead.Flags & LHD_SPLIT_AFTER)==0) - return(true); - - SubDataIO.Init(); - Unpack Unpack(&SubDataIO); - Unpack.Init(); - - if (DestFile==NULL) - { - UnpData->Alloc(SubHead.UnpSize); - SubDataIO.SetUnpackToMemory(&(*UnpData)[0],SubHead.UnpSize); - } - if (SubHead.Flags & LHD_PASSWORD) - if (*Cmd->Password) - SubDataIO.SetEncryption(SubHead.UnpVer,Cmd->Password, - (SubHead.Flags & LHD_SALT) ? SubHead.Salt:NULL,false, - SubHead.UnpVer>=36); - else - return(false); - SubDataIO.SetPackedSizeToRead(SubHead.PackSize); - SubDataIO.EnableShowProgress(false); - SubDataIO.SetFiles(this,DestFile); - SubDataIO.UnpVolume=(SubHead.Flags & LHD_SPLIT_AFTER); - SubDataIO.SetSubHeader(&SubHead,NULL); - Unpack.SetDestSize(SubHead.UnpSize); - if (SubHead.Method==0x30) - CmdExtract::UnstoreFile(SubDataIO,SubHead.UnpSize); - else - Unpack.DoUnpack(SubHead.UnpVer,false); - - if (SubHead.FileCRC!=~SubDataIO.UnpFileCRC) - { -#ifndef SHELL_EXT - Log(FileName,St(MSubHeadDataCRC),SubHead.FileName); -#endif - ErrHandler.SetErrorCode(CRC_ERROR); - if (UnpData!=NULL) - UnpData->Reset(); - return(false); - } - return(true); -} -#endif diff --git a/src/bin/unrar/array.hpp b/src/bin/unrar/array.hpp deleted file mode 100644 index 1130bfb..0000000 --- a/src/bin/unrar/array.hpp +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef _RAR_ARRAY_ -#define _RAR_ARRAY_ - -extern ErrorHandler ErrHandler; - -template <class T> class Array -{ - private: - T *Buffer; - int BufSize; - int AllocSize; - public: - Array(); - Array(int Size); - ~Array(); - inline void CleanData(); - inline T& operator [](int Item); - inline int Size(); - void Add(int Items); - void Alloc(int Items); - void Reset(); - void operator = (Array<T> &Src); - void Push(T Item); - T* Addr() {return(Buffer);} -}; - -template <class T> void Array<T>::CleanData() -{ - Buffer=NULL; - BufSize=0; - AllocSize=0; -} - - -template <class T> Array<T>::Array() -{ - CleanData(); -} - - -template <class T> Array<T>::Array(int Size) -{ - Buffer=(T *)rarmalloc(sizeof(T)*Size); - if (Buffer==NULL && Size!=0) - ErrHandler.MemoryError(); - - AllocSize=BufSize=Size; -} - - -template <class T> Array<T>::~Array() -{ - if (Buffer!=NULL) - rarfree(Buffer); -} - - -template <class T> inline T& Array<T>::operator [](int Item) -{ - return(Buffer[Item]); -} - - -template <class T> inline int Array<T>::Size() -{ - return(BufSize); -} - - -template <class T> void Array<T>::Add(int Items) -{ - BufSize+=Items; - if (BufSize>AllocSize) - { - int Suggested=AllocSize+AllocSize/4+32; - int NewSize=Max(BufSize,Suggested); - - Buffer=(T *)rarrealloc(Buffer,NewSize*sizeof(T)); - if (Buffer==NULL) - ErrHandler.MemoryError(); - AllocSize=NewSize; - } -} - - -template <class T> void Array<T>::Alloc(int Items) -{ - if (Items>AllocSize) - Add(Items-BufSize); - else - BufSize=Items; -} - - -template <class T> void Array<T>::Reset() -{ - if (Buffer!=NULL) - { - rarfree(Buffer); - Buffer=NULL; - } - BufSize=0; - AllocSize=0; -} - - -template <class T> void Array<T>::operator =(Array<T> &Src) -{ - Reset(); - Alloc(Src.BufSize); - if (Src.BufSize!=0) - memcpy((void *)Buffer,(void *)Src.Buffer,Src.BufSize*sizeof(T)); -} - - -template <class T> void Array<T>::Push(T Item) -{ - Add(1); - (*this)[Size()-1]=Item; -} - -#endif diff --git a/src/bin/unrar/beosea.cpp b/src/bin/unrar/beosea.cpp deleted file mode 100644 index 86eb7d4..0000000 --- a/src/bin/unrar/beosea.cpp +++ /dev/null @@ -1,113 +0,0 @@ - - -void ExtractBeEA(Archive &Arc,char *FileName) -{ - if (Arc.HeaderCRC!=Arc.EAHead.HeadCRC) - { - Log(Arc.FileName,St(MEABroken),FileName); - ErrHandler.SetErrorCode(CRC_ERROR); - return; - } - if (Arc.EAHead.Method<0x31 || Arc.EAHead.Method>0x35 || Arc.EAHead.UnpVer>PACK_VER) - { - Log(Arc.FileName,St(MEAUnknHeader),FileName); - return; - } - - ComprDataIO DataIO; - Unpack Unpack(&DataIO); - Unpack.Init(); - - Array<byte> UnpData(Arc.EAHead.UnpSize); - DataIO.SetUnpackToMemory(&UnpData[0],Arc.EAHead.UnpSize); - DataIO.SetPackedSizeToRead(Arc.EAHead.DataSize); - DataIO.EnableShowProgress(false); - DataIO.SetFiles(&Arc,NULL); - Unpack.SetDestSize(Arc.EAHead.UnpSize); - Unpack.DoUnpack(Arc.EAHead.UnpVer,false); - - if (Arc.EAHead.EACRC!=~DataIO.UnpFileCRC) - { - Log(Arc.FileName,St(MEABroken),FileName); - ErrHandler.SetErrorCode(CRC_ERROR); - return; - } - int fd = open(FileName,O_WRONLY); - if (fd==-1) - { - Log(Arc.FileName,St(MCannotSetEA),FileName); - ErrHandler.SetErrorCode(WARNING); - return; - } - - int AttrPos=0; - while (AttrPos<Arc.EAHead.UnpSize) - { - unsigned char *CurItem=&UnpData[AttrPos]; - int NameSize=CurItem[0]+((int)CurItem[1]<<8); - int Type=CurItem[2]+((int)CurItem[3]<<8)+((int)CurItem[4]<<16)+((int)CurItem[5]<<24); - int Size=CurItem[6]+((int)CurItem[7]<<8)+((int)CurItem[8]<<16)+((int)CurItem[9]<<24); - char Name[1024]; - if (NameSize>=sizeof(Name)) - { - Log(Arc.FileName,St(MCannotSetEA),FileName); - ErrHandler.SetErrorCode(WARNING); - break; - } - memcpy(Name,CurItem+10,NameSize); - Name[NameSize]=0; - if (fs_write_attr(fd,Name,Type,0,CurItem+10+NameSize,Size)==-1) - { - Log(Arc.FileName,St(MCannotSetEA),FileName); - ErrHandler.SetErrorCode(WARNING); - break; - } - AttrPos+=10+NameSize+Size; - } - close(fd); - mprintf(St(MShowEA)); -} - - -void ExtractBeEANew(Archive &Arc,char *FileName) -{ - Array<byte> SubData; - if (!Arc.ReadSubData(&SubData,NULL)) - return; - - int fd = open(FileName,O_WRONLY); - if (fd==-1) - { - Log(Arc.FileName,St(MCannotSetEA),FileName); - ErrHandler.SetErrorCode(WARNING); - return; - } - - int AttrPos=0; - while (AttrPos<Arc.EAHead.UnpSize) - { - unsigned char *CurItem=&SubData[AttrPos]; - int NameSize=CurItem[0]+((int)CurItem[1]<<8); - int Type=CurItem[2]+((int)CurItem[3]<<8)+((int)CurItem[4]<<16)+((int)CurItem[5]<<24); - int Size=CurItem[6]+((int)CurItem[7]<<8)+((int)CurItem[8]<<16)+((int)CurItem[9]<<24); - char Name[1024]; - if (NameSize>=sizeof(Name)) - { - Log(Arc.FileName,St(MCannotSetEA),FileName); - ErrHandler.SetErrorCode(WARNING); - break; - } - memcpy(Name,CurItem+10,NameSize); - Name[NameSize]=0; - if (fs_write_attr(fd,Name,Type,0,CurItem+10+NameSize,Size)==-1) - { - Log(Arc.FileName,St(MCannotSetEA),FileName); - ErrHandler.SetErrorCode(WARNING); - break; - } - AttrPos+=10+NameSize+Size; - } - close(fd); - mprintf(St(MShowEA)); -} - diff --git a/src/bin/unrar/cmddata.cpp b/src/bin/unrar/cmddata.cpp deleted file mode 100644 index 41f3dd7..0000000 --- a/src/bin/unrar/cmddata.cpp +++ /dev/null @@ -1,1287 +0,0 @@ -#include "rar.hpp" - -CommandData::CommandData() -{ - FileArgs=ExclArgs=InclArgs=StoreArgs=ArcNames=NULL; - Init(); -} - - -CommandData::~CommandData() -{ - Close(); -} - - -void CommandData::Init() -{ - Close(); - - *Command=0; - *ArcName=0; - *ArcNameW=0; - FileLists=false; - NoMoreSwitches=false; - TimeConverted=false; - - FileArgs=new StringList; - ExclArgs=new StringList; - InclArgs=new StringList; - StoreArgs=new StringList; - ArcNames=new StringList; -} - - -void CommandData::Close() -{ - delete FileArgs; - delete ExclArgs; - delete InclArgs; - delete StoreArgs; - delete ArcNames; - FileArgs=ExclArgs=InclArgs=StoreArgs=ArcNames=NULL; - NextVolSizes.Reset(); -} - - -#if !defined(SFX_MODULE) -void CommandData::ParseArg(char *Arg,wchar *ArgW) -{ - if (IsSwitch(*Arg) && !NoMoreSwitches) - if (Arg[1]=='-') - NoMoreSwitches=true; - else - ProcessSwitch(&Arg[1]); - else - if (*Command==0) - { - strncpyz(Command,Arg,ASIZE(Command)); - if (ArgW!=NULL) - strncpyw(CommandW,ArgW,sizeof(CommandW)/sizeof(CommandW[0])); - if (etoupper(*Command)=='S') - { - const char *SFXName=Command[1] ? Command+1:DefSFXName; - if (PointToName(SFXName)!=SFXName || FileExist(SFXName)) - strcpy(SFXModule,SFXName); - else - GetConfigName(SFXName,SFXModule,true); - } -#ifndef GUI - *Command=etoupper(*Command); - if (*Command!='I' && *Command!='S') - strupper(Command); -#endif - } - else - if (*ArcName==0) - { - strncpyz(ArcName,Arg,ASIZE(ArcName)); - if (ArgW!=NULL) - strncpyzw(ArcNameW,ArgW,ASIZE(ArcNameW)); - } - else - { - int Length=strlen(Arg); - char EndChar=Arg[Length-1]; - char CmdChar=etoupper(*Command); - bool Add=strchr("AFUM",CmdChar)!=NULL; - bool Extract=CmdChar=='X' || CmdChar=='E'; - if ((IsDriveDiv(EndChar) || IsPathDiv(EndChar)) && !Add) - { - strncpyz(ExtrPath,Arg,ASIZE(ExtrPath)); - if (ArgW!=NULL) - strncpyzw(ExtrPathW,ArgW,ASIZE(ExtrPathW)); - } - else - if ((Add || CmdChar=='T') && *Arg!='@') - FileArgs->AddString(Arg); - else - { - struct FindData FileData; - bool Found=FindFile::FastFind(Arg,NULL,&FileData); - if (!Found && *Arg=='@' && !IsWildcard(Arg)) - { - FileLists=true; - - RAR_CHARSET Charset=FilelistCharset; - -#if defined(_WIN_32) && !defined(GUI) - // for compatibility reasons we use OEM encoding - // in Win32 console version by default - - if (Charset==RCH_DEFAULT) - Charset=RCH_OEM; -#endif - - ReadTextFile(Arg+1,FileArgs,false,true,Charset,true,true); - } - else - if (Found && FileData.IsDir && Extract && *ExtrPath==0) - { - strcpy(ExtrPath,Arg); - AddEndSlash(ExtrPath); - } - else - FileArgs->AddString(Arg); - } - } -} -#endif - - -void CommandData::ParseDone() -{ - if (FileArgs->ItemsCount()==0 && !FileLists) - FileArgs->AddString(MASKALL); - char CmdChar=etoupper(*Command); - bool Extract=CmdChar=='X' || CmdChar=='E'; - if (Test && Extract) - Test=false; - BareOutput=(CmdChar=='L' || CmdChar=='V') && Command[1]=='B'; -} - - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) -void CommandData::ParseEnvVar() -{ - char *EnvStr=getenv("RAR"); - if (EnvStr!=NULL) - ProcessSwitchesString(EnvStr); -} -#endif - - - -// return 'false' if -cfg- is present and preprocess switches -// which must be processed before the rest of command line - -#ifndef SFX_MODULE -bool CommandData::IsConfigEnabled(int argc,char *argv[]) -{ - bool ConfigEnabled=true; - for (int I=1;I<argc;I++) - if (IsSwitch(*argv[I])) - { - if (stricomp(&argv[I][1],"cfg-")==0) - ConfigEnabled=false; -#ifndef GUI - if (strnicomp(&argv[I][1],"ilog",4)==0) - { - // ensure that correct log file name is already set - // if we need to report an error when processing the command line - ProcessSwitch(&argv[I][1]); - InitLogOptions(LogName); - } -#endif - if (strnicomp(&argv[I][1],"sc",2)==0) - { - // process -cs before reading any file lists - ProcessSwitch(&argv[I][1]); - } - } - return(ConfigEnabled); -} -#endif - - -#if !defined(GUI) && !defined(SFX_MODULE) -void CommandData::ReadConfig(int argc,char *argv[]) -{ - StringList List; - if (ReadTextFile(DefConfigName,&List,true)) - { - char *Str; - while ((Str=List.GetString())!=NULL) - { - while (isspace(*Str)) - Str++; - if (strnicomp(Str,"switches=",9)==0) - ProcessSwitchesString(Str+9); - } - } -} -#endif - - -#if !defined(SFX_MODULE) && !defined(_WIN_CE) -void CommandData::ProcessSwitchesString(char *Str) -{ - while (*Str) - { - while (!IsSwitch(*Str) && *Str!=0) - Str++; - if (*Str==0) - break; - char *Next=Str; - while (!(Next[0]==' ' && IsSwitch(Next[1])) && *Next!=0) - Next++; - char NextChar=*Next; - *Next=0; - ProcessSwitch(Str+1); - *Next=NextChar; - Str=Next; - } -} -#endif - - -#if !defined(SFX_MODULE) -void CommandData::ProcessSwitch(char *Switch) -{ - - switch(etoupper(Switch[0])) - { - case 'I': - if (strnicomp(&Switch[1],"LOG",3)==0) - { - strncpyz(LogName,Switch[4] ? Switch+4:DefLogName,ASIZE(LogName)); - break; - } - if (stricomp(&Switch[1],"SND")==0) - { - Sound=true; - break; - } - if (stricomp(&Switch[1],"ERR")==0) - { - MsgStream=MSG_STDERR; - break; - } - if (strnicomp(&Switch[1],"EML",3)==0) - { - strncpyz(EmailTo,Switch[4] ? Switch+4:"@",ASIZE(EmailTo)); - EmailTo[sizeof(EmailTo)-1]=0; - break; - } - if (stricomp(&Switch[1],"NUL")==0) - { - MsgStream=MSG_NULL; - break; - } - if (etoupper(Switch[1])=='D') - { - for (int I=2;Switch[I]!=0;I++) - switch(etoupper(Switch[I])) - { - case 'Q': - MsgStream=MSG_ERRONLY; - break; - case 'C': - DisableCopyright=true; - break; - case 'D': - DisableDone=true; - break; - case 'P': - DisablePercentage=true; - break; - } - break; - } - if (stricomp(&Switch[1],"OFF")==0) - { - Shutdown=true; - break; - } - break; - case 'T': - switch(etoupper(Switch[1])) - { - case 'K': - ArcTime=ARCTIME_KEEP; - break; - case 'L': - ArcTime=ARCTIME_LATEST; - break; - case 'O': - FileTimeBefore.SetAgeText(Switch+2); - break; - case 'N': - FileTimeAfter.SetAgeText(Switch+2); - break; - case 'B': - FileTimeBefore.SetIsoText(Switch+2); - break; - case 'A': - FileTimeAfter.SetIsoText(Switch+2); - break; - case 'S': - { - EXTTIME_MODE Mode=EXTTIME_HIGH3; - bool CommonMode=Switch[2]>='0' && Switch[2]<='4'; - if (CommonMode) - Mode=(EXTTIME_MODE)(Switch[2]-'0'); - if (Switch[2]=='-') - Mode=EXTTIME_NONE; - if (CommonMode || Switch[2]=='-' || Switch[2]=='+' || Switch[2]==0) - xmtime=xctime=xatime=Mode; - else - { - if (Switch[3]>='0' && Switch[3]<='4') - Mode=(EXTTIME_MODE)(Switch[3]-'0'); - if (Switch[3]=='-') - Mode=EXTTIME_NONE; - switch(etoupper(Switch[2])) - { - case 'M': - xmtime=Mode; - break; - case 'C': - xctime=Mode; - break; - case 'A': - xatime=Mode; - break; - case 'R': - xarctime=Mode; - break; - } - } - } - break; - case '-': - Test=false; - break; - case 0: - Test=true; - break; - default: - BadSwitch(Switch); - break; - } - break; - case 'A': - switch(etoupper(Switch[1])) - { - case 'C': - ClearArc=true; - break; - case 'D': - AppendArcNameToPath=true; - break; - case 'G': - if (Switch[2]=='-' && Switch[3]==0) - GenerateArcName=0; - else - { - GenerateArcName=true; - strncpyz(GenerateMask,Switch+2,ASIZE(GenerateMask)); - } - break; - case 'N': //reserved for archive name - break; - case 'O': - AddArcOnly=true; - break; - case 'P': - strcpy(ArcPath,Switch+2); - break; - case 'S': - SyncFiles=true; - break; - default: - BadSwitch(Switch); - break; - } - break; - case 'D': - if (Switch[2]==0) - switch(etoupper(Switch[1])) - { - case 'S': - DisableSortSolid=true; - break; - case 'H': - OpenShared=true; - break; - case 'F': - DeleteFiles=true; - break; - } - break; - case 'O': - switch(etoupper(Switch[1])) - { - case '+': - Overwrite=OVERWRITE_ALL; - break; - case '-': - Overwrite=OVERWRITE_NONE; - break; - case 'R': - Overwrite=OVERWRITE_AUTORENAME; - break; - case 'W': - ProcessOwners=true; - break; -#ifdef SAVE_LINKS - case 'L': - SaveLinks=true; - break; -#endif -#ifdef _WIN_32 - case 'S': - SaveStreams=true; - break; - case 'C': - SetCompressedAttr=true; - break; -#endif - default : - BadSwitch(Switch); - break; - } - break; - case 'R': - switch(etoupper(Switch[1])) - { - case 0: - Recurse=RECURSE_ALWAYS; - break; - case '-': - Recurse=0; - break; - case '0': - Recurse=RECURSE_WILDCARDS; - break; -#ifndef _WIN_CE - case 'I': - { - Priority=atoi(Switch+2); - char *ChPtr=strchr(Switch+2,':'); - if (ChPtr!=NULL) - { - SleepTime=atoi(ChPtr+1); - InitSystemOptions(SleepTime); - } - SetPriority(Priority); - } - break; -#endif - } - break; - case 'Y': - AllYes=true; - break; - case 'N': - case 'X': - if (Switch[1]!=0) - { - StringList *Args=etoupper(Switch[0])=='N' ? InclArgs:ExclArgs; - if (Switch[1]=='@' && !IsWildcard(Switch)) - { - RAR_CHARSET Charset=FilelistCharset; - -#if defined(_WIN_32) && !defined(GUI) - // for compatibility reasons we use OEM encoding - // in Win32 console version by default - - if (Charset==RCH_DEFAULT) - Charset=RCH_OEM; -#endif - - ReadTextFile(Switch+2,Args,false,true,Charset,true,true); - } - else - Args->AddString(Switch+1); - } - break; - case 'E': - switch(etoupper(Switch[1])) - { - case 'P': - switch(Switch[2]) - { - case 0: - ExclPath=EXCL_SKIPWHOLEPATH; - break; - case '1': - ExclPath=EXCL_BASEPATH; - break; - case '2': - ExclPath=EXCL_SAVEFULLPATH; - break; - case '3': - ExclPath=EXCL_ABSPATH; - break; - } - break; - case 'D': - ExclEmptyDir=true; - break; - case 'E': - ProcessEA=false; - break; - case 'N': - NoEndBlock=true; - break; - default: - if (Switch[1]=='+') - { - InclFileAttr=GetExclAttr(&Switch[2]); - InclAttrSet=true; - } - else - ExclFileAttr=GetExclAttr(&Switch[1]); - break; - } - break; - case 'P': - if (Switch[1]==0) - { - GetPassword(PASSWORD_GLOBAL,NULL,Password,sizeof(Password)); - eprintf("\n"); - } - else - strncpyz(Password,Switch+1,ASIZE(Password)); - break; - case 'H': - if (etoupper(Switch[1])=='P') - { - EncryptHeaders=true; - if (Switch[2]!=0) - strncpyz(Password,Switch+2,ASIZE(Password)); - else - if (*Password==0) - { - GetPassword(PASSWORD_GLOBAL,NULL,Password,sizeof(Password)); - eprintf("\n"); - } - } - break; - case 'Z': - strncpyz(CommentFile,Switch[1]!=0 ? Switch+1:"stdin",ASIZE(CommentFile)); - break; - case 'M': - switch(etoupper(Switch[1])) - { - case 'C': - { - char *Str=Switch+2; - if (*Str=='-') - for (int I=0;I<sizeof(FilterModes)/sizeof(FilterModes[0]);I++) - FilterModes[I].State=FILTER_DISABLE; - else - while (*Str) - { - int Param1=0,Param2=0; - FilterState State=FILTER_AUTO; - FilterType Type=FILTER_NONE; - if (isdigit(*Str)) - { - Param1=atoi(Str); - while (isdigit(*Str)) - Str++; - } - if (*Str==':' && isdigit(Str[1])) - { - Param2=atoi(++Str); - while (isdigit(*Str)) - Str++; - } - switch(etoupper(*(Str++))) - { - case 'T': Type=FILTER_PPM; break; - case 'E': Type=FILTER_E8; break; - case 'D': Type=FILTER_DELTA; break; - case 'A': Type=FILTER_AUDIO; break; - case 'C': Type=FILTER_RGB; break; - case 'I': Type=FILTER_ITANIUM; break; - case 'L': Type=FILTER_UPCASETOLOW; break; - } - if (*Str=='+' || *Str=='-') - State=*(Str++)=='+' ? FILTER_FORCE:FILTER_DISABLE; - FilterModes[Type].State=State; - FilterModes[Type].Param1=Param1; - FilterModes[Type].Param2=Param2; - } - } - break; - case 'M': - break; - case 'D': - { - if ((WinSize=atoi(&Switch[2]))==0) - WinSize=0x10000<<(etoupper(Switch[2])-'A'); - else - WinSize*=1024; - if (!CheckWinSize()) - BadSwitch(Switch); - } - break; - case 'S': - { - char *Names=Switch+2,DefNames[512]; - if (*Names==0) - { - strcpy(DefNames,DefaultStoreList); - Names=DefNames; - } - while (*Names!=0) - { - char *End=strchr(Names,';'); - if (End!=NULL) - *End=0; - if (*Names=='.') - Names++; - char Mask[NM]; - if (strpbrk(Names,"*?.")==NULL) - sprintf(Mask,"*.%s",Names); - else - strcpy(Mask,Names); - StoreArgs->AddString(Mask); - if (End==NULL) - break; - Names=End+1; - } - } - break; -#ifdef PACK_SMP - case 'T': - Threads=atoi(Switch+2); - if (Threads>MaxSearchThreads) - BadSwitch(Switch); - else - { - } - break; -#endif - default: - Method=Switch[1]-'0'; - if (Method>5 || Method<0) - BadSwitch(Switch); - break; - } - break; - case 'V': - switch(etoupper(Switch[1])) - { -#ifdef _WIN_32 - case 'D': - EraseDisk=true; - break; -#endif - case 'N': - OldNumbering=true; - break; - case 'P': - VolumePause=true; - break; - case 'E': - if (etoupper(Switch[2])=='R') - VersionControl=atoi(Switch+3)+1; - break; - case '-': - VolSize=0; - break; - default: - { - Int64 NewVolSize=atoil(&Switch[1]); - - if (NewVolSize==0) - NewVolSize=INT64ERR; - else - switch (Switch[strlen(Switch)-1]) - { - case 'f': - case 'F': - switch(int64to32(NewVolSize)) - { - case 360: - NewVolSize=362496; - break; - case 720: - NewVolSize=730112; - break; - case 1200: - NewVolSize=1213952; - break; - case 1440: - NewVolSize=1457664; - break; - case 2880: - NewVolSize=2915328; - break; - } - break; - case 'k': - NewVolSize*=1024; - break; - case 'm': - NewVolSize*=1024*1024; - break; - case 'M': - NewVolSize*=1000*1000; - break; - case 'g': - NewVolSize*=1024*1024; - NewVolSize*=1024; - break; - case 'G': - NewVolSize*=1000*1000; - NewVolSize*=1000; - break; - case 'b': - case 'B': - break; - default: - NewVolSize*=1000; - break; - } - if (VolSize==0) - VolSize=NewVolSize; - else - NextVolSizes.Push(NewVolSize); - } - break; - } - break; - case 'F': - if (Switch[1]==0) - FreshFiles=true; - else - BadSwitch(Switch); - break; - case 'U': - if (Switch[1]==0) - UpdateFiles=true; - else - BadSwitch(Switch); - break; - case 'W': - strncpyz(TempPath,&Switch[1],ASIZE(TempPath)); - AddEndSlash(TempPath); - break; - case 'S': - if (strnicomp(Switch,"SFX",3)==0) - { - const char *SFXName=Switch[3] ? Switch+3:DefSFXName; - if (PointToName(SFXName)!=SFXName || FileExist(SFXName)) - strcpy(SFXModule,SFXName); - else - GetConfigName(SFXName,SFXModule,true); - } - if (isdigit(Switch[1])) - { - Solid|=SOLID_COUNT; - SolidCount=atoi(&Switch[1]); - } - else - switch(etoupper(Switch[1])) - { - case 0: - Solid|=SOLID_NORMAL; - break; - case '-': - Solid=SOLID_NONE; - break; [ *** diff truncated: 21288 lines dropped *** ]