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