Commit fdc844ec authored by Andy Cedilnik's avatar Andy Cedilnik
Browse files

ENH: Add method to create tar

parent ba63b6f1
......@@ -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;
}
......@@ -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;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment