summaryrefslogtreecommitdiff
path: root/unrar/unrar/beosea.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'unrar/unrar/beosea.cpp')
-rw-r--r--unrar/unrar/beosea.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/unrar/unrar/beosea.cpp b/unrar/unrar/beosea.cpp
new file mode 100644
index 0000000..86eb7d4
--- /dev/null
+++ b/unrar/unrar/beosea.cpp
@@ -0,0 +1,113 @@
+
+
+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));
+}
+