Browse Source

ENH: Add method to create tar

Andy Cedilnik 20 years ago
parent
commit
fdc844ecdb
2 changed files with 58 additions and 0 deletions
  1. 56 0
      Source/cmSystemTools.cxx
  2. 2 0
      Source/cmSystemTools.h

+ 56 - 0
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;
+}

+ 2 - 0
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;