summaryrefslogtreecommitdiff
path: root/plugins/provider/fileProvider/fileProvider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/provider/fileProvider/fileProvider.cpp')
-rw-r--r--plugins/provider/fileProvider/fileProvider.cpp69
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 {