diff options
Diffstat (limited to 'plugins/provider/fileProvider/fileProvider.cpp')
-rw-r--r-- | plugins/provider/fileProvider/fileProvider.cpp | 69 |
1 files changed, 61 insertions, 8 deletions
diff --git a/plugins/provider/fileProvider/fileProvider.cpp b/plugins/provider/fileProvider/fileProvider.cpp index 89e6f43..d1e68c5 100644 --- a/plugins/provider/fileProvider/fileProvider.cpp +++ b/plugins/provider/fileProvider/fileProvider.cpp @@ -6,6 +6,7 @@ */ #include <plugin.h> +#include <fstream> using namespace std; @@ -17,6 +18,25 @@ private: StringMap directoryMap; FILE* fileFD; + bool Load(const string& filename) + { + bool result = false; + if (access(filename.c_str(), F_OK) == 0) { + isyslog("loading %s", filename.c_str()); + ifstream file; + file.open(filename.c_str(), ifstream::in); + string line; int pos; + while(getline(file, line)){ + if(line.length() > 0 && line[0] != '#'){ + if((pos = line.find_first_of(':')) != string::npos){ + directoryMap[line.substr(0,pos)] = line.substr(pos+1); + } + } + } + } + return result; + } + string GetFile(const string& uri){ string mountPoint = uri.substr(6, uri.find_first_of('/',6) - 7); @@ -28,6 +48,16 @@ private: return file; } + bool GetFileStat(const string& uri, struct stat& fileStat){ + struct stat s; + if(stat(GetFile(uri).c_str(), &s) == 0){ + fileStat = s; + return true; + } + + return false; + } + public: virtual string ProvidesSchema() { return "file"; } @@ -36,26 +66,49 @@ public: return ProvidesSchema() + "://"; } - virtual StringList GetContainerEntries(const string& uri) { - StringList list; - - return list; - } - virtual bool IsContainer(const string& uri) { + struct stat fileStat; + if(GetFileStat(uri, fileStat) && S_ISDIR(fileStat.st_mode)) return true; + return false; } virtual bool IsLink(const string& uri, string& target) { + struct stat fileStat; + if(GetFileStat(uri, fileStat) && S_ISLNK(fileStat.st_mode)) return true; + return false; } virtual long GetContainerUpdateId(const string& uri) { + struct stat fileStat; + if(GetFileStat(uri, fileStat)){ + return std::max<time_t>(fileStat.st_ctim.tv_sec, fileStat.st_mtim.tv_sec); + } + return 0; } - virtual bool GetMetadata(const string& uri, cMetadata& metadata) { - return false; + virtual StringList GetContainerEntries(const string& uri) { + StringList list; + + DIR* dirHandle; + struct dirent* dirEntry; + + if((dirHandle = opendir(GetFile(uri).c_str())) == NULL){ + return false; + } + + string filename; + while ((dirEntry = readdir(dirHandle)) != NULL) { + filename = dirEntry->d_name; + if(filename.compare(".") || filename.compare("..")){ + list.push_back(filename); + } + } + closedir(dirHandle); + + return list; } virtual bool Seekable() const { |