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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
void ExtractUnixOwner20(Archive &Arc,const wchar *FileName)
{
char NameA[NM];
WideToChar(FileName,NameA,ASIZE(NameA));
if (Arc.BrokenHeader)
{
uiMsg(UIERROR_UOWNERBROKEN,Arc.FileName,FileName);
ErrHandler.SetErrorCode(RARX_CRC);
return;
}
struct passwd *pw;
errno=0; // Required by getpwnam specification if we need to check errno.
if ((pw=getpwnam(Arc.UOHead.OwnerName))==NULL)
{
uiMsg(UIERROR_UOWNERGETOWNERID,Arc.FileName,GetWide(Arc.UOHead.OwnerName));
ErrHandler.SysErrMsg();
ErrHandler.SetErrorCode(RARX_WARNING);
return;
}
uid_t OwnerID=pw->pw_uid;
struct group *gr;
errno=0; // Required by getgrnam specification if we need to check errno.
if ((gr=getgrnam(Arc.UOHead.GroupName))==NULL)
{
uiMsg(UIERROR_UOWNERGETGROUPID,Arc.FileName,GetWide(Arc.UOHead.GroupName));
ErrHandler.SysErrMsg();
ErrHandler.SetErrorCode(RARX_CRC);
return;
}
uint Attr=GetFileAttr(FileName);
gid_t GroupID=gr->gr_gid;
#if defined(SAVE_LINKS) && !defined(_APPLE)
if (lchown(NameA,OwnerID,GroupID)!=0)
#else
if (chown(NameA,OwnerID,GroupID)!=0)
#endif
{
uiMsg(UIERROR_UOWNERSET,Arc.FileName,FileName);
ErrHandler.SetErrorCode(RARX_CREATE);
}
SetFileAttr(FileName,Attr);
}
void ExtractUnixOwner30(Archive &Arc,const wchar *FileName)
{
char NameA[NM];
WideToChar(FileName,NameA,ASIZE(NameA));
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)
{
uiMsg(UIERROR_UOWNERGETOWNERID,Arc.FileName,GetWide(OwnerName));
ErrHandler.SetErrorCode(RARX_WARNING);
return;
}
uid_t OwnerID=pw->pw_uid;
struct group *gr;
if ((gr=getgrnam(GroupName))==NULL)
{
uiMsg(UIERROR_UOWNERGETGROUPID,Arc.FileName,GetWide(GroupName));
ErrHandler.SetErrorCode(RARX_WARNING);
return;
}
uint Attr=GetFileAttr(FileName);
gid_t GroupID=gr->gr_gid;
#if defined(SAVE_LINKS) && !defined(_APPLE)
if (lchown(NameA,OwnerID,GroupID)!=0)
#else
if (chown(NameA,OwnerID,GroupID)!=0)
#endif
{
uiMsg(UIERROR_UOWNERSET,Arc.FileName,FileName);
ErrHandler.SetErrorCode(RARX_CREATE);
}
SetFileAttr(FileName,Attr);
}
void SetUnixOwner(Archive &Arc,const wchar *FileName)
{
char NameA[NM];
WideToChar(FileName,NameA,ASIZE(NameA));
// 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;
}
#if defined(SAVE_LINKS) && !defined(_APPLE)
if (lchown(NameA,hd.UnixOwnerID,hd.UnixGroupID)!=0)
#else
if (chown(NameA,hd.UnixOwnerID,hd.UnixGroupID)!=0)
#endif
{
uiMsg(UIERROR_UOWNERSET,Arc.FileName,FileName);
ErrHandler.SetErrorCode(RARX_CREATE);
}
}
|