[CABMAN]
[reactos.git] / reactos / tools / cabman / cabinet.cxx
index 7cc8bd5..0f23b07 100644 (file)
@@ -115,7 +115,7 @@ CCFDATAStorage::~CCFDATAStorage()
 }
 
 
-ULONG CCFDATAStorage::Create(const char* FileName)
+ULONG CCFDATAStorage::Create()
 /*
  * FUNCTION: Creates the file
  * ARGUMENTS:
@@ -124,13 +124,16 @@ ULONG CCFDATAStorage::Create(const char* FileName)
  *     Status of operation
  */
 {
+#if defined(_WIN32)
+    char tmpPath[MAX_PATH];
+#endif
     ASSERT(!FileCreated);
 
 #if defined(_WIN32)
-    if (GetTempPath(MAX_PATH, FullName) == 0)
+    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
@@ -512,7 +515,7 @@ void CCabinet::SetDestinationPath(char* DestinationPath)
     strcpy(DestPath, DestinationPath);
     ConvertPath(DestPath, false);
     if (strlen(DestPath) > 0)
-        NormalizePath(DestPath, MAX_PATH);
+        NormalizePath(DestPath, PATH_MAX);
 }
 
 ULONG CCabinet::AddSearchCriteria(char* SearchCriteria)
@@ -604,7 +607,7 @@ bool CCabinet::SetCompressionCodec(char* CodecName)
         SelectCodec(CAB_CODEC_MSZIP);
     else
     {
-        printf("Invalid codec specified!\n");
+        printf("ERROR: Invalid codec specified!\n");
         return false;
     }
 
@@ -631,22 +634,26 @@ bool CCabinet::SetCabinetReservedFile(char* FileName)
 {
     FILEHANDLE FileHandle;
     ULONG BytesRead;
+    char* ConvertedFileName;
 
+    ConvertedFileName = ConvertPath(FileName, true);
 #if defined(_WIN32)
-    FileHandle = CreateFile(ConvertPath(FileName, true),  // Open this file
+    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");
+    FileHandle = fopen(ConvertedFileName, "rb");
+    free(ConvertedFileName);
     if (FileHandle == NULL)
     {
         DPRINT(MID_TRACE, ("Cannot open cabinet reserved file.\n"));
@@ -1030,8 +1037,8 @@ ULONG CCabinet::ExtractFile(char* FileName)
 #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)
@@ -1155,12 +1162,14 @@ ULONG CCabinet::ExtractFile(char* FileName)
     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);
@@ -1527,7 +1536,7 @@ ULONG CCabinet::NewCabinet()
         return CAB_STATUS_NOMEMORY;
     }
 
-    Status = ScratchFile->Create("~CAB.tmp");
+    Status = ScratchFile->Create();
 
     CreateNewFolder = false;
 
@@ -2039,6 +2048,7 @@ ULONG CCabinet::AddFile(char* FileName)
     {
         DPRINT(MIN_TRACE, ("Insufficient memory.\n"));
         FreeMemory(NewFileName);
+        CloseFile(SrcFile);
         return CAB_STATUS_NOMEMORY;
     }
 
@@ -2051,6 +2061,7 @@ ULONG CCabinet::AddFile(char* FileName)
     {
         DPRINT(MIN_TRACE, ("Cannot read from file.\n"));
         FreeMemory(NewFileName);
+        CloseFile(SrcFile);
         return CAB_STATUS_CANNOT_READ;
     }
 
@@ -2058,6 +2069,7 @@ ULONG CCabinet::AddFile(char* FileName)
     {
         DPRINT(MIN_TRACE, ("Cannot read file times.\n"));
         FreeMemory(NewFileName);
+        CloseFile(SrcFile);
         return CAB_STATUS_CANNOT_READ;
     }
 
@@ -2065,6 +2077,7 @@ ULONG CCabinet::AddFile(char* FileName)
     {
         DPRINT(MIN_TRACE, ("Cannot read file attributes.\n"));
         FreeMemory(NewFileName);
+        CloseFile(SrcFile);
         return CAB_STATUS_CANNOT_READ;
     }
 
@@ -2080,8 +2093,8 @@ bool CCabinet::CreateSimpleCabinet()
 {
     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;
 
@@ -2099,7 +2112,7 @@ bool CCabinet::CreateSimpleCabinet()
     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
@@ -2211,10 +2224,11 @@ bool CCabinet::CreateSimpleCabinet()
         goto cleanup;
     }
 
+cleanup:
     CloseCabinet();
     bRet = true;
 
-cleanup:
+cleanup2:
     DestroySearchCriteria();
     return bRet;
 }
@@ -2548,7 +2562,7 @@ ULONG CCabinet::ReadFileTable()
             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"));
@@ -2556,7 +2570,7 @@ ULONG CCabinet::ReadFileTable()
         }
 
         /* Read file name */
-        Status = ReadString(File->FileName, MAX_PATH);
+        Status = ReadString(File->FileName, PATH_MAX);
         if (Status != CAB_STATUS_SUCCESS)
             return Status;
 
@@ -3648,7 +3662,7 @@ ULONG CCabinet::GetFileTimes(FILEHANDLE FileHandle, PCFFILE_NODE File)
             &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]))
@@ -3692,7 +3706,7 @@ ULONG CCabinet::GetAttributesOnFile(PCFFILE_NODE File)
     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]))