]> git.tdb.fi Git - libs/core.git/blob - source/fs/unix/dir.cpp
Check errors from CreateSemaphore
[libs/core.git] / source / fs / unix / dir.cpp
1 #include <unistd.h>
2 #include <dirent.h>
3 #include <sys/stat.h>
4 #include <msp/core/systemerror.h>
5 #include <msp/strings/regex.h>
6 #include "dir.h"
7
8 using namespace std;
9
10 namespace Msp {
11 namespace FS {
12
13 void mkdir(const Path &path, int mode)
14 {
15         if(::mkdir(path.str().c_str(), mode)==-1)
16                 throw system_error("mkdir");
17 }
18
19 void rmdir(const Path &path)
20 {
21         if(::rmdir(path.str().c_str())==-1)
22                 throw system_error("rmdir");
23 }
24
25 template<typename F>
26 vector<string> list_files_internal(const Path &path, const F &filter)
27 {
28         vector<string> result;
29         DIR *dir = opendir(path.str().c_str());
30         if(!dir)
31                 throw system_error("opendir");
32
33         while(dirent *de = readdir(dir))
34         {
35                 const char *fn = de->d_name;
36                 if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0)))
37                         continue;
38                 if(filter(fn))
39                         result.push_back(fn);
40         }
41         closedir(dir);
42
43         return result;
44 }
45
46 vector<string> list_files(const Path &path)
47 {
48         return list_files_internal(path, [](const char *){ return true; });
49 }
50
51 vector<string> list_filtered(const Path &path, const string &filter)
52 {
53         Regex r_filter(filter);
54         return list_files_internal(path, [&r_filter](const char *fn){ return r_filter.match(fn); });
55 }
56
57 Path getcwd()
58 {
59         char buf[1024];
60         return ::getcwd(buf, sizeof(buf));
61 }
62
63 void chdir(const Path &path)
64 {
65         if(::chdir(path.str().c_str())==-1)
66                 throw system_error("chdir");
67 }
68
69 } // namespace FS
70 } // namespace Msp