static Boolean _CFReadBytesFromPathAndGetFD(CFAllocatorRef alloc, const char *path, void **bytes, CFIndex *length, CFIndex maxLength, int extraOpenFlags, int *fd) { // maxLength is the number of bytes desired, or 0 if the whole file is desired regardless of length. struct statinfo statBuf; *bytes = NULL; int no_hang_fd = openAutoFSNoWait(); *fd = open(path, O_RDONLY|extraOpenFlags|CF_OPENFLGS, 0666); if (*fd < 0) { closeAutoFSNoWait(no_hang_fd); return false; } if (fstat(*fd, &statBuf) < 0) { int saveerr = thread_errno(); close(*fd); *fd = -1; closeAutoFSNoWait(no_hang_fd); thread_set_errno(saveerr); return false; } if ((statBuf.st_mode & S_IFMT) != S_IFREG) { close(*fd); *fd = -1; closeAutoFSNoWait(no_hang_fd); thread_set_errno(EACCES); return false; } if (statBuf.st_size == 0) { *bytes = CFAllocatorAllocate(alloc, 4, 0); // don't return constant string -- it's freed! if (__CFOASafe) __CFSetLastAllocationEventName(*bytes, "CFUtilities (file-bytes)"); *length = 0; } else { CFIndex desiredLength; if ((maxLength >= statBuf.st_size) || (maxLength == 0)) { desiredLength = statBuf.st_size; } else { desiredLength = maxLength; } *bytes = CFAllocatorAllocate(alloc, desiredLength, 0); if (!bytes) { close(*fd); *fd = -1; closeAutoFSNoWait(no_hang_fd); return false; } if (__CFOASafe) __CFSetLastAllocationEventName(*bytes, "CFUtilities (file-bytes)"); // fcntl(fd, F_NOCACHE, 1); if (read(*fd, *bytes, desiredLength) < 0) { CFAllocatorDeallocate(alloc, *bytes); close(*fd); *fd = -1; closeAutoFSNoWait(no_hang_fd); return false; } *length = desiredLength; } closeAutoFSNoWait(no_hang_fd); return true; }
__private_extern__ Boolean _CFWriteBytesToFile(CFURLRef url, const void *bytes, CFIndex length) { int fd = -1; int mode; struct statinfo statBuf; char path[CFMaxPathSize]; if (!CFURLGetFileSystemRepresentation(url, true, (uint8_t *)path, CFMaxPathSize)) { return false; } int no_hang_fd = openAutoFSNoWait(); mode = 0666; if (0 == stat(path, &statBuf)) { mode = statBuf.st_mode; } else if (thread_errno() != ENOENT) { closeAutoFSNoWait(no_hang_fd); return false; } fd = open(path, O_WRONLY|O_CREAT|O_TRUNC|CF_OPENFLGS, 0666); if (fd < 0) { closeAutoFSNoWait(no_hang_fd); return false; } if (length && write(fd, bytes, length) != length) { int saveerr = thread_errno(); close(fd); closeAutoFSNoWait(no_hang_fd); thread_set_errno(saveerr); return false; } #if DEPLOYMENT_TARGET_WINDOWS FlushFileBuffers((HANDLE)_get_osfhandle(fd)); #else fsync(fd); #endif close(fd); closeAutoFSNoWait(no_hang_fd); return true; }
__private_extern__ Boolean _CFDeleteFile(const char *path) { int no_hang_fd = openAutoFSNoWait(); int ret = unlink(path) == 0; closeAutoFSNoWait(no_hang_fd); return ret; }
__private_extern__ Boolean _CFRemoveDirectory(const char *path) { int no_hang_fd = openAutoFSNoWait(); int ret = ((rmdir(path) == 0) ? true : false); closeAutoFSNoWait(no_hang_fd); return ret; }
CF_PRIVATE Boolean _CFDeleteFile(const char *path) { int no_hang_fd = openAutoFSNoWait(); int ret = unlink(path) == 0; closeAutoFSNoWait(no_hang_fd); return ret; }
CF_PRIVATE Boolean _CFCreateDirectory(const char *path) { int no_hang_fd = openAutoFSNoWait(); int ret = ((mkdir(path, 0777) == 0) ? true : false); closeAutoFSNoWait(no_hang_fd); return ret; }