mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Implement the new CopyFile function
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13945 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2a7f15e50b
commit
5bfac5d2ed
@ -109,6 +109,41 @@ bool llvm::DiffFiles(const std::string &FileA, const std::string &FileB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// CopyFile - Copy the specified source file to the specified destination,
|
||||||
|
/// overwriting destination if it exists. This returns true on failure.
|
||||||
|
///
|
||||||
|
bool llvm::CopyFile(const std::string &Dest, const std::string &Src) {
|
||||||
|
FDHandle InFD(open(Src.c_str(), O_RDONLY));
|
||||||
|
if (InFD == -1) return true;
|
||||||
|
|
||||||
|
FileRemover FR(Dest);
|
||||||
|
|
||||||
|
FDHandle OutFD(open(Dest.c_str(), O_WRONLY|O_CREAT, 0666));
|
||||||
|
if (OutFD == -1) return true;
|
||||||
|
|
||||||
|
char Buffer[16*1024];
|
||||||
|
while (ssize_t Amt = read(InFD, Buffer, 16*1024)) {
|
||||||
|
if (Amt == -1) {
|
||||||
|
if (errno != EINTR) return true; // Error reading the file.
|
||||||
|
} else {
|
||||||
|
char *BufPtr = Buffer;
|
||||||
|
while (Amt) {
|
||||||
|
ssize_t AmtWritten = write(OutFD, BufPtr, Amt);
|
||||||
|
if (AmtWritten == -1) {
|
||||||
|
if (errno != EINTR) return true; // Error writing the file.
|
||||||
|
} else {
|
||||||
|
Amt -= AmtWritten;
|
||||||
|
BufPtr += AmtWritten;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FR.releaseFile(); // Success!
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// MoveFileOverIfUpdated - If the file specified by New is different than Old,
|
/// MoveFileOverIfUpdated - If the file specified by New is different than Old,
|
||||||
/// or if Old does not exist, move the New file over the Old file. Otherwise,
|
/// or if Old does not exist, move the New file over the Old file. Otherwise,
|
||||||
/// remove the New file.
|
/// remove the New file.
|
||||||
|
Loading…
Reference in New Issue
Block a user