source: lsf/trunk/fuentes/src/filesystem.cpp @ 88

Last change on this file since 88 was 88, checked in by jrpelegrina, 5 years ago

First relase to xenial

File size: 5.5 KB
Line 
1
2#include <lsf-1.0/filesystem.hpp>
3
4#include <sys/inotify.h>
5#include <limits.h>
6#include <dirent.h>
7#include <unistd.h>
8#include <sys/types.h>
9#include <sys/stat.h>
10#include <dirent.h>
11#include <pwd.h>
12#include <glob.h>
13#include <libgen.h>
14#include <iostream>
15#include <cstring>
16#include <cstdlib>
17
18using namespace std;
19using namespace net::lliurex;
20
21#define BUF_LEN (10 * (sizeof(struct inotify_event) + NAME_MAX + 1))
22
23bool filesystem::Exists(string path)
24{
25        return (access( path.c_str(), F_OK )!=-1);
26}
27
28bool filesystem::IsDir(string path)
29{
30        struct stat fflags;
31       
32        stat(path.c_str(),&fflags);
33       
34        return S_ISDIR(fflags.st_mode);
35}
36
37std::vector<std::string> filesystem::ListDir(string path)
38{
39        struct stat fflags;
40        std::vector<std::string> files;
41       
42        stat(path.c_str(),&fflags);
43       
44        if(S_ISDIR(fflags.st_mode))
45        {
46
47               
48                DIR *dp;
49                struct dirent *dirp;
50               
51                if((dp  = opendir(path.c_str())) == NULL)
52                {
53                        cout << "Error opening " << path << endl;
54                }
55
56                while ((dirp = readdir(dp)) != NULL)
57                {
58                        files.push_back(string(dirp->d_name));
59                }
60               
61                closedir(dp);
62               
63        }
64       
65        return files;
66}
67
68std::vector<std::string> filesystem::List(string expression)
69{
70        glob_t glob_result;
71        glob(expression.c_str(),GLOB_TILDE,NULL,&glob_result);
72       
73        std::vector<std::string> files;
74       
75        for(int n=0;n<glob_result.gl_pathc;n++)
76        {
77                files.push_back(string(glob_result.gl_pathv[n]));
78        }
79   
80        globfree(&glob_result);
81       
82        return files;
83}
84
85string filesystem::Home()
86{
87        struct passwd *pw = getpwuid(getuid());
88        return string(pw->pw_dir);
89}
90
91void CreateDirAux(string path)
92{
93       
94        if(!filesystem::Exists(path))
95        {
96                int pos = path.rfind("/");
97                if(pos!=string::npos)
98                {
99                        CreateDirAux(path.substr(0,pos));
100                        mkdir(path.c_str(),S_IRWXU);
101                }
102        }               
103       
104       
105}
106
107void filesystem::CreateDir(string path,bool create_path)
108{
109        if(create_path)
110        {
111                if(path[path.length()-1]=='/')
112                        CreateDirAux(path.substr(0,path.length()-1));
113                else
114                        CreateDirAux(path);
115        }
116        else
117        {
118                mkdir(path.c_str(),S_IRWXU);
119        }
120}
121
122string filesystem::GetWorkingDir()
123{
124        int len=128;
125        char * buff;
126       
127        repeat:
128       
129        buff = new char[len];
130       
131        if(getcwd(buff,len)==NULL)
132        {
133                delete buff;
134                len*=2;
135                goto repeat;
136        }
137       
138        string ret(buff);
139        delete buff;
140       
141        return ret;
142}
143
144
145string filesystem::BaseName(string path)
146{
147        char * dup = new char[path.length()+1];
148        strcpy(dup,path.c_str());
149        string ret(basename(dup));
150       
151        delete dup;
152       
153        return ret;
154}
155               
156string filesystem::DirName(string path)
157{
158        char * dup = new char[path.length()+1];
159        strcpy(dup,path.c_str());
160        string ret(dirname(dup));
161       
162        delete dup;
163       
164        return ret;
165}
166
167filesystem::NotifyHandler::NotifyHandler(string path)
168{
169        this->path=path;
170       
171        inotify_fd = inotify_init();
172
173        wd = inotify_add_watch(inotify_fd, path.c_str(), IN_ALL_EVENTS);
174       
175        if(wd==-1)
176        {
177                cerr<<"Error adding inotify watch"<<endl;
178        }
179       
180       
181}
182
183filesystem::NotifyHandler::~NotifyHandler()
184{
185        cout<<"NotifyHandler: removing watch"<<endl;
186        inotify_rm_watch( inotify_fd, wd );
187        close( inotify_fd );
188}
189
190void filesystem::NotifyHandler::Push()
191{
192       
193        ssize_t num_read;
194        char buf[BUF_LEN];
195        struct inotify_event *event;
196       
197        num_read = read(inotify_fd, buf, BUF_LEN);
198       
199        if(num_read>0)
200        {
201                char * p = buf;
202                while(p < buf + num_read)
203                {
204                        event = (struct inotify_event *) p;
205                       
206                        if(event->mask & IN_ACCESS)OnAccess(string(event->name));
207                        if(event->mask & IN_MODIFY)OnModify(string(event->name));
208                        if(event->mask & IN_ATTRIB)OnAttrib(string(event->name));
209                        if(event->mask & IN_CLOSE_WRITE)OnCloseWrite(string(event->name));
210                        if(event->mask & IN_CLOSE_NOWRITE)OnCloseNoWrite(string(event->name));
211                        if(event->mask & IN_OPEN)OnOpen(string(event->name));
212                        if(event->mask & IN_MOVED_FROM)OnMovedFrom(string(event->name));
213                        if(event->mask & IN_MOVED_TO)OnMovedTo(string(event->name));
214                        if(event->mask & IN_CREATE)OnCreate(string(event->name));
215                        if(event->mask & IN_DELETE)OnDelete(string(event->name));
216                        if(event->mask & IN_DELETE_SELF)OnDeleteSelf(string(event->name));
217                       
218                        p=p+sizeof(struct inotify_event) + event->len;
219                }
220        }
221        else
222        {
223                OnError();
224        }
225}
226
227void filesystem::NotifyHandler::OnError()
228{
229        cerr<<"NotifyHandler: Error reading from inotify"<<endl;
230}
231       
232
233/* File accessed */
234void filesystem::NotifyHandler::OnAccess(std::string path)
235{
236        cout<<"NotifyHandler::OnAcess("<<path<<")"<<endl;
237}
238
239/* File modified */
240void filesystem::NotifyHandler::OnModify(std::string path)
241{
242        cout<<"NotifyHandler::OnModify("<<path<<")"<<endl;
243}
244
245/* metadata changed */
246void filesystem::NotifyHandler::OnAttrib(std::string path)
247{
248        cout<<"NotifyHandler::OnAttrib("<<path<<")"<<endl;
249}
250
251/* Writable file closed */
252void filesystem::NotifyHandler::OnCloseWrite(std::string path)
253{
254        cout<<"NotifyHandler::OnCloseWrite("<<path<<")"<<endl;
255}
256
257/* Unwritable file closed */
258void filesystem::NotifyHandler::OnCloseNoWrite(std::string path)
259{
260        cout<<"NotifyHandler::OnCloseNoWrite("<<path<<")"<<endl;
261}
262
263/* File opened */
264void filesystem::NotifyHandler::OnOpen(std::string path)
265{
266        cout<<"NotifyHandler::OnOpen("<<path<<")"<<endl;
267}
268
269/* File moved from */
270void filesystem::NotifyHandler::OnMovedFrom(std::string path)
271{
272        cout<<"NotifyHandler::OnMovedFrom("<<path<<")"<<endl;
273}
274
275/* File moved to */
276void filesystem::NotifyHandler::OnMovedTo(std::string path)
277{
278        cout<<"NotifyHandler::OnMovedTo("<<path<<")"<<endl;
279}
280
281/* File created */
282void filesystem::NotifyHandler::OnCreate(std::string path)
283{
284        cout<<"NotifyHandler::OnCreate("<<path<<")"<<endl;
285}
286
287/* File deleted */
288void filesystem::NotifyHandler::OnDelete(std::string path)
289{
290        cout<<"NotifyHandler::OnDelete("<<path<<")"<<endl;
291}
292
293/* notify path deleted */
294void filesystem::NotifyHandler::OnDeleteSelf(std::string path)
295{
296        cout<<"NotifyHandler::OnDeleteSelf("<<path<<")"<<endl;
297}
Note: See TracBrowser for help on using the repository browser.