summaryrefslogtreecommitdiff
path: root/sysutils/fusefs-rar2fs/files/patch-src_dllext.cpp
blob: e3a8682f763a5a338f8bd5acf22e62ce3db9ba09 (plain) (blame)
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
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
-
-