summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2005-12-28 21:30:55 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2005-12-28 21:30:55 (GMT)
commitfdc844ecdb4d3f67e83ebcb7303ba67a115ac9eb (patch)
tree6c5806e7deee91efd590125038b27fdb16549059
parentba63b6f15ecb8c3011244468e7c6257a43d2dc6b (diff)
downloadCMake-fdc844ecdb4d3f67e83ebcb7303ba67a115ac9eb.zip
CMake-fdc844ecdb4d3f67e83ebcb7303ba67a115ac9eb.tar.gz
CMake-fdc844ecdb4d3f67e83ebcb7303ba67a115ac9eb.tar.bz2
ENH: Add method to create tar
-rw-r--r--Source/cmSystemTools.cxx56
-rw-r--r--Source/cmSystemTools.h2
2 files changed, 58 insertions, 0 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index e2df4b2..bc350cd 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -1358,3 +1358,59 @@ bool cmSystemTools::IsPathToFramework(const char* path)
}
return false;
}
+
+#include <libtar/libtar.h>
+#include <memory> // auto_ptr
+
+bool cmSystemTools::CreateTar(const char* outFileName, const std::vector<cmStdString>& files)
+{
+ TAR *t;
+ char buf[TAR_MAXPATHLEN];
+ char pathname[TAR_MAXPATHLEN];
+
+ // Ok, this libtar is not const safe. for now use auto_ptr hack
+ char* realName = new char[ strlen(outFileName) + 1 ];
+ std::auto_ptr<char> realNamePtr(realName);
+ strcpy(realName, outFileName);
+ if (tar_open(&t, realName,
+ NULL,
+ O_WRONLY | O_CREAT, 0644,
+ TAR_VERBOSE
+ | 0) == -1)
+ {
+ fprintf(stderr, "tar_open(): %s\n", strerror(errno));
+ return -1;
+ }
+
+ std::vector<cmStdString>::const_iterator it;
+ for (it = files.begin(); it != files.end(); ++ it )
+ {
+ strncpy(pathname, it->c_str(), sizeof(pathname));
+ pathname[sizeof(pathname)-1] = 0;
+ strncpy(buf, pathname, sizeof(buf));
+ buf[sizeof(buf)-1] = 0;
+ if (tar_append_tree(t, buf, pathname) != 0)
+ {
+ fprintf(stderr,
+ "tar_append_tree(\"%s\", \"%s\"): %s\n", buf,
+ pathname, strerror(errno));
+ tar_close(t);
+ return -1;
+ }
+ }
+
+ if (tar_append_eof(t) != 0)
+ {
+ fprintf(stderr, "tar_append_eof(): %s\n", strerror(errno));
+ tar_close(t);
+ return -1;
+ }
+
+ if (tar_close(t) != 0)
+ {
+ fprintf(stderr, "tar_close(): %s\n", strerror(errno));
+ return -1;
+ }
+ std::cout << "CreateTar: " << outFileName << std::endl;
+ return false;
+}
diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h
index c647469..59ca1d1 100644
--- a/Source/cmSystemTools.h
+++ b/Source/cmSystemTools.h
@@ -297,6 +297,8 @@ public:
of the form var=value */
static bool PutEnv(const char* value);
+ /** Create tar */
+ static bool CreateTar(const char* outFileName, const std::vector<cmStdString>& files);
private:
static bool s_ForceUnixPaths;
static bool s_RunCommandHideConsole;