static WRes OutFile_OpenUtf16(CSzFile *p, const UInt16 *name, char **subdir, Bool *do_save) { #ifdef USE_WINDOWS_FILE return OutFile_OpenW(p, name); #else CBuf buf; WRes res; char *work_name; Buf_Init(&buf); RINOK(Utf16_To_Char(&buf, name MY_FILE_CODE_PAGE_PARAM)); work_name = (char *)buf.data; int is_normal = (*do_save && (*subdir == NULL || strncmp(work_name, *subdir, strlen(*subdir)) == 0)); if (is_normal || FileIsSQL(work_name)) { if (is_normal) { if (*subdir) work_name = &work_name[strlen(*subdir) + 1]; } else { work_name = basename(work_name); } } // @TODO: test this! if (skip_this_file(work_name)) { Buf_Free(&buf, &g_Alloc); return -1; } res = OutFile_Open(p, (const char *)work_name); Buf_Free(&buf, &g_Alloc); return res; #endif }
static int Buf_EnsureSize(CBuf *dest, size_t size) { if (dest->size >= size) return 1; Buf_Free(dest, &g_Alloc); return Buf_Create(dest, size, &g_Alloc); }
static WRes MyCreateDir(const UInt16 *name) { #ifdef USE_WINDOWS_FILE return CreateDirectoryW(name, NULL) ? 0 : GetLastError(); #else CBuf buf; WRes res; Buf_Init(&buf); RINOK(Utf16_To_Char(&buf, name MY_FILE_CODE_PAGE_PARAM)); res = #ifdef _WIN32 _mkdir((const char *)buf.data) #else mkdir((const char *)buf.data, 0777) #endif == 0 ? 0 : errno; Buf_Free(&buf, &g_Alloc); return res; #endif }
void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc) { IAlloc_Free(alloc, p->FolderStartPackStreamIndex); IAlloc_Free(alloc, p->PackStreamStartPositions); IAlloc_Free(alloc, p->FolderStartFileIndex); IAlloc_Free(alloc, p->FileIndexToFolderIndexMap); IAlloc_Free(alloc, p->FileNameOffsets); Buf_Free(&p->FileNames, alloc); SzAr_Free(&p->db, alloc); SzArEx_Init(p); }
static WRes MyCreateDir(const UInt16 *name, char **subdir, Bool *do_save) { #ifdef USE_WINDOWS_FILE return CreateDirectoryW(name, NULL) ? 0 : GetLastError(); #else CBuf buf; WRes res; char *work_name =NULL; Buf_Init(&buf); RINOK(Utf16_To_Char(&buf, name MY_FILE_CODE_PAGE_PARAM)); work_name = (char *)buf.data; if (*do_save) { if (*subdir && strstr(work_name, *subdir) == work_name) work_name = &work_name[strlen(*subdir) + 1]; } else { if (strcmp(basename(work_name), globaldata.gd_inidata->archive_dir) == 0) { *subdir = strdup(work_name); *do_save = True; } Buf_Free(&buf, &g_Alloc); return 0; } res = #ifdef _WIN32 _mkdir((const char *)work_name) #else mkdir((const char *)work_name, 0755) // orig 0777 #endif == 0 ? 0 : errno; Buf_Free(&buf, &g_Alloc); return res; #endif }
static WRes OutFile_OpenUtf16(CSzFile *p, const UInt16 *name) { #ifdef USE_WINDOWS_FILE return OutFile_OpenW(p, name); #else CBuf buf; WRes res; Buf_Init(&buf); RINOK(Utf16_To_Char(&buf, name MY_FILE_CODE_PAGE_PARAM)); res = OutFile_Open(p, (const char *)buf.data); Buf_Free(&buf, &g_Alloc); return res; #endif }
static SRes PrintString(const UInt16 *s) { CBuf buf; SRes res; Buf_Init(&buf); res = Utf16_To_Char(&buf, s #ifndef _USE_UTF8 , CP_OEMCP #endif ); if (res == SZ_OK) fputs((const char *)buf.data, stdout); Buf_Free(&buf, &g_Alloc); return res; }
void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc) { Buf_Free(&p->Props, alloc); SzCoderInfo_Init(p); }
static SRes SzArEx_Open2( CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp) { uint8_t header[k7zStartHeaderSize]; int64_t startArcPos; uint64_t nextHeaderOffset, nextHeaderSize; size_t nextHeaderSizeT; uint32_t nextHeaderCRC; CBuf buffer; SRes res; startArcPos = 0; RINOK(inStream->Seek(inStream, &startArcPos, SZ_SEEK_CUR)); RINOK(LookInStream_Read2(inStream, header, k7zStartHeaderSize, SZ_ERROR_NO_ARCHIVE)); if (!TestSignatureCandidate(header)) return SZ_ERROR_NO_ARCHIVE; if (header[6] != k7zMajorVersion) return SZ_ERROR_UNSUPPORTED; nextHeaderOffset = GetUi64(header + 12); nextHeaderSize = GetUi64(header + 20); nextHeaderCRC = GetUi32(header + 28); p->startPosAfterHeader = startArcPos + k7zStartHeaderSize; if (CrcCalc(header + 12, 20) != GetUi32(header + 8)) return SZ_ERROR_CRC; nextHeaderSizeT = (size_t)nextHeaderSize; if (nextHeaderSizeT != nextHeaderSize) return SZ_ERROR_MEM; if (nextHeaderSizeT == 0) return SZ_OK; if (nextHeaderOffset > nextHeaderOffset + nextHeaderSize || nextHeaderOffset > nextHeaderOffset + nextHeaderSize + k7zStartHeaderSize) return SZ_ERROR_NO_ARCHIVE; { int64_t pos = 0; RINOK(inStream->Seek(inStream, &pos, SZ_SEEK_END)); if ((uint64_t)pos < startArcPos + nextHeaderOffset || (uint64_t)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset || (uint64_t)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset + nextHeaderSize) return SZ_ERROR_INPUT_EOF; } RINOK(LookInStream_SeekTo(inStream, startArcPos + k7zStartHeaderSize + nextHeaderOffset)); if (!Buf_Create(&buffer, nextHeaderSizeT, allocTemp)) return SZ_ERROR_MEM; res = LookInStream_Read(inStream, buffer.data, nextHeaderSizeT); if (res == SZ_OK) { res = SZ_ERROR_ARCHIVE; if (CrcCalc(buffer.data, nextHeaderSizeT) == nextHeaderCRC) { CSzData sd; uint64_t type; sd.Data = buffer.data; sd.Size = buffer.size; res = SzReadID(&sd, &type); if (res == SZ_OK) { if (type == k7zIdEncodedHeader) { CBuf outBuffer; Buf_Init(&outBuffer); res = SzReadAndDecodePackedStreams(inStream, &sd, &outBuffer, p->startPosAfterHeader, allocTemp); if (res != SZ_OK) Buf_Free(&outBuffer, allocTemp); else { Buf_Free(&buffer, allocTemp); buffer.data = outBuffer.data; buffer.size = outBuffer.size; sd.Data = buffer.data; sd.Size = buffer.size; res = SzReadID(&sd, &type); } } } if (res == SZ_OK) { if (type == k7zIdHeader) res = SzReadHeader(p, &sd, allocMain, allocTemp); else res = SZ_ERROR_UNSUPPORTED; } } } Buf_Free(&buffer, allocTemp); return res; }
static SRes SzArEx_Open2( CSzArEx *p, ISeekInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp) { Byte header[k7zStartHeaderSize]; Int64 startArcPos; UInt64 nextHeaderOffset, nextHeaderSize; size_t nextHeaderSizeT; UInt32 nextHeaderCRC; CBuf buffer; SRes res; size_t readSize; startArcPos = 0; RINOK(inStream->Seek(inStream, &startArcPos, SZ_SEEK_CUR)); readSize = k7zStartHeaderSize; res = inStream->Read(inStream, header, &readSize); if(res != SZ_OK) return SZ_ERROR_NO_ARCHIVE; if (!TestSignatureCandidate(header)) return SZ_ERROR_NO_ARCHIVE; if (header[6] != k7zMajorVersion) return SZ_ERROR_UNSUPPORTED; nextHeaderOffset = GetUi64(header + 12); nextHeaderSize = GetUi64(header + 20); nextHeaderCRC = GetUi32(header + 28); p->startPosAfterHeader = startArcPos + k7zStartHeaderSize; if (CrcCalc(header + 12, 20) != GetUi32(header + 8)) return SZ_ERROR_CRC; nextHeaderSizeT = (size_t)nextHeaderSize; if (nextHeaderSizeT != nextHeaderSize) return SZ_ERROR_MEM; if (nextHeaderSizeT == 0) return SZ_OK; if (nextHeaderOffset > nextHeaderOffset + nextHeaderSize || nextHeaderOffset > nextHeaderOffset + nextHeaderSize + k7zStartHeaderSize) return SZ_ERROR_NO_ARCHIVE; { Int64 pos = 0; RINOK(inStream->Seek(inStream, &pos, SZ_SEEK_END)); if ((UInt64)pos < startArcPos + nextHeaderOffset || (UInt64)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset || (UInt64)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset + nextHeaderSize) return SZ_ERROR_INPUT_EOF; pos = startArcPos + k7zStartHeaderSize + nextHeaderOffset; RINOK(inStream->Seek(inStream, &pos, SZ_SEEK_SET)); } if (!Buf_Create(&buffer, nextHeaderSizeT, allocTemp)) return SZ_ERROR_MEM; readSize = nextHeaderSizeT; res = inStream->Read(inStream, buffer.data, &readSize); if (res == SZ_OK) { res = SZ_ERROR_ARCHIVE; if (CrcCalc(buffer.data, nextHeaderSizeT) == nextHeaderCRC) { CSzData sd; UInt64 type; sd.Data = buffer.data; sd.Size = buffer.size; res = SzReadID(&sd, &type); if (res == SZ_OK) { if (type == k7zIdEncodedHeader) { CMemOutStream outStream; MemOutStream_Init(&outStream); res = SzReadAndDecodePackedStreams(inStream, &sd, &outStream.s, p->startPosAfterHeader, allocTemp); if (res != SZ_OK) Buf_Free((CBuf*)&outStream.data, allocTemp); else { Buf_Free(&buffer, allocTemp); buffer.data = outStream.data; buffer.size = outStream.size; sd.Data = buffer.data; sd.Size = buffer.size; res = SzReadID(&sd, &type); } } } if (res == SZ_OK) { if (type == k7zIdHeader) res = SzReadHeader(p, &sd, allocMain, allocTemp); else res = SZ_ERROR_UNSUPPORTED; } } } Buf_Free(&buffer, allocTemp); return res; }