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