AIX does not have mkdtemp() so emulate its behavior using mktemp() and mkdir()


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17131 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/System/AIX/Path.cpp b/lib/System/AIX/Path.cpp
index aef8e03..0d6c7fb 100644
--- a/lib/System/AIX/Path.cpp
+++ b/lib/System/AIX/Path.cpp
@@ -7,12 +7,13 @@
 // 
 //===----------------------------------------------------------------------===//
 //
-// This file provides the AIX specific implementation of the Path class.
+// This file provides the AIX-specific implementation of the Path class.
 //
 //===----------------------------------------------------------------------===//
 
 // Include the generic unix implementation
 #include "../Unix/Path.cpp"
+#include <sys/stat.h>
 
 namespace llvm {
 using namespace sys;
@@ -34,11 +35,15 @@
 Path
 Path::GetTemporaryDirectory() {
   char pathname[MAXPATHLEN];
-  strcpy(pathname,"/tmp/llvm_XXXXXX");
-  if (0 == mkdtemp(pathname))
-    ThrowErrno(std::string(pathname) + ": Can't create temporary directory");
+  strcpy(pathname, "/tmp/llvm_XXXXXX");
+  // AIX does not have a mkdtemp(), so we emulate it as follows:
+  // mktemp() returns a valid name for a _file_, not a directory, but does not
+  // create it.  We assume that it is a valid name for a directory.
+  char *TmpName = mktemp(pathname);
+  if (!mkdir(TmpName, S_IRWXU))
+    ThrowErrno(std::string(TmpName) + ": Can't create temporary directory");
   Path result;
-  result.set_directory(pathname);
+  result.set_directory(TmpName);
   assert(result.is_valid() && "mkdtemp didn't create a valid pathname!");
   return result;
 }