summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastien Barre <sebastien.barre@kitware.com>2002-04-14 19:32:16 (GMT)
committerSebastien Barre <sebastien.barre@kitware.com>2002-04-14 19:32:16 (GMT)
commit36189ce2a87f24617d22ee52cde7ad143577f805 (patch)
treeee8364c64899304863e368741d14ef89188bbbb4
parentc3c4e415bbdb9953e087d0b27946498045cadb94 (diff)
downloadCMake-36189ce2a87f24617d22ee52cde7ad143577f805.zip
CMake-36189ce2a87f24617d22ee52cde7ad143577f805.tar.gz
CMake-36189ce2a87f24617d22ee52cde7ad143577f805.tar.bz2
ENH: more paranoid checkings
-rw-r--r--Source/cmSystemTools.cxx87
1 files changed, 64 insertions, 23 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 7c43794..25bea73 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -970,8 +970,10 @@ bool cmSystemTools::FilesDiffer(const char* source,
}
#if defined(_WIN32) || defined(__CYGWIN__)
- std::ifstream finSource(source, std::ios::binary | std::ios::in);
- std::ifstream finDestination(destination, std::ios::binary | std::ios::in);
+ std::ifstream finSource(source,
+ std::ios::binary | std::ios::in);
+ std::ifstream finDestination(destination,
+ std::ios::binary | std::ios::in);
#else
std::ifstream finSource(source);
std::ifstream finDestination(destination);
@@ -982,7 +984,19 @@ bool cmSystemTools::FilesDiffer(const char* source,
}
char* source_buf = new char[statSource.st_size];
+ if (!source_buf)
+ {
+ cmSystemTools::Error("FilesDiffer failed to allocate memory for source!");
+ return false;
+ }
+
char* dest_buf = new char[statSource.st_size];
+ if (!dest_buf)
+ {
+ cmSystemTools::Error("FilesDiffer failed to allocate memory for dest!");
+ delete [] source_buf;
+ return false;
+ }
finSource.read(source_buf, statSource.st_size);
finDestination.read(dest_buf, statSource.st_size);
@@ -990,12 +1004,17 @@ bool cmSystemTools::FilesDiffer(const char* source,
if(statSource.st_size != finSource.gcount() ||
statSource.st_size != finDestination.gcount())
{
- cmSystemTools::Error("FilesDiffer failed reading files!");
- delete [] dest_buf;
+ char msg[256];
+ sprintf(msg, "FilesDiffer failed to read files (allocated: %lu, source: %lu, dest: %lu)", statSource.st_size, finSource.gcount(), finDestination.gcount());
+ cmSystemTools::Error(msg);
delete [] source_buf;
+ delete [] dest_buf;
return false;
}
+ finSource.close();
+ finDestination.close();
+
int ret = memcmp((const void*)source_buf,
(const void*)dest_buf,
statSource.st_size);
@@ -1016,23 +1035,9 @@ void cmSystemTools::cmCopyFile(const char* source,
const int bufferSize = 4096;
char buffer[bufferSize];
-#if defined(_WIN32) || defined(__CYGWIN__)
- std::ifstream fin(source, std::ios::binary | std::ios::in);
-#else
- std::ifstream fin(source);
-#endif
- if(!fin)
- {
- cmSystemTools::Error("CopyFile failed to open input file \"",
- source, "\"");
- return;
- }
-
// If destination is a directory, try to create a file with the same
// name as the source in that directory.
- const char* dest = destination;
-
std::string new_destination;
if(cmSystemTools::FileExists(destination) &&
cmSystemTools::FileIsDirectory(destination))
@@ -1042,24 +1047,41 @@ void cmSystemTools::cmCopyFile(const char* source,
new_destination += '/';
std::string source_name = source;
new_destination += cmSystemTools::GetFilenameName(source_name);
- dest = new_destination.c_str();
+ destination = new_destination.c_str();
}
// Create destination directory
- std::string destination_dir = dest;
+ std::string destination_dir = destination;
destination_dir = cmSystemTools::GetFilenamePath(destination_dir);
cmSystemTools::MakeDirectory(destination_dir.c_str());
+ // Open files
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+ std::ifstream fin(source,
+ std::ios::binary | std::ios::in);
+#else
+ std::ifstream fin(source);
+#endif
+ if(!fin)
+ {
+ cmSystemTools::Error("CopyFile failed to open input file \"",
+ source, "\"");
+ return;
+ }
+
#if defined(_WIN32) || defined(__CYGWIN__)
- std::ofstream fout(dest, std::ios::binary | std::ios::out | std::ios::trunc);
+ std::ofstream fout(destination,
+ std::ios::binary | std::ios::out | std::ios::trunc);
#else
- std::ofstream fout(dest, std::ios::out | std::ios::trunc);
+ std::ofstream fout(destination,
+ std::ios::out | std::ios::trunc);
#endif
if(!fout)
{
cmSystemTools::Error("CopyFile failed to open output file \"",
- dest, "\"");
+ destination, "\"");
return;
}
@@ -1076,6 +1098,25 @@ void cmSystemTools::cmCopyFile(const char* source,
fout.write(buffer, fin.gcount());
}
}
+
+ fin.close();
+ fout.close();
+
+ // More checks
+
+ struct stat statSource, statDestination;
+ if (stat(source, &statSource) != 0 ||
+ stat(destination, &statDestination) != 0)
+ {
+ cmSystemTools::Error("CopyFile failed to copy files!");
+ }
+
+ if (statSource.st_size != statDestination.st_size)
+ {
+ char msg[256];
+ sprintf(msg, "CopyFile failed to copy files (sizes differ, source: %lu, dest: %lu)", statSource.st_size, statDestination.st_size);
+ cmSystemTools::Error(msg);
+ }
}
// return true if the file exists