ports/filesystems/rar2fs/files/patch-src_dllext.cpp
Robert Clausecker 6e2da9672f filesystems: add new category for file systems and related utilities
The filesystems category houses file systems and file system utilities.
It is added mainly to turn the sysutils/fusefs-* pseudo-category into
a proper one, but is also useful for the sundry of other file systems
related ports found in the tree.

Ports that seem like they belong there are moved to the new category.
Two ports, sysutils/fusefs-funionfs and sysutils/fusefs-fusepak are
not moved as they currently don't fetch and don't have TIMESTAMP set
in their distinfo, but that is required to be able to push a rename
of the port by the pre-receive hook.

Approved by:	portmgr (rene)
Reviewed by:	mat
Pull Request:	https://github.com/freebsd/freebsd-ports/pull/302
PR:		281988
2024-11-06 16:17:35 +01:00

199 lines
6.3 KiB
C++

Add compatibility with libunrar >= 7. Based upon upstream commits:
https://github.com/hasse69/rar2fs/commit/d1d31f416269f4abb1262850b1fe645713a14fc4
https://github.com/hasse69/rar2fs/commit/89d144d17bb23bd2ff143a3aac3593cbfc2dd3c1
--- src/dllext.cpp.orig 2021-05-02 06:17:04 UTC
+++ src/dllext.cpp
@@ -169,13 +169,21 @@ int PASCAL RARListArchiveEx(HANDLE hArcData, RARArchiv
}
else
{
+#if RARVER_MAJOR >= 7
+ wcscpy(N->LinkTargetW,Arc.FileHead.RedirName.c_str());
+#else
wcscpy(N->LinkTargetW,Arc.FileHead.RedirName);
+#endif
N->LinkTargetFlags |= LINK_T_UNICODE; // Make sure UNICODE is set
}
}
else if (Arc.FileHead.RedirType == FSREDIR_FILECOPY)
{
+#if RARVER_MAJOR >= 7
+ wcscpy(N->LinkTargetW,Arc.FileHead.RedirName.c_str());
+#else
wcscpy(N->LinkTargetW,Arc.FileHead.RedirName);
+#endif
N->LinkTargetFlags |= LINK_T_FILECOPY;
}
}
@@ -208,6 +216,13 @@ void PASCAL RARNextVolumeName(char *arch, bool oldstyl
{
#if RARVER_MAJOR < 5
NextVolumeName(arch, NULL, 0, oldstylevolume);
+#elif RARVER_MAJOR >= 7
+ wstring ArchiveW;
+ size_t len=strlen(arch);
+ ArchiveW.assign(arch,arch+len);
+ NextVolumeName(ArchiveW,oldstylevolume);
+ string NextArchive(ArchiveW.begin(),ArchiveW.end());
+ strcpy(arch,NextArchive.c_str());
#else
wchar NextName[NM];
CharToWide(arch, NextName, ASIZE(NextName));
@@ -221,6 +236,14 @@ void PASCAL RARVolNameToFirstName(char *arch, bool old
{
#if RARVER_MAJOR < 5
VolNameToFirstName(arch, arch, !oldstylevolume);
+#elif RARVER_MAJOR >=7
+ wstring ArcName;
+ size_t len=strlen(arch);
+ ArcName.assign(arch,arch+len);
+ VolNameToFirstName(ArcName, ArcName, !oldstylevolume);
+ string FirstName(ArcName.begin(),ArcName.end());
+ strcpy(arch,FirstName.c_str());
+ return;
#else
wchar ArcName[NM];
CharToWide(arch, ArcName, ASIZE(ArcName));
@@ -239,7 +262,6 @@ void PASCAL RARGetFileInfo(HANDLE hArcData, const char
void PASCAL RARGetFileInfo(HANDLE hArcData, const char *FileName, struct RARWcb *wcb)
{
#if RARVER_MAJOR > 4
- char FileNameUtf[NM];
DataSet *Data = (DataSet *)hArcData;
Archive& Arc = Data->Arc;
struct RARHeaderDataEx h;
@@ -248,8 +270,17 @@ void PASCAL RARGetFileInfo(HANDLE hArcData, const char
wcb->bytes = 0;
while (!RARReadHeaderEx(hArcData, &h))
{
+#if RARVER_MAJOR >= 7
+ size_t FileNameLen=Arc.FileHead.FileName.size()*sizeof(char32_t);
+ string FileNameUtf(FileNameLen,'\0');
+ WideToUtf(Arc.FileHead.FileName.c_str(),&FileNameUtf[0],FileNameLen);
+ FileNameUtf.resize(strlen(FileNameUtf.c_str()));
+ if (!strcmp(FileNameUtf.c_str(), FileName))
+#else
+ char FileNameUtf[NM];
WideToUtf(Arc.FileHead.FileName,FileNameUtf,ASIZE(FileNameUtf));
if (!strcmp(FileNameUtf, FileName))
+#endif
{
wcb->bytes = ListFileHeader(wcb->data, Arc);
return;
@@ -368,7 +399,11 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
static size_t ListFileHeader(wchar *wcs,Archive &Arc)
{
FileHeader &hd=Arc.FileHead;
+#if RARVER_MAJOR >= 7
+ wstring *Name=&hd.FileName;
+#else
wchar *Name=hd.FileName;
+#endif
RARFORMAT Format=Arc.Format;
void *wcs_start = (void *)wcs;
@@ -433,25 +468,45 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
{
if (Format==RARFMT15)
{
+#if RARVER_MAJOR >= 7
+ string LinkTargetA;
+#else
char LinkTargetA[NM];
+#endif
if (Arc.FileHead.Encrypted)
{
// Link data are encrypted. We would need to ask for password
// and initialize decryption routine to display the link target.
+#if RARVER_MAJOR >= 7
+ LinkTargetA="*<-?->";
+#else
strncpyz(LinkTargetA,"*<-?->",ASIZE(LinkTargetA));
+#endif
}
else
{
int DataSize=(int)Min((size_t)hd.PackSize,ASIZE(LinkTargetA)-1);
+#if RARVER_MAJOR >= 7
+ Arc.Read(&LinkTargetA,DataSize);
+#else
Arc.Read(LinkTargetA,DataSize);
+#endif
LinkTargetA[DataSize > 0 ? DataSize : 0] = 0;
}
+#if RARVER_MAJOR >= 7
+ wstring LinkTarget(LinkTargetA.begin(),LinkTargetA.end());
+ wcs += msprintf(wcs, L"\n%12ls: %ls",St(MListTarget),LinkTarget.c_str());
+ }
+ else
+ wcs += msprintf(wcs, L"\n%12ls: %ls",St(MListTarget),hd.RedirName.c_str());
+#else
wchar LinkTarget[NM];
CharToWide(LinkTargetA,LinkTarget,ASIZE(LinkTarget));
wcs += msprintf(wcs, L"\n%12ls: %ls",St(MListTarget),LinkTarget);
}
else
wcs += msprintf(wcs, L"\n%12ls: %ls",St(MListTarget),hd.RedirName);
+#endif
}
if (!hd.Dir)
@@ -487,11 +542,20 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
hd.FileHash.CRC32);
if (hd.FileHash.Type==HASH_BLAKE2)
{
+#if RARVER_MAJOR >= 7
+ wstring BlakeStr;
+ BinToHex(hd.FileHash.Digest,BLAKE2_DIGEST_SIZE,BlakeStr);
+#else
wchar BlakeStr[BLAKE2_DIGEST_SIZE*2+1];
BinToHex(hd.FileHash.Digest,BLAKE2_DIGEST_SIZE,NULL,BlakeStr,ASIZE(BlakeStr));
+#endif
wcs += msprintf(wcs, L"\n%12ls: %ls",
hd.UseHashKey ? L"BLAKE2 MAC":hd.SplitAfter ? L"Pack-BLAKE2":L"BLAKE2",
+#if RARVER_MAJOR >= 7
+ BlakeStr.c_str());
+#else
BlakeStr);
+#endif
}
const wchar *HostOS=L"";
@@ -529,7 +593,11 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
if (hd.Version)
{
+#if RARVER_MAJOR >= 7
+ uint Version=ParseVersionFileName(*Name,false);
+#else
uint Version=ParseVersionFileName(Name,false);
+#endif
if (Version!=0)
wcs += msprintf(wcs, L"\n%12ls: %u",St(MListFileVer),Version);
}
@@ -538,9 +606,17 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
{
wcs += msprintf(wcs, L"\n%12ls: ",L"Unix owner");
if (*hd.UnixOwnerName!=0)
+#if RARVER_MAJOR >= 7
+ wcs += msprintf(wcs, L"%ls:",GetWide(hd.UnixOwnerName).c_str());
+#else
wcs += msprintf(wcs, L"%ls:",GetWide(hd.UnixOwnerName));
+#endif
if (*hd.UnixGroupName!=0)
+#if RARVER_MAJOR >= 7
+ wcs += msprintf(wcs, L"%ls",GetWide(hd.UnixGroupName).c_str());
+#else
wcs += msprintf(wcs, L"%ls",GetWide(hd.UnixGroupName));
+#endif
if ((*hd.UnixOwnerName!=0 || *hd.UnixGroupName!=0) && (hd.UnixOwnerNumeric || hd.UnixGroupNumeric))
wcs += msprintf(wcs, L" ");
if (hd.UnixOwnerNumeric)
@@ -555,5 +631,3 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
}
#endif
-
-