1 #include "rar.hpp"
2
3
4
ExtractLink(ComprDataIO & DataIO,Archive & Arc,const char * LinkName,uint & LinkCRC,bool Create)5 bool ExtractLink(ComprDataIO &DataIO,Archive &Arc,const char *LinkName,uint &LinkCRC,bool Create)
6 {
7 #if defined(SAVE_LINKS) && defined(_UNIX)
8 char LinkTarget[NM];
9 if (IsLink(Arc.NewLhd.FileAttr))
10 {
11 int DataSize=Min(Arc.NewLhd.PackSize,sizeof(LinkTarget)-1);
12 DataIO.UnpRead((byte *)LinkTarget,DataSize);
13 LinkTarget[DataSize]=0;
14 if (Create)
15 {
16 CreatePath(LinkName,NULL,true);
17 if (symlink(LinkTarget,LinkName)==-1) // Error.
18 if (errno==EEXIST)
19 Log(Arc.FileName,St(MSymLinkExists),LinkName);
20 else
21 {
22 Log(Arc.FileName,St(MErrCreateLnk),LinkName);
23 ErrHandler.SetErrorCode(WARNING);
24 }
25 // We do not set time of created symlink, because utime changes
26 // time of link target and lutimes is not available on all Linux
27 // systems at the moment of writing this code.
28 }
29 int NameSize=Min(DataSize,strlen(LinkTarget));
30 LinkCRC=CRC(0xffffffff,LinkTarget,NameSize);
31 return(true);
32 }
33 #endif
34 return(false);
35 }
36