mirror of
https://github.com/ksherlock/profuse.git
synced 2024-05-28 22:41:39 +00:00
krunch support
git-svn-id: https://profuse.googlecode.com/svn/branches/v2@253 aa027e90-d47c-11dd-86d7-074df07e0730
This commit is contained in:
parent
949ed1e16c
commit
deec48b728
|
@ -112,7 +112,11 @@ public:
|
||||||
void writeBlock(unsigned block, void *);
|
void writeBlock(unsigned block, void *);
|
||||||
|
|
||||||
void sync();
|
void sync();
|
||||||
|
|
||||||
|
unsigned unlink(const char *name);
|
||||||
|
unsigned rename(const char *oldName, const char *newName);
|
||||||
|
|
||||||
|
unsigned krunch();
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -140,6 +144,13 @@ private:
|
||||||
|
|
||||||
class FileEntry : public Entry {
|
class FileEntry : public Entry {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned ValidName(const char *);
|
||||||
|
|
||||||
|
static bool Compress(std::string& text);
|
||||||
|
static bool Uncompress(std::string& text);
|
||||||
|
|
||||||
|
|
||||||
FileEntry(const char *name, unsigned fileKind);
|
FileEntry(const char *name, unsigned fileKind);
|
||||||
FileEntry(void *vp);
|
FileEntry(void *vp);
|
||||||
|
@ -154,18 +165,14 @@ class FileEntry : public Entry {
|
||||||
|
|
||||||
const char *name() const { return _fileName; }
|
const char *name() const { return _fileName; }
|
||||||
Date modification() const { return _modification; }
|
Date modification() const { return _modification; }
|
||||||
|
|
||||||
static unsigned ValidName(const char *);
|
|
||||||
|
|
||||||
static bool Compress(std::string& text);
|
|
||||||
static bool Uncompress(std::string& text);
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual void writeDirectoryEntry(LittleEndian::IOBuffer *);
|
virtual void writeDirectoryEntry(LittleEndian::IOBuffer *);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
friend class VolumeEntry;
|
||||||
|
|
||||||
unsigned _status;
|
unsigned _status;
|
||||||
|
|
||||||
|
|
|
@ -209,10 +209,13 @@ FileEntry *VolumeEntry::fileByName(const char *name) const
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VolumeEntry::unlink(const char *name)
|
unsigned VolumeEntry::unlink(const char *name)
|
||||||
{
|
{
|
||||||
unsigned index;
|
unsigned index;
|
||||||
|
|
||||||
|
|
||||||
|
if (_device->readOnly()) return 0x2b; // WRITE-PROTECTED DISK
|
||||||
|
|
||||||
for(index = 0; index < _fileCount; ++index)
|
for(index = 0; index < _fileCount; ++index)
|
||||||
{
|
{
|
||||||
FileEntry *e = _files[index];
|
FileEntry *e = _files[index];
|
||||||
|
@ -223,14 +226,14 @@ void VolumeEntry::unlink(const char *name)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (index == _fileCount) return; // not found.
|
if (index == _fileCount) return 0x46; // FILE NOT FOUND
|
||||||
|
|
||||||
_files.erase(files.begin() + index);
|
_files.erase(_files.begin() + index);
|
||||||
_fileCount--;
|
_fileCount--;
|
||||||
|
|
||||||
// need to update the header blocks.
|
// need to update the header blocks.
|
||||||
unsigned blockCount = blocks();
|
unsigned blockCount = blocks();
|
||||||
auto_array<uint8_t> buffer(new uint8_t[512 * blocks]);
|
ProFUSE::auto_array<uint8_t> buffer(new uint8_t[512 * blockCount]);
|
||||||
|
|
||||||
// load up blocks.
|
// load up blocks.
|
||||||
// since entries span blocks, we can't do this via pointer.
|
// since entries span blocks, we can't do this via pointer.
|
||||||
|
@ -239,8 +242,8 @@ void VolumeEntry::unlink(const char *name)
|
||||||
_cache->read(2 + i, buffer.get() + 512 * i);
|
_cache->read(2 + i, buffer.get() + 512 * i);
|
||||||
}
|
}
|
||||||
// update the filecount.
|
// update the filecount.
|
||||||
IOBuffer b(buffer.get());
|
IOBuffer b(buffer.get(), 512 * blockCount);
|
||||||
writeDirectoryEntry(b);
|
writeDirectoryEntry(&b);
|
||||||
|
|
||||||
// move up all the entries.
|
// move up all the entries.
|
||||||
uint8_t *address = buffer.get() + 0x1a + 0x1a * index;
|
uint8_t *address = buffer.get() + 0x1a + 0x1a * index;
|
||||||
|
@ -253,8 +256,127 @@ void VolumeEntry::unlink(const char *name)
|
||||||
{
|
{
|
||||||
_cache->write(2 + i, buffer.get() + 512 * i);
|
_cache->write(2 + i, buffer.get() + 512 * i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_cache->sync();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
unsigned VolumeEntry::krunch()
|
||||||
|
{
|
||||||
|
unsigned prevBlock;
|
||||||
|
|
||||||
|
std::vector<FileEntry *>::const_iterator iter;
|
||||||
|
|
||||||
|
bool gap = false;
|
||||||
|
|
||||||
|
// sanity check to make sure no weird overlap issues.
|
||||||
|
|
||||||
|
prevBlock = lastBlock();
|
||||||
|
|
||||||
|
for (iter = _files.begin(); iter != _files.end(); ++iter)
|
||||||
|
{
|
||||||
|
FileEntry *e = *iter;
|
||||||
|
|
||||||
|
unsigned first = e->firstBlock();
|
||||||
|
unsigned last = e->lastBlock();
|
||||||
|
|
||||||
|
if (first != prevBlock) gap = true;
|
||||||
|
|
||||||
|
if (first < prevBlock)
|
||||||
|
return ProFUSE::damagedBitMap;
|
||||||
|
|
||||||
|
if (last < first)
|
||||||
|
return ProFUSE::damagedBitMap;
|
||||||
|
|
||||||
|
if (first < volumeBlocks())
|
||||||
|
return ProFUSE::damagedBitMap;
|
||||||
|
|
||||||
|
|
||||||
|
prevBlock = last;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!gap) return 0;
|
||||||
|
|
||||||
|
|
||||||
|
// need to update the header blocks.
|
||||||
|
unsigned blockCount = blocks();
|
||||||
|
ProFUSE::auto_array<uint8_t> buffer(new uint8_t[512 * blockCount]);
|
||||||
|
IOBuffer b(buffer.get(), 512 * blockCount);
|
||||||
|
|
||||||
|
// load up the directory blocks.
|
||||||
|
for (unsigned i = 0; i < blocks(); ++i)
|
||||||
|
{
|
||||||
|
_cache->read(2 + i, buffer.get() + 512 * i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
prevBlock = lastBlock();
|
||||||
|
|
||||||
|
unsigned offset = 0;
|
||||||
|
for (iter = _files.begin(); iter != _files.end(); ++iter, ++offset)
|
||||||
|
{
|
||||||
|
FileEntry *e = *iter;
|
||||||
|
|
||||||
|
b.setOffset(0x1a + 0x1a * offset);
|
||||||
|
|
||||||
|
unsigned first = e->firstBlock();
|
||||||
|
unsigned last = e->lastBlock();
|
||||||
|
|
||||||
|
unsigned blocks = last - first;
|
||||||
|
unsigned offset = first - prevBlock;
|
||||||
|
|
||||||
|
if (offset == 0)
|
||||||
|
{
|
||||||
|
prevBlock = last;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
e->_firstBlock = first - offset;
|
||||||
|
e->_lastBlock = last - offset;
|
||||||
|
|
||||||
|
e->writeDirectoryEntry(&b);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < blocks; ++i)
|
||||||
|
{
|
||||||
|
uint8_t buffer[512];
|
||||||
|
|
||||||
|
_cache->read(first + i, buffer);
|
||||||
|
_cache->write(prevBlock +i, buffer);
|
||||||
|
_cache->zeroBlock(first + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now save the directory entries.
|
||||||
|
|
||||||
|
// load up the directory blocks.
|
||||||
|
for (unsigned i = 0; i < blocks(); ++i)
|
||||||
|
{
|
||||||
|
_cache->write(2 + i, buffer.get() + 512 * i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_cache->sync();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void *VolumeEntry::loadBlock(unsigned block)
|
void *VolumeEntry::loadBlock(unsigned block)
|
||||||
{
|
{
|
||||||
return _cache->acquire(block);
|
return _cache->acquire(block);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user