aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QUtil.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2017-07-30 02:19:54 +0200
committerJay Berkenbilt <ejb@ql.org>2017-07-30 02:58:01 +0200
commit5993c3e83c6f83b36045c75a03ffb1da3d1d283c (patch)
tree8854661becc586fff8ba07a99d616153f508d43a /libqpdf/QUtil.cc
parent885b8781cccdc9d4402af58176e826a354b5ef7a (diff)
downloadqpdf-5993c3e83c6f83b36045c75a03ffb1da3d1d283c.tar.zst
Detect input file = output file (fixes #29)
Diffstat (limited to 'libqpdf/QUtil.cc')
-rw-r--r--libqpdf/QUtil.cc50
1 files changed, 50 insertions, 0 deletions
diff --git a/libqpdf/QUtil.cc b/libqpdf/QUtil.cc
index 86de07f2..eed8d276 100644
--- a/libqpdf/QUtil.cc
+++ b/libqpdf/QUtil.cc
@@ -24,6 +24,7 @@
#include <io.h>
#else
#include <unistd.h>
+#include <sys/stat.h>
#endif
std::string
@@ -188,6 +189,55 @@ QUtil::tell(FILE* stream)
#endif
}
+bool
+QUtil::same_file(char const* name1, char const* name2)
+{
+ if ((name1 == 0) || (strlen(name1) == 0) ||
+ (name2 == 0) || (strlen(name2) == 0))
+ {
+ return false;
+ }
+#ifdef _WIN32
+ HANDLE fh1 = CreateFile(name1, GENERIC_READ, FILE_SHARE_READ,
+ NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ HANDLE fh2 = CreateFile(name2, GENERIC_READ, FILE_SHARE_READ,
+ NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ BY_HANDLE_FILE_INFORMATION fi1;
+ BY_HANDLE_FILE_INFORMATION fi2;
+ bool same = false;
+ if ((fh1 != INVALID_HANDLE_VALUE) &&
+ (fh2 != INVALID_HANDLE_VALUE) &&
+ GetFileInformationByHandle(fh1, &fi1) &&
+ GetFileInformationByHandle(fh2, &fi2) &&
+ (fi1.dwVolumeSerialNumber == fi2.dwVolumeSerialNumber) &&
+ (fi1.nFileIndexLow == fi2.nFileIndexLow) &&
+ (fi1.nFileIndexHigh == fi2.nFileIndexHigh))
+ {
+ same = true;
+ }
+ if (fh1 != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(fh1);
+ }
+ if (fh2 != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(fh2);
+ }
+ return same;
+#else
+ struct stat st1;
+ struct stat st2;
+ if ((stat(name1, &st1) == 0) &&
+ (stat(name2, &st2) == 0) &&
+ (st1.st_ino == st2.st_ino) &&
+ (st1.st_dev == st2.st_dev))
+ {
+ return true;
+ }
+#endif
+ return false;
+}
+
char*
QUtil::copy_string(std::string const& str)
{