diff --git a/SystemTools.cxx b/SystemTools.cxx index 97dd4ae57b7faf3218a7e5bb6d3de1954f60c12b..8c82ec17b54b6ca4f8bd8142065889243c9bba66 100644 --- a/SystemTools.cxx +++ b/SystemTools.cxx @@ -3067,6 +3067,28 @@ bool SystemTools::FileIsSymlink(const std::string& name) #endif } +bool SystemTools::FileIsFIFO(const std::string& name) +{ +#if defined(_WIN32) + HANDLE hFile = + CreateFileW(Encoding::ToWide(name).c_str(), GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); + if (hFile == INVALID_HANDLE_VALUE) { + return false; + } + const DWORD type = GetFileType(hFile); + CloseHandle(hFile); + return type == FILE_TYPE_PIPE; +#else + struct stat fs; + if (lstat(name.c_str(), &fs) == 0) { + return S_ISFIFO(fs.st_mode); + } else { + return false; + } +#endif +} + #if defined(_WIN32) && !defined(__CYGWIN__) bool SystemTools::CreateSymlink(const std::string&, const std::string&) { diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in index f3d06fe570e4779df2b31388a1103c79a4623f66..7a5256b236fc94c035bff7285d6e73b266909703 100644 --- a/SystemTools.hxx.in +++ b/SystemTools.hxx.in @@ -653,6 +653,11 @@ public: */ static bool FileIsSymlink(const std::string& name); + /** + * Return true if the file is a FIFO + */ + static bool FileIsFIFO(const std::string& name); + /** * Return true if the file has a given signature (first set of bytes) */