diff --git a/mona/core/file_server/ISO9660/ISO9660FileSystem.cpp b/mona/core/file_server/ISO9660/ISO9660FileSystem.cpp
index bad34a7..5f0f3f5 100644
--- a/mona/core/file_server/ISO9660/ISO9660FileSystem.cpp
+++ b/mona/core/file_server/ISO9660/ISO9660FileSystem.cpp
@@ -111,7 +111,6 @@ int ISO9660FileSystem::read(Vnode* file, struct io::Context* context)
}
context->memory = monapi_cmemoryinfo_new();
- _logprintf("%s %s:%d\n", __func__, __FILE__, __LINE__);
if (!monapi_cmemoryinfo_create(context->memory, readSize, MONAPI_FALSE))
{
diff --git a/mona/core/file_server/VnodeCacher.cpp b/mona/core/file_server/VnodeCacher.cpp
index c368b78..8ca0e99 100644
--- a/mona/core/file_server/VnodeCacher.cpp
+++ b/mona/core/file_server/VnodeCacher.cpp
@@ -40,6 +40,18 @@ VnodeCacher::~VnodeCacher()
delete directories_;
}
+void VnodeCacher::enumCaches(Vnode* directory, std::vector<std::string>& caches)
+{
+ DirectoriesMap::iterator it = directories_->find(directory);
+ if (it == directories_->end()) {
+ return;
+ }
+ EntriesMap* entries = it->second;
+ for (EntriesMap::const_iterator eit = entries->begin(); eit != entries->end(); ++eit) {
+ caches.push_back(eit->first);
+ }
+}
+
Vnode* VnodeCacher::lookup(Vnode* directory, const string& name)
{
if (directory->type != Vnode::DIRECTORY) return NULL;
diff --git a/mona/core/file_server/VnodeCacher.h b/mona/core/file_server/VnodeCacher.h
index 086e74c..e9531af 100644
--- a/mona/core/file_server/VnodeCacher.h
+++ b/mona/core/file_server/VnodeCacher.h
@@ -18,6 +18,7 @@ public:
virtual ~VnodeCacher();
public:
+ void enumCaches(Vnode* directory, std::vector<std::string>& caches);
Vnode* lookup(Vnode* directory, const std::string& name);
void add(Vnode* directory, const std::string& name, Vnode* entry);
void remove(Vnode* directory, const std::string& name);
diff --git a/mona/core/file_server/VnodeManager.cpp b/mona/core/file_server/VnodeManager.cpp
index cc6fba3..95d96a7 100644
--- a/mona/core/file_server/VnodeManager.cpp
+++ b/mona/core/file_server/VnodeManager.cpp
@@ -65,7 +65,50 @@ int VnodeManager::readdir(const std::string&name, monapi_cmemoryinfo** mem)
return MONA_ERROR_ENTRY_NOT_FOUND;
}
}
- if (dir->fs->readdir(dir, mem) != MONA_SUCCESS) return MONA_FAILURE;
+ if (dir->fs->readdir(dir, mem) != MONA_SUCCESS) {
+ return MONA_FAILURE;
+ }
+
+ // check mounted directories on caches.
+ typedef std::vector<std::string> strings;
+ strings caches;
+ cacher_->enumCaches(dir, caches);
+ if (!caches.empty()) {
+ std::map<std::string, bool> seen;
+ for (size_t i = sizeof(int); i < (*mem)->Size; i += sizeof(monapi_directoryinfo)) {
+ monapi_directoryinfo* p = (monapi_directoryinfo*)(&((*mem)->Data[i]));
+ seen.insert(std::pair<std::string, bool>(p->name, true));
+ }
+
+ strings diff;
+ for (strings::const_iterator it = caches.begin(); it != caches.end(); ++it) {
+ if (seen.find(*it) == seen.end()) {
+ diff.push_back(*it);
+ }
+ }
+
+ if (!diff.empty()) {
+ monapi_cmemoryinfo* ret = monapi_cmemoryinfo_new();
+ int size = (*mem)->Size + diff.size() * sizeof(monapi_directoryinfo);
+ if (!monapi_cmemoryinfo_create(ret, size, MONAPI_FALSE)) {
+ monapi_cmemoryinfo_delete(ret);
+ return MONA_FAILURE;
+ }
+ memcpy(ret->Data, (*mem)->Data, (*mem)->Size);
+ int entriesNum = *((int*)(*mem)->Data) + diff.size();
+ memcpy(ret->Data, &entriesNum, sizeof(int));
+ for (size_t i = 0; i < diff.size(); i++) {
+ monapi_directoryinfo di;
+ di.size = 0;
+ strcpy(di.name, diff[i].c_str());
+ di.attr = ATTRIBUTE_DIRECTORY;
+ memcpy(&(ret->Data[(*mem)->Size + i * sizeof(monapi_directoryinfo)]), &di, sizeof(monapi_directoryinfo));
+ }
+ monapi_cmemoryinfo_dispose(*mem);
+ monapi_cmemoryinfo_delete(*mem);
+ *mem = ret;
+ }
+ }
return MONA_SUCCESS;
}
@@ -233,9 +276,9 @@ int VnodeManager::seek(uint32_t fileID, uint32_t offset, uint32_t origin)
switch (origin)
{
case SEEK_SET: fileInfo->context.offset = offset; break;
- case SEEK_CUR: fileInfo->context.offset +=offset; break;
- case SEEK_END: fileInfo->context.offset = st.size-offset; break;
- default: break;
+ case SEEK_CUR: fileInfo->context.offset +=offset; break;
+ case SEEK_END: fileInfo->context.offset = st.size-offset; break;
+ default: break;
}
// fileInfo->context.offset = offset;
fileInfo->context.origin = origin;
@@ -254,7 +297,10 @@ void VnodeManager::split(string str, char ch, vector<string>& v)
uint32_t next = 0;
while ((index = str.find_first_of(ch, next)) != string::npos)
{
- v.push_back(string(str.begin() + next, str.begin() + index));
+ string t = string(str.begin() + next, str.begin() + index);
+ if (!t.empty()) {
+ v.push_back(t);
+ }
next = index + 1;
}
v.push_back(string(str.begin() + next, str.end()));
diff --git a/mona/core/file_server/ram_disk/RamDisk.h b/mona/core/file_server/ram_disk/RamDisk.h
index caf8941..6279971 100644
--- a/mona/core/file_server/ram_disk/RamDisk.h
+++ b/mona/core/file_server/ram_disk/RamDisk.h
@@ -312,7 +312,7 @@ namespace RamDisk {
return MONA_FAILURE;
- memcpy(name, (*currentIt_).first.c_str(), (*currentIt_).first.size());
+ strcpy(name, (*currentIt_).first.c_str());
*size = (*currentIt_).second.size;
currentIt_++;
diff --git a/mona/core/scheme/lib/conf.scm.in b/mona/core/scheme/lib/conf.scm.in
index 383db57..158d9f4 100644
--- a/mona/core/scheme/lib/conf.scm.in
+++ b/mona/core/scheme/lib/conf.scm.in
@@ -1,5 +1,5 @@
;(define mona-gui-auto-start #f)
-(define mona-gui-auto-start #t)
+(define mona-gui-auto-start #f)
;; (define (mona-gui-enum-windows) (list "GUI Shell" "/APPS"))
;; (define (mona-gui-get-window-title w) w)
diff --git a/mona/test/monapi/ram_disk/ram_disk.cpp b/mona/test/monapi/ram_disk/ram_disk.cpp
index 44af953..55773a8 100644
--- a/mona/test/monapi/ram_disk/ram_disk.cpp
+++ b/mona/test/monapi/ram_disk/ram_disk.cpp
@@ -115,7 +115,7 @@ static void testWriteFile_Content()
{
const char* data = "test data";
int len = strlen(data)+1;
-
+
const char* path = "/MEM/TESTFILE";
writeContentToPath(path, data);
@@ -146,7 +146,7 @@ static void testWriteTwice()
{
const char* expect = "second";
int expect_len = strlen(expect)+1;
-
+
const char* path = "/MEM/TESTFILE";
writeContentToPath(path, "first");
writeContentToPath(path, expect, false);
@@ -212,8 +212,26 @@ static void testReadDirectory_TwoFile()
monapi_file_delete("/MEM/TEST1.TXT");
}
+static void testReadDirectory_Root()
+{
+ monapi_cmemoryinfo* ci = monapi_file_read_directory("/");
+ EXPECT_TRUE(ci != NULL);
+
+ int size = *(int*)ci->Data;
+ monapi_directoryinfo* p = (monapi_directoryinfo*)&ci->Data[sizeof(int)];
+ bool ramdiskFound = false;
+ for (int i = 0; i < size; i++) {
+ if (CString(p[i].name) == "MEM") {
+ ramdiskFound = true;
+ break;
+ }
+ }
+ EXPECT_TRUE(ramdiskFound);
+ monapi_cmemoryinfo_dispose(ci);
+ monapi_cmemoryinfo_delete(ci);
+}
int main(int argc, char *argv[])
{
@@ -228,6 +246,7 @@ int main(int argc, char *argv[])
testReadDirectory_Empty();
testReadDirectory_OneFile();
testReadDirectory_TwoFile();
+ testReadDirectory_Root();
TEST_RESULTS(ram_disk);
return 0;