From fdc844ecdb4d3f67e83ebcb7303ba67a115ac9eb Mon Sep 17 00:00:00 2001 From: Andy Cedilnik Date: Wed, 28 Dec 2005 16:30:55 -0500 Subject: [PATCH] ENH: Add method to create tar --- Source/cmSystemTools.cxx | 56 ++++++++++++++++++++++++++++++++++++++++ Source/cmSystemTools.h | 2 ++ 2 files changed, 58 insertions(+) diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index e2df4b25b..bc350cdf5 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1358,3 +1358,59 @@ bool cmSystemTools::IsPathToFramework(const char* path) } return false; } + +#include +#include // auto_ptr + +bool cmSystemTools::CreateTar(const char* outFileName, const std::vector& 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 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::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 c647469ed..59ca1d113 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& files); private: static bool s_ForceUnixPaths; static bool s_RunCommandHideConsole;