1
2
ExtractBeEA(Archive & Arc,char * FileName)3 void ExtractBeEA(Archive &Arc,char *FileName)
4 {
5 if (Arc.HeaderCRC!=Arc.EAHead.HeadCRC)
6 {
7 Log(Arc.FileName,St(MEABroken),FileName);
8 ErrHandler.SetErrorCode(CRC_ERROR);
9 return;
10 }
11 if (Arc.EAHead.Method<0x31 || Arc.EAHead.Method>0x35 || Arc.EAHead.UnpVer>PACK_VER)
12 {
13 Log(Arc.FileName,St(MEAUnknHeader),FileName);
14 return;
15 }
16
17 ComprDataIO DataIO;
18 Unpack Unpack(&DataIO);
19 Unpack.Init();
20
21 Array<byte> UnpData(Arc.EAHead.UnpSize);
22 DataIO.SetUnpackToMemory(&UnpData[0],Arc.EAHead.UnpSize);
23 DataIO.SetPackedSizeToRead(Arc.EAHead.DataSize);
24 DataIO.EnableShowProgress(false);
25 DataIO.SetFiles(&Arc,NULL);
26 Unpack.SetDestSize(Arc.EAHead.UnpSize);
27 Unpack.DoUnpack(Arc.EAHead.UnpVer,false);
28
29 if (Arc.EAHead.EACRC!=~DataIO.UnpFileCRC)
30 {
31 Log(Arc.FileName,St(MEABroken),FileName);
32 ErrHandler.SetErrorCode(CRC_ERROR);
33 return;
34 }
35 int fd = open(FileName,O_WRONLY);
36 if (fd==-1)
37 {
38 Log(Arc.FileName,St(MCannotSetEA),FileName);
39 ErrHandler.SetErrorCode(WARNING);
40 return;
41 }
42
43 int AttrPos=0;
44 while (AttrPos<Arc.EAHead.UnpSize)
45 {
46 unsigned char *CurItem=&UnpData[AttrPos];
47 int NameSize=CurItem[0]+((int)CurItem[1]<<8);
48 int Type=CurItem[2]+((int)CurItem[3]<<8)+((int)CurItem[4]<<16)+((int)CurItem[5]<<24);
49 int Size=CurItem[6]+((int)CurItem[7]<<8)+((int)CurItem[8]<<16)+((int)CurItem[9]<<24);
50 char Name[1024];
51 if (NameSize>=sizeof(Name))
52 {
53 Log(Arc.FileName,St(MCannotSetEA),FileName);
54 ErrHandler.SetErrorCode(WARNING);
55 break;
56 }
57 memcpy(Name,CurItem+10,NameSize);
58 Name[NameSize]=0;
59 if (fs_write_attr(fd,Name,Type,0,CurItem+10+NameSize,Size)==-1)
60 {
61 Log(Arc.FileName,St(MCannotSetEA),FileName);
62 ErrHandler.SetErrorCode(WARNING);
63 break;
64 }
65 AttrPos+=10+NameSize+Size;
66 }
67 close(fd);
68 mprintf(St(MShowEA));
69 }
70
71
ExtractBeEANew(Archive & Arc,char * FileName)72 void ExtractBeEANew(Archive &Arc,char *FileName)
73 {
74 Array<byte> SubData;
75 if (!Arc.ReadSubData(&SubData,NULL))
76 return;
77
78 int fd = open(FileName,O_WRONLY);
79 if (fd==-1)
80 {
81 Log(Arc.FileName,St(MCannotSetEA),FileName);
82 ErrHandler.SetErrorCode(WARNING);
83 return;
84 }
85
86 int AttrPos=0;
87 while (AttrPos<Arc.EAHead.UnpSize)
88 {
89 unsigned char *CurItem=&SubData[AttrPos];
90 int NameSize=CurItem[0]+((int)CurItem[1]<<8);
91 int Type=CurItem[2]+((int)CurItem[3]<<8)+((int)CurItem[4]<<16)+((int)CurItem[5]<<24);
92 int Size=CurItem[6]+((int)CurItem[7]<<8)+((int)CurItem[8]<<16)+((int)CurItem[9]<<24);
93 char Name[1024];
94 if (NameSize>=sizeof(Name))
95 {
96 Log(Arc.FileName,St(MCannotSetEA),FileName);
97 ErrHandler.SetErrorCode(WARNING);
98 break;
99 }
100 memcpy(Name,CurItem+10,NameSize);
101 Name[NameSize]=0;
102 if (fs_write_attr(fd,Name,Type,0,CurItem+10+NameSize,Size)==-1)
103 {
104 Log(Arc.FileName,St(MCannotSetEA),FileName);
105 ErrHandler.SetErrorCode(WARNING);
106 break;
107 }
108 AttrPos+=10+NameSize+Size;
109 }
110 close(fd);
111 mprintf(St(MShowEA));
112 }
113
114