Split openFileForWrite into windows and unix versions.
[oota-llvm.git] / lib / Support / Unix / Path.inc
index 894400897042f683164afa996a461fe1ea7d6cee..ccd60e5fbd12aac1e136378c29fbebf12952f076 100644 (file)
@@ -766,6 +766,31 @@ error_code openFileForRead(const Twine &Name, int &ResultFD) {
   return error_code::success();
 }
 
+error_code openFileForWrite(const Twine &Name, int &ResultFD,
+                            sys::fs::OpenFlags Flags, unsigned Mode) {
+  // Verify that we don't have both "append" and "excl".
+  assert((!(Flags & sys::fs::F_Excl) || !(Flags & sys::fs::F_Append)) &&
+         "Cannot specify both 'excl' and 'append' file creation flags!");
+
+  int OpenFlags = O_WRONLY | O_CREAT;
+
+  if (Flags & F_Append)
+    OpenFlags |= O_APPEND;
+  else
+    OpenFlags |= O_TRUNC;
+
+  if (Flags & F_Excl)
+    OpenFlags |= O_EXCL;
+
+  SmallString<128> Storage;
+  StringRef P = Name.toNullTerminatedStringRef(Storage);
+  while ((ResultFD = open(P.begin(), OpenFlags, Mode)) < 0) {
+    if (errno != EINTR)
+      return error_code(errno, system_category());
+  }
+  return error_code::success();
+}
+
 } // end namespace fs
 } // end namespace sys
 } // end namespace llvm