35 lines
1 KiB
C++
35 lines
1 KiB
C++
#include "rar.hpp"
|
|
|
|
|
|
|
|
bool ExtractLink(ComprDataIO &DataIO,Archive &Arc,const char *LinkName,uint &LinkCRC,bool Create)
|
|
{
|
|
#if defined(SAVE_LINKS) && defined(_UNIX)
|
|
char LinkTarget[NM];
|
|
if (IsLink(Arc.NewLhd.FileAttr))
|
|
{
|
|
int DataSize=Min(Arc.NewLhd.PackSize,sizeof(LinkTarget)-1);
|
|
DataIO.UnpRead((byte *)LinkTarget,DataSize);
|
|
LinkTarget[DataSize]=0;
|
|
if (Create)
|
|
{
|
|
CreatePath(LinkName,NULL,true);
|
|
if (symlink(LinkTarget,LinkName)==-1) // Error.
|
|
if (errno==EEXIST)
|
|
Log(Arc.FileName,St(MSymLinkExists),LinkName);
|
|
else
|
|
{
|
|
Log(Arc.FileName,St(MErrCreateLnk),LinkName);
|
|
ErrHandler.SetErrorCode(RARX_WARNING);
|
|
}
|
|
// We do not set time of created symlink, because utime changes
|
|
// time of link target and lutimes is not available on all Linux
|
|
// systems at the moment of writing this code.
|
|
}
|
|
int NameSize=Min(DataSize,strlen(LinkTarget));
|
|
LinkCRC=CRC(0xffffffff,LinkTarget,NameSize);
|
|
return(true);
|
|
}
|
|
#endif
|
|
return(false);
|
|
}
|