From e01cdf2065d93cdbb873999b45414133978860b2 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 12 Mar 2007 13:50:28 -0400 Subject: [PATCH] ENH: Added kwsys SystemTools::CreateSymlink and SystemTools::ReadSymlink. --- Source/cmSystemTools.cxx | 14 ------------ Source/cmSystemTools.h | 1 - Source/kwsys/SystemTools.cxx | 38 +++++++++++++++++++++++++++++++++ Source/kwsys/SystemTools.hxx.in | 12 +++++++++++ 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 530d7fdf82..355325976b 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1376,20 +1376,6 @@ bool cmSystemTools::StringEndsWith(const char* str1, const char* str2) return !strncmp(str1 + (strlen(str1)-strlen(str2)), str2, strlen(str2)); } -#if defined(_WIN32) && !defined(__CYGWIN__) -bool cmSystemTools::CreateSymlink(const char*, const char*) -{ - // Should we create a copy here? - return false; -} -#else -bool cmSystemTools::CreateSymlink(const char* origName, const char* newName) -{ - return (symlink(origName, newName) >= 0); -} -#endif - - // compute the relative path from here to there std::string cmSystemTools::RelativePath(const char* local, const char* remote) { diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 1838039dbb..f785358c4f 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -297,7 +297,6 @@ public: static std::string ConvertToRunCommandPath(const char* path); //! Check if the first string ends with the second one. static bool StringEndsWith(const char* str1, const char* str2); - static bool CreateSymlink(const char* origName, const char* newName); /** compute the relative path from local to remote. local must be a directory. remote can be a file or a directory. diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx index 9892d73482..9212b459f4 100644 --- a/Source/kwsys/SystemTools.cxx +++ b/Source/kwsys/SystemTools.cxx @@ -2356,6 +2356,44 @@ bool SystemTools::FileIsSymlink(const char* name) #endif } +#if defined(_WIN32) && !defined(__CYGWIN__) +bool SystemTools::CreateSymlink(const char*, const char*) +{ + return false; +} +#else +bool SystemTools::CreateSymlink(const char* origName, const char* newName) +{ + return symlink(origName, newName) >= 0; +} +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) +bool SystemTools::ReadSymlink(const char*, kwsys_stl::string&) +{ + return false; +} +#else +bool SystemTools::ReadSymlink(const char* newName, + kwsys_stl::string& origName) +{ + char buf[KWSYS_SYSTEMTOOLS_MAXPATH+1]; + int count = + static_cast(readlink(newName, buf, KWSYS_SYSTEMTOOLS_MAXPATH)); + if(count >= 0) + { + // Add null-terminator. + buf[count] = 0; + origName = buf; + return true; + } + else + { + return false; + } +} +#endif + int SystemTools::ChangeDirectory(const char *dir) { return Chdir(dir); diff --git a/Source/kwsys/SystemTools.hxx.in b/Source/kwsys/SystemTools.hxx.in index 054666fed7..c89bd493bc 100644 --- a/Source/kwsys/SystemTools.hxx.in +++ b/Source/kwsys/SystemTools.hxx.in @@ -588,6 +588,18 @@ public: unsigned long length = 256, double percent_bin = 0.05); + /** + * Create a symbolic link if the platform supports it. Returns whether + * creation succeded. + */ + static bool CreateSymlink(const char* origName, const char* newName); + + /** + * Read the contents of a symbolic link. Returns whether reading + * succeded. + */ + static bool ReadSymlink(const char* newName, kwsys_stl::string& origName); + /** * Try to locate the file 'filename' in the directory 'dir'. * If 'filename' is a fully qualified filename, the basename of the file is