81 lines
2.0 KiB
C++
81 lines
2.0 KiB
C++
|
|
|
|
void ExtractUnixOwner(Archive &Arc,char *FileName)
|
|
{
|
|
if (Arc.HeaderCRC!=Arc.UOHead.HeadCRC)
|
|
{
|
|
Log(Arc.FileName,St(MOwnersBroken),FileName);
|
|
ErrHandler.SetErrorCode(CRC_ERROR);
|
|
return;
|
|
}
|
|
|
|
struct passwd *pw;
|
|
if ((pw=getpwnam(Arc.UOHead.OwnerName))==NULL)
|
|
{
|
|
Log(Arc.FileName,St(MErrGetOwnerID),Arc.UOHead.OwnerName);
|
|
ErrHandler.SetErrorCode(WARNING);
|
|
return;
|
|
}
|
|
uid_t OwnerID=pw->pw_uid;
|
|
|
|
struct group *gr;
|
|
if ((gr=getgrnam(Arc.UOHead.GroupName))==NULL)
|
|
{
|
|
Log(Arc.FileName,St(MErrGetGroupID),Arc.UOHead.GroupName);
|
|
ErrHandler.SetErrorCode(CRC_ERROR);
|
|
return;
|
|
}
|
|
uint Attr=GetFileAttr(FileName,NULL);
|
|
gid_t GroupID=gr->gr_gid;
|
|
#if defined(SAVE_LINKS) && !defined(_APPLE)
|
|
if (lchown(FileName,OwnerID,GroupID)!=0)
|
|
#else
|
|
if (chown(FileName,OwnerID,GroupID)!=0)
|
|
#endif
|
|
{
|
|
Log(Arc.FileName,St(MSetOwnersError),FileName);
|
|
ErrHandler.SetErrorCode(CREATE_ERROR);
|
|
}
|
|
SetFileAttr(FileName,NULL,Attr);
|
|
}
|
|
|
|
|
|
void ExtractUnixOwnerNew(Archive &Arc,char *FileName)
|
|
{
|
|
char *OwnerName=(char *)&Arc.SubHead.SubData[0];
|
|
int OwnerSize=strlen(OwnerName)+1;
|
|
int GroupSize=Arc.SubHead.SubData.Size()-OwnerSize;
|
|
char GroupName[NM];
|
|
strncpy(GroupName,(char *)&Arc.SubHead.SubData[OwnerSize],GroupSize);
|
|
GroupName[GroupSize]=0;
|
|
|
|
struct passwd *pw;
|
|
if ((pw=getpwnam(OwnerName))==NULL)
|
|
{
|
|
Log(Arc.FileName,St(MErrGetOwnerID),OwnerName);
|
|
ErrHandler.SetErrorCode(WARNING);
|
|
return;
|
|
}
|
|
uid_t OwnerID=pw->pw_uid;
|
|
|
|
struct group *gr;
|
|
if ((gr=getgrnam(GroupName))==NULL)
|
|
{
|
|
Log(Arc.FileName,St(MErrGetGroupID),GroupName);
|
|
ErrHandler.SetErrorCode(CRC_ERROR);
|
|
return;
|
|
}
|
|
uint Attr=GetFileAttr(FileName,NULL);
|
|
gid_t GroupID=gr->gr_gid;
|
|
#if defined(SAVE_LINKS) && !defined(_APPLE)
|
|
if (lchown(FileName,OwnerID,GroupID)!=0)
|
|
#else
|
|
if (chown(FileName,OwnerID,GroupID)!=0)
|
|
#endif
|
|
{
|
|
Log(Arc.FileName,St(MSetOwnersError),FileName);
|
|
ErrHandler.SetErrorCode(CREATE_ERROR);
|
|
}
|
|
SetFileAttr(FileName,NULL,Attr);
|
|
}
|