1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
void ExtractUnixOwner30(Archive &Arc,const wchar *FileName)
{
// There must be 0 byte between owner and group strings.
// Otherwise strlen call below wouldn't be safe.
if (memchr(Arc.SubHead.SubData.data(),0,Arc.SubHead.SubData.size())==NULL)
return;
char *OwnerName=(char *)Arc.SubHead.SubData.data();
int OwnerSize=strlen(OwnerName)+1;
int GroupSize=Arc.SubHead.SubData.size()-OwnerSize;
char *GroupName=(char *)&Arc.SubHead.SubData[OwnerSize];
std::string GroupStr(GroupName,GroupName+GroupSize);
struct passwd *pw;
if ((pw=getpwnam(OwnerName))==NULL)
{
uiMsg(UIERROR_UOWNERGETOWNERID,Arc.FileName,GetWide(OwnerName));
ErrHandler.SetErrorCode(RARX_WARNING);
return;
}
uid_t OwnerID=pw->pw_uid;
struct group *gr;
if ((gr=getgrnam(GroupStr.c_str()))==NULL)
{
uiMsg(UIERROR_UOWNERGETGROUPID,Arc.FileName,GetWide(GroupName));
ErrHandler.SetErrorCode(RARX_WARNING);
return;
}
uint Attr=GetFileAttr(FileName);
gid_t GroupID=gr->gr_gid;
std::string NameA;
WideToChar(FileName,NameA);
#if defined(SAVE_LINKS) && !defined(_APPLE)
if (lchown(NameA.c_str(),OwnerID,GroupID)!=0)
#else
if (chown(NameA.c_str(),OwnerID,GroupID)!=0)
#endif
{
uiMsg(UIERROR_UOWNERSET,Arc.FileName,FileName);
ErrHandler.SetErrorCode(RARX_CREATE);
}
SetFileAttr(FileName,Attr);
}
void SetUnixOwner(Archive &Arc,const std::wstring &FileName)
{
// First, we try to resolve symbolic names. If they are missing or cannot
// be resolved, we try to use numeric values if any. If numeric values
// are missing too, function fails.
FileHeader &hd=Arc.FileHead;
if (*hd.UnixOwnerName!=0)
{
struct passwd *pw;
if ((pw=getpwnam(hd.UnixOwnerName))==NULL)
{
if (!hd.UnixOwnerNumeric)
{
uiMsg(UIERROR_UOWNERGETOWNERID,Arc.FileName,GetWide(hd.UnixOwnerName));
ErrHandler.SetErrorCode(RARX_WARNING);
return;
}
}
else
hd.UnixOwnerID=pw->pw_uid;
}
if (*hd.UnixGroupName!=0)
{
struct group *gr;
if ((gr=getgrnam(hd.UnixGroupName))==NULL)
{
if (!hd.UnixGroupNumeric)
{
uiMsg(UIERROR_UOWNERGETGROUPID,Arc.FileName,GetWide(hd.UnixGroupName));
ErrHandler.SetErrorCode(RARX_WARNING);
return;
}
}
else
hd.UnixGroupID=gr->gr_gid;
}
std::string NameA;
WideToChar(FileName,NameA);
#if defined(SAVE_LINKS) && !defined(_APPLE)
if (lchown(NameA.c_str(),hd.UnixOwnerID,hd.UnixGroupID)!=0)
#else
if (chown(NameA.c_str(),hd.UnixOwnerID,hd.UnixGroupID)!=0)
#endif
{
uiMsg(UIERROR_UOWNERSET,Arc.FileName,FileName);
ErrHandler.SetErrorCode(RARX_CREATE);
}
}
|