#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#if !defined(WIN32)
+#if !defined(_WIN32)
# include <dirent.h>
# include <sys/stat.h>
# include <sys/types.h>
#include "raw.h"
#include "mszip.h"
-#if defined(WIN32)
+#if defined(_WIN32)
#define GetSizeOfFile(handle) _GetSizeOfFile(handle)
static LONG _GetSizeOfFile(FILEHANDLE handle)
{
}
-ULONG CCFDATAStorage::Create(const char* FileName)
+ULONG CCFDATAStorage::Create()
/*
* FUNCTION: Creates the file
* ARGUMENTS:
* Status of operation
*/
{
+#if defined(_WIN32)
+ char tmpPath[MAX_PATH];
+#endif
ASSERT(!FileCreated);
-#if defined(WIN32)
- if (GetTempPath(MAX_PATH, FullName) == 0)
+#if defined(_WIN32)
+ if (GetTempPath(MAX_PATH, tmpPath) == 0)
+ return CAB_STATUS_CANNOT_CREATE;
+ if(GetTempFileName(tmpPath, "cab", 0, FullName) == 0)
return CAB_STATUS_CANNOT_CREATE;
-
- strcat(FullName, FileName);
/* Create file, overwrite if it already exists */
FileHandle = CreateFile(FullName, // Create this file
DPRINT(MID_TRACE, ("ERROR '%u'.\n", (UINT)GetLastError()));
return CAB_STATUS_CANNOT_CREATE;
}
-#else /* !WIN32 */
+#else /* !_WIN32 */
/*if (tmpnam(FullName) == NULL)*/
if ((FileHandle = tmpfile()) == NULL)
return CAB_STATUS_CANNOT_CREATE;
* Status of operation
*/
{
-#if defined(WIN32)
+#if defined(_WIN32)
if( SetFilePointer(FileHandle, 0, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER )
return CAB_STATUS_FAILURE;
if (!SetEndOfFile(FileHandle))
return CAB_STATUS_FAILURE;
-#else /* !WIN32 */
+#else /* !_WIN32 */
fclose(FileHandle);
FileHandle = tmpfile();
if (FileHandle == NULL)
* Current position
*/
{
-#if defined(WIN32)
+#if defined(_WIN32)
return SetFilePointer(FileHandle, 0, NULL, FILE_CURRENT);
#else
return (ULONG)ftell(FileHandle);
* Status of operation
*/
{
-#if defined(WIN32)
+#if defined(_WIN32)
if( SetFilePointer(FileHandle,
Position,
NULL,
* Status of operation
*/
{
-#if defined(WIN32)
+#if defined(_WIN32)
if (!ReadFile(FileHandle, Buffer, Data->CompSize, (LPDWORD)BytesRead, NULL))
return CAB_STATUS_CANNOT_READ;
#else
* Status of operation
*/
{
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle, Buffer, Data->CompSize, (LPDWORD)BytesWritten, NULL))
return CAB_STATUS_CANNOT_WRITE;
#else
i = 0;
while (Path[i] != 0)
{
-#if defined(WIN32)
+#if defined(_WIN32)
if (Path[i] == '/')
newpath[i] = '\\';
else
strcpy(DestPath, DestinationPath);
ConvertPath(DestPath, false);
if (strlen(DestPath) > 0)
- NormalizePath(DestPath, MAX_PATH);
+ NormalizePath(DestPath, PATH_MAX);
}
ULONG CCabinet::AddSearchCriteria(char* SearchCriteria)
SelectCodec(CAB_CODEC_MSZIP);
else
{
- printf("Invalid codec specified!\n");
+ printf("ERROR: Invalid codec specified!\n");
return false;
}
{
FILEHANDLE FileHandle;
ULONG BytesRead;
+ char* ConvertedFileName;
-#if defined(WIN32)
- FileHandle = CreateFile(ConvertPath(FileName, true), // Open this file
+ ConvertedFileName = ConvertPath(FileName, true);
+#if defined(_WIN32)
+ FileHandle = CreateFile(ConvertedFileName, // Open this file
GENERIC_READ, // Open for reading
FILE_SHARE_READ, // Share for reading
NULL, // No security
OPEN_EXISTING, // Existing file only
FILE_ATTRIBUTE_NORMAL, // Normal file
NULL); // No attribute template
+ free(ConvertedFileName);
if (FileHandle == INVALID_HANDLE_VALUE)
{
DPRINT(MID_TRACE, ("Cannot open cabinet reserved file.\n"));
return false;
}
-#else /* !WIN32 */
- FileHandle = fopen(ConvertPath(FileName, true), "rb");
+#else /* !_WIN32 */
+ FileHandle = fopen(ConvertedFileName, "rb");
+ free(ConvertedFileName);
if (FileHandle == NULL)
{
DPRINT(MID_TRACE, ("Cannot open cabinet reserved file.\n"));
if (!OutputBuffer)
return CAB_STATUS_NOMEMORY;
-#if defined(WIN32)
+#if defined(_WIN32)
FileHandle = CreateFile(CabinetName, // Open this file
GENERIC_READ, // Open for reading
FILE_SHARE_READ, // Share for reading
DPRINT(MID_TRACE, ("Cannot open file.\n"));
return CAB_STATUS_CANNOT_OPEN;
}
-#else /* !WIN32 */
+#else /* !_WIN32 */
FileHandle = fopen(CabinetName, "rb");
if (FileHandle == NULL)
{
FolderReserved = (Size >> 16) & 0xFF;
DataReserved = (Size >> 24) & 0xFF;
-#if defined(WIN32)
+#if defined(_WIN32)
if (SetFilePointer(FileHandle, CabinetReserved, NULL, FILE_CURRENT) == INVALID_SET_FILE_POINTER)
{
DPRINT(MIN_TRACE, ("SetFilePointer() failed, error code is %u.\n", (UINT)GetLastError()));
CFDATA CFData;
ULONG Status;
bool Skip;
-#if defined(WIN32)
+#if defined(_WIN32)
FILETIME FileTime;
#endif
- CHAR DestName[MAX_PATH];
- CHAR TempName[MAX_PATH];
+ CHAR DestName[PATH_MAX];
+ CHAR TempName[PATH_MAX];
Status = LocateFile(FileName, &File);
if (Status != CAB_STATUS_SUCCESS)
strcat(DestName, FileName);
/* Create destination file, fail if it already exists */
-#if defined(WIN32)
+#if defined(_WIN32)
DestFile = CreateFile(DestName, // Create this file
GENERIC_WRITE, // Open for writing
0, // No sharing
return CAB_STATUS_CANNOT_CREATE;
}
}
-#else /* !WIN32 */
+#else /* !_WIN32 */
DestFile = fopen(DestName, "rb");
if (DestFile != NULL)
{
return CAB_STATUS_CANNOT_CREATE;
}
#endif
-#if defined(WIN32)
+#if defined(_WIN32)
if (!DosDateTimeToFileTime(File->File.FileDate, File->File.FileTime, &FileTime))
{
CloseFile(DestFile);
OnExtract(&File->File, FileName);
/* Search to start of file */
-#if defined(WIN32)
+#if defined(_WIN32)
Offset = SetFilePointer(FileHandle,
File->DataBlock->AbsoluteOffset,
NULL,
if (Offset == INVALID_SET_FILE_POINTER)
{
DPRINT(MIN_TRACE, ("SetFilePointer() failed, error code is %u.\n", (UINT)GetLastError()));
+ CloseFile(DestFile);
return CAB_STATUS_INVALID_CAB;
}
#else
if (fseek(FileHandle, (off_t)File->DataBlock->AbsoluteOffset, SEEK_SET) != 0)
{
DPRINT(MIN_TRACE, ("fseek() failed.\n"));
+ CloseFile(DestFile);
return CAB_STATUS_FAILURE;
}
Offset = ftell(FileHandle);
File->DataBlock = CurrentFolderNode->DataListHead;
/* Search to start of file */
-#if defined(WIN32)
+#if defined(_WIN32)
if( SetFilePointer(FileHandle,
File->DataBlock->AbsoluteOffset,
NULL,
CFData.CompSize, CFData.UncompSize));
/* Go to next data block */
-#if defined(WIN32)
+#if defined(_WIN32)
if( SetFilePointer(FileHandle,
CurrentDataNode->AbsoluteOffset + sizeof(CFDATA) +
CurrentDataNode->Data.CompSize,
(UINT)BytesSkipped, (UINT)Skip,
(UINT)Size));
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(DestFile, (void*)((PUCHAR)OutputBuffer + BytesSkipped),
BytesToWrite, (LPDWORD)&BytesWritten, NULL) ||
(BytesToWrite != BytesWritten))
return CAB_STATUS_NOMEMORY;
}
- Status = ScratchFile->Create("~CAB.tmp");
+ Status = ScratchFile->Create();
CreateNewFolder = false;
if (!ContinueFile)
{
/* Try to open file */
-#if defined(WIN32)
+#if defined(_WIN32)
SourceFile = CreateFile(
FileNode->FileName, // Open this file
GENERIC_READ, // Open for reading
DPRINT(MID_TRACE, ("File not found (%s).\n", FileNode->FileName));
return CAB_STATUS_NOFILE;
}
-#else /* !WIN32 */
+#else /* !_WIN32 */
SourceFile = fopen(FileNode->FileName, "rb");
if (SourceFile == NULL)
{
OnCabinetName(CurrentDiskNumber, CabinetName);
/* Create file, fail if it already exists */
-#if defined(WIN32)
+#if defined(_WIN32)
FileHandle = CreateFile(CabinetName, // Create this file
GENERIC_WRITE, // Open for writing
0, // No sharing
return CAB_STATUS_CANNOT_CREATE;
}
}
-#else /* !WIN32 */
+#else /* !_WIN32 */
FileHandle = fopen(CabinetName, "rb");
if (FileHandle != NULL)
{
ConvertPath(NewFileName, false);
/* Try to open file */
-#if defined(WIN32)
+#if defined(_WIN32)
SrcFile = CreateFile(
NewFileName, // Open this file
GENERIC_READ, // Open for reading
FreeMemory(NewFileName);
return CAB_STATUS_CANNOT_OPEN;
}
-#else /* !WIN32 */
+#else /* !_WIN32 */
SrcFile = fopen(NewFileName, "rb");
if (SrcFile == NULL)
{
{
DPRINT(MIN_TRACE, ("Insufficient memory.\n"));
FreeMemory(NewFileName);
+ CloseFile(SrcFile);
return CAB_STATUS_NOMEMORY;
}
{
DPRINT(MIN_TRACE, ("Cannot read from file.\n"));
FreeMemory(NewFileName);
+ CloseFile(SrcFile);
return CAB_STATUS_CANNOT_READ;
}
{
DPRINT(MIN_TRACE, ("Cannot read file times.\n"));
FreeMemory(NewFileName);
+ CloseFile(SrcFile);
return CAB_STATUS_CANNOT_READ;
}
{
DPRINT(MIN_TRACE, ("Cannot read file attributes.\n"));
FreeMemory(NewFileName);
+ CloseFile(SrcFile);
return CAB_STATUS_CANNOT_READ;
}
{
bool bRet = false;
char* pszFile;
- char szFilePath[MAX_PATH];
- char szFile[MAX_PATH];
+ char szFilePath[PATH_MAX];
+ char szFile[PATH_MAX];
PSEARCH_CRITERIA Criteria;
ULONG Status;
-#if defined(WIN32)
+#if defined(_WIN32)
HANDLE hFind;
WIN32_FIND_DATA FindFileData;
#else
if (Status != CAB_STATUS_SUCCESS)
{
DPRINT(MIN_TRACE, ("Cannot create cabinet (%u).\n", (UINT)Status));
- goto cleanup;
+ goto cleanup2;
}
// Add each file in the criteria list
{
pszFile = Criteria->Search;
-#if defined(WIN32)
+#if defined(_WIN32)
szFilePath[0] = 0;
#else
// needed for opendir()
#endif
}
-#if defined(WIN32)
+#if defined(_WIN32)
// Windows: Use the easy FindFirstFile/FindNextFile API for getting all files and checking them against the pattern
hFind = FindFirstFile(Criteria->Search, &FindFileData);
goto cleanup;
}
+cleanup:
CloseCabinet();
bRet = true;
-cleanup:
+cleanup2:
DestroySearchCriteria();
return bRet;
}
// + 1 to skip the terminating NULL character as well.
Size = -(MaxLength - Size) + 1;
-#if defined(WIN32)
+#if defined(_WIN32)
if( SetFilePointer(FileHandle,
(LONG)Size,
NULL,
(UINT)CABHeader.FileTableOffset));
/* Seek to file table */
-#if defined(WIN32)
+#if defined(_WIN32)
if( SetFilePointer(FileHandle,
CABHeader.FileTableOffset,
NULL,
return CAB_STATUS_INVALID_CAB;
}
- File->FileName = (char*)AllocateMemory(MAX_PATH);
+ File->FileName = (char*)AllocateMemory(PATH_MAX);
if (!File->FileName)
{
DPRINT(MIN_TRACE, ("Insufficient memory.\n"));
}
/* Read file name */
- Status = ReadString(File->FileName, MAX_PATH);
+ Status = ReadString(File->FileName, PATH_MAX);
if (Status != CAB_STATUS_SUCCESS)
return Status;
}
/* Seek to data block */
-#if defined(WIN32)
+#if defined(_WIN32)
if( SetFilePointer(FileHandle,
AbsoluteOffset,
NULL,
retryFileName = FileName;
break;
- case '?':
+ case '?':
if (*FileName++ == '\0')
return false;
CABHeader.CabinetSize = DiskSize;
/* Write header */
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle, &CABHeader, sizeof(CFHEADER), (LPDWORD)&BytesWritten, NULL))
{
DPRINT(MIN_TRACE, ("Cannot write to file.\n"));
ReservedSize = CabinetReservedFileSize & 0xffff;
ReservedSize |= (0 << 16); /* Folder reserved area size */
ReservedSize |= (0 << 24); /* Folder reserved area size */
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle, &ReservedSize, sizeof(ULONG), (LPDWORD)&BytesWritten, NULL))
{
DPRINT(MIN_TRACE, ("Cannot write to file.\n"));
}
#endif
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle, CabinetReservedFileBuffer, CabinetReservedFileSize, (LPDWORD)&BytesWritten, NULL))
{
DPRINT(MIN_TRACE, ("Cannot write to file.\n"));
/* Write name of previous cabinet */
Size = (ULONG)strlen(CabinetPrev) + 1;
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle, CabinetPrev, Size, (LPDWORD)&BytesWritten, NULL))
{
DPRINT(MIN_TRACE, ("Cannot write to file.\n"));
/* Write label of previous disk */
Size = (ULONG)strlen(DiskPrev) + 1;
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle, DiskPrev, Size, (LPDWORD)&BytesWritten, NULL))
{
DPRINT(MIN_TRACE, ("Cannot write to file.\n"));
/* Write name of next cabinet */
Size = (ULONG)strlen(CabinetNext) + 1;
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle, CabinetNext, Size, (LPDWORD)&BytesWritten, NULL))
{
DPRINT(MIN_TRACE, ("Cannot write to file.\n"));
/* Write label of next disk */
Size = (ULONG)strlen(DiskNext) + 1;
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle, DiskNext, Size, (LPDWORD)&BytesWritten, NULL))
{
DPRINT(MIN_TRACE, ("Cannot write to file.\n"));
DPRINT(MAX_TRACE, ("Writing folder entry. CompressionType (0x%X) DataBlockCount (%d) DataOffset (0x%X).\n",
FolderNode->Folder.CompressionType, FolderNode->Folder.DataBlockCount, (UINT)FolderNode->Folder.DataOffset));
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle,
&FolderNode->Folder,
sizeof(CFFOLDER),
DPRINT(MAX_TRACE, ("Writing file entry. FileControlID (0x%X) FileOffset (0x%X) FileSize (%u) FileName (%s).\n",
File->File.FileControlID, (UINT)File->File.FileOffset, (UINT)File->File.FileSize, File->FileName));
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle,
&File->File,
sizeof(CFFILE),
}
#endif
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle,
GetFileName(File->FileName),
(DWORD)strlen(GetFileName(File->FileName)) + 1,
return Status;
}
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle, &DataNode->Data,
sizeof(CFDATA), (LPDWORD)&BytesWritten, NULL))
{
}
#endif
-#if defined(WIN32)
+#if defined(_WIN32)
if (!WriteFile(FileHandle, InputBuffer,
DataNode->Data.CompSize, (LPDWORD)&BytesWritten, NULL))
{
return CAB_STATUS_SUCCESS;
}
-#if !defined(WIN32)
+#if !defined(_WIN32)
void CCabinet::ConvertDateAndTime(time_t* Time,
PUSHORT DosDate,
| (timedef->tm_hour << 11);
}
-#endif // !WIN32
+#endif // !_WIN32
ULONG CCabinet::GetFileTimes(FILEHANDLE FileHandle, PCFFILE_NODE File)
* Status of operation
*/
{
-#if defined(WIN32)
+#if defined(_WIN32)
FILETIME FileTime;
if (GetFileTime(FileHandle, NULL, NULL, &FileTime))
&File->File.FileTime);
#else
struct stat stbuf;
- char buf[MAX_PATH];
+ char buf[PATH_MAX];
// Check for an absolute path
if (IsSeparator(File->FileName[0]))
* Status of operation
*/
{
-#if defined(WIN32)
+#if defined(_WIN32)
LONG Attributes;
Attributes = GetFileAttributes(File->FileName);
File->File.Attributes = (USHORT)(Attributes & 0x37);
#else
struct stat stbuf;
- char buf[MAX_PATH];
+ char buf[PATH_MAX];
// Check for an absolute path
if (IsSeparator(File->FileName[0]))
* Status of operation
*/
{
-#if defined(WIN32)
+#if defined(_WIN32)
// 0x37 = READONLY | HIDDEN | SYSTEM | DIRECTORY | ARCHIVE
// The IDs for these attributes are the same in the CAB file and under Windows
// If the file has any other attributes, strip them off by the logical AND.