summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2007-03-12 17:50:28 (GMT)
committerBrad King <brad.king@kitware.com>2007-03-12 17:50:28 (GMT)
commite01cdf2065d93cdbb873999b45414133978860b2 (patch)
treef50fd8e9ba30e1bd19faf827952058a311ae2dbe /Source
parent558dbc84adab239ab3043d0efd0891f9a995161e (diff)
downloadCMake-e01cdf2065d93cdbb873999b45414133978860b2.zip
CMake-e01cdf2065d93cdbb873999b45414133978860b2.tar.gz
CMake-e01cdf2065d93cdbb873999b45414133978860b2.tar.bz2
ENH: Added kwsys SystemTools::CreateSymlink and SystemTools::ReadSymlink.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmSystemTools.cxx14
-rw-r--r--Source/cmSystemTools.h1
-rw-r--r--Source/kwsys/SystemTools.cxx38
-rw-r--r--Source/kwsys/SystemTools.hxx.in12
4 files changed, 50 insertions, 15 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 530d7fd..3553259 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 1838039..f785358 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 9892d73..9212b45 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<int>(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 054666f..c89bd49 100644
--- a/Source/kwsys/SystemTools.hxx.in
+++ b/Source/kwsys/SystemTools.hxx.in
@@ -589,6 +589,18 @@ public:
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
* used to check for its existence in 'dir'.