mirror of
https://github.com/vgough/encfs.git
synced 2024-11-28 19:03:42 +01:00
parent
acbeb64765
commit
41d5ec4cba
@ -456,34 +456,40 @@ bool CipherFileIO::streamRead(unsigned char *buf, int size,
|
|||||||
|
|
||||||
int CipherFileIO::truncate(off_t size) {
|
int CipherFileIO::truncate(off_t size) {
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
int reopen = 0;
|
||||||
|
// well, we will truncate, so we need a write access to the file
|
||||||
|
if (!base->isWritable()) {
|
||||||
|
int newFlags = lastFlags | O_RDWR;
|
||||||
|
int res = base->open(newFlags);
|
||||||
|
if (res < 0) {
|
||||||
|
VLOG(1) << "truncate failed to re-open for write";
|
||||||
|
base->open(lastFlags);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
reopen = 1;
|
||||||
|
}
|
||||||
if (!haveHeader) {
|
if (!haveHeader) {
|
||||||
res = BlockFileIO::truncateBase(size, base.get());
|
res = BlockFileIO::truncateBase(size, base.get());
|
||||||
} else {
|
} else {
|
||||||
if (0 == fileIV) {
|
if (0 == fileIV) {
|
||||||
// empty file.. create the header..
|
// empty file.. create the header..
|
||||||
if (!base->isWritable()) {
|
res = initHeader();
|
||||||
// open for write..
|
|
||||||
int newFlags = lastFlags | O_RDWR;
|
|
||||||
int res = base->open(newFlags);
|
|
||||||
if (res < 0) {
|
|
||||||
VLOG(1) << "truncate failed to re-open for write";
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
int res = initHeader();
|
|
||||||
if (res < 0) {
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// can't let BlockFileIO call base->truncate(), since it would be using
|
// can't let BlockFileIO call base->truncate(), since it would be using
|
||||||
// the wrong size..
|
// the wrong size..
|
||||||
|
if (res == 0) {
|
||||||
res = BlockFileIO::truncateBase(size, nullptr);
|
res = BlockFileIO::truncateBase(size, nullptr);
|
||||||
|
}
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
res = base->truncate(size + HEADER_SIZE);
|
res = base->truncate(size + HEADER_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (reopen == 1) {
|
||||||
|
reopen = base->open(lastFlags);
|
||||||
|
if (res < 0) {
|
||||||
|
res = reopen;
|
||||||
|
}
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user