From: VMware, Inc <> Date: Sat, 28 May 2011 19:24:18 +0000 (-0700) Subject: lib/file: make robust mkdir more general X-Git-Tag: 2011.05.27-420096~73 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bddd0b101e43fecebf6f8af02fa146d249994706;p=thirdparty%2Fopen-vm-tools.git lib/file: make robust mkdir more general Make the robust mkdir internal routine behave like the POSIX system call. Later changes will pass other values for the mask. The Windows code ignores it for now. Signed-off-by: Marcelo Vanzin --- diff --git a/open-vm-tools/lib/file/file.c b/open-vm-tools/lib/file/file.c index 9c367bc21..178d048c4 100644 --- a/open-vm-tools/lib/file/file.c +++ b/open-vm-tools/lib/file/file.c @@ -275,7 +275,9 @@ File_UnlinkNoFollow(ConstUnicode pathName) // IN: Bool File_CreateDirectory(ConstUnicode pathName) // IN: { - return (FileCreateDirectory(pathName) == 0) ? TRUE : FALSE; + int err = FileCreateDirectory(pathName, S_IRWXU | S_IRWXG | S_IRWXO); + + return err == 0; } @@ -299,9 +301,9 @@ File_CreateDirectory(ConstUnicode pathName) // IN: Bool File_EnsureDirectory(ConstUnicode pathName) // IN: { - int res = FileCreateDirectory(pathName); + int err = FileCreateDirectory(pathName, S_IRWXU | S_IRWXG | S_IRWXO); - return ((0 == res) || (EEXIST == res)); + return ((err == 0) || (err == EEXIST)); } diff --git a/open-vm-tools/lib/file/fileInt.h b/open-vm-tools/lib/file/fileInt.h index a93da0ef2..10ec0e546 100644 --- a/open-vm-tools/lib/file/fileInt.h +++ b/open-vm-tools/lib/file/fileInt.h @@ -121,6 +121,7 @@ int FileDeletionRetry(ConstUnicode pathName, uint32 msecMaxWaitTime); int FileCreateDirectoryRetry(ConstUnicode pathName, + int mask, uint32 msecMaxWaitTime); int FileRemoveDirectoryRetry(ConstUnicode pathName, @@ -130,11 +131,11 @@ int FileListDirectoryRetry(ConstUnicode pathName, uint32 msecMaxWaitTime, Unicode **ids); -#define FileAttributes(a, b) FileAttributesRetry((a), 0, (b)) -#define FileRename(a, b) FileRenameRetry((a), (b), 0) -#define FileDeletion(a, b) FileDeletionRetry((a), (b), 0) -#define FileCreateDirectory(a) FileCreateDirectoryRetry((a), 0) -#define FileRemoveDirectory(a) FileRemoveDirectoryRetry((a), 0) +#define FileAttributes(a, b) FileAttributesRetry((a), 0, (b)) +#define FileRename(a, b) FileRenameRetry((a), (b), 0) +#define FileDeletion(a, b) FileDeletionRetry((a), (b), 0) +#define FileCreateDirectory(a, b) FileCreateDirectoryRetry((a), (b), 0) +#define FileRemoveDirectory(a) FileRemoveDirectoryRetry((a), 0) #define FILE_MAX_WAIT_TIME_MS 2000 // maximum wait time in milliseconds @@ -146,8 +147,8 @@ int FileListDirectoryRetry(ConstUnicode pathName, FileRenameRetry((a), (b), FILE_MAX_WAIT_TIME_MS) #define FileDeletionRobust(a, b) \ FileDeletionRetry((a), (b), FILE_MAX_WAIT_TIME_MS) -#define FileCreateDirectoryRobust(a) \ - FileCreateDirectoryRetry((a), FILE_MAX_WAIT_TIME_MS) +#define FileCreateDirectoryRobust(a, b) \ + FileCreateDirectoryRetry((a), (b), FILE_MAX_WAIT_TIME_MS) #define FileRemoveDirectoryRobust(a) \ FileRemoveDirectoryRetry((a), FILE_MAX_WAIT_TIME_MS) #else @@ -162,16 +163,17 @@ int FileRename(ConstUnicode fromPath, int FileDeletion(ConstUnicode pathName, Bool handleLink); -int FileCreateDirectory(ConstUnicode pathName); +int FileCreateDirectory(ConstUnicode pathName, + int mask); int FileRemoveDirectory(ConstUnicode pathName); -#define FileListDirectoryRobust(a, b) File_ListDirectory((a), (b)) -#define FileAttributesRobust(a, b) FileAttributes((a), (b)) -#define FileRenameRobust(a, b) FileRename((a), (b)) -#define FileDeletionRobust(a, b) FileDeletion((a), (b)) -#define FileCreateDirectoryRobust(a) FileCreateDirectory((a)) -#define FileRemoveDirectoryRobust(a) FileRemoveDirectory((a)) +#define FileListDirectoryRobust(a, b) File_ListDirectory((a), (b)) +#define FileAttributesRobust(a, b) FileAttributes((a), (b)) +#define FileRenameRobust(a, b) FileRename((a), (b)) +#define FileDeletionRobust(a, b) FileDeletion((a), (b)) +#define FileCreateDirectoryRobust(a, b) FileCreateDirectory((a), (b)) +#define FileRemoveDirectoryRobust(a) FileRemoveDirectory((a)) #endif typedef struct active_lock diff --git a/open-vm-tools/lib/file/fileLockPrimitive.c b/open-vm-tools/lib/file/fileLockPrimitive.c index b5bbc1669..22a89f2cb 100644 --- a/open-vm-tools/lib/file/fileLockPrimitive.c +++ b/open-vm-tools/lib/file/fileLockPrimitive.c @@ -1158,7 +1158,7 @@ MakeDirectory(ConstUnicode pathName) // IN: ASSERT(pathName); - err = FileCreateDirectoryRobust(pathName); + err = FileCreateDirectoryRobust(pathName, S_IRWXU | S_IRWXG | S_IRWXO); #if !defined(_WIN32) umask(save); diff --git a/open-vm-tools/lib/file/filePosix.c b/open-vm-tools/lib/file/filePosix.c index 5c66b554e..783fdc32b 100644 --- a/open-vm-tools/lib/file/filePosix.c +++ b/open-vm-tools/lib/file/filePosix.c @@ -2248,15 +2248,15 @@ out: */ int -FileCreateDirectory(ConstUnicode pathName) // IN: +FileCreateDirectory(ConstUnicode pathName, // IN: + int mask) // IN: { int err; if (pathName == NULL) { err = errno = EFAULT; } else { - err = (Posix_Mkdir(pathName, - S_IRWXU | S_IRWXG | S_IRWXO) == -1) ? errno : 0; + err = (Posix_Mkdir(pathName, mask) == -1) ? errno : 0; } return err;