Mercurial > irccd
annotate common/directory.cpp @ 282:c234b8db1816 release-2.0
Plugin auth: fix error with quakenet, closes #506
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 01 Nov 2016 13:10:20 +0100 |
parents | 03068f5ed79d |
children |
rev | line source |
---|---|
0 | 1 /* |
2 * directory.cpp -- open and read directories | |
3 * | |
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #include <sstream> | |
20 #include <stdexcept> | |
21 | |
22 #include "directory.h" | |
23 | |
24 #if defined(_WIN32) | |
25 # include <Windows.h> | |
26 #else | |
27 # include <cstring> | |
28 # include <cerrno> | |
29 | |
30 # include <sys/types.h> | |
31 # include <dirent.h> | |
32 #endif | |
33 | |
34 namespace irccd { | |
35 | |
36 #if defined(_WIN32) | |
37 | |
38 namespace { | |
39 | |
40 std::string systemError() | |
41 { | |
42 LPSTR error = nullptr; | |
43 std::string errmsg = "Unknown error"; | |
44 | |
45 FormatMessageA( | |
46 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, | |
47 NULL, | |
48 GetLastError(), | |
49 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), | |
50 (LPSTR)&error, 0, NULL); | |
51 | |
52 if (error) { | |
53 errmsg = std::string(error); | |
54 LocalFree(error); | |
55 } | |
56 | |
57 return errmsg; | |
58 } | |
59 | |
23
03068f5ed79d
Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
60 } // !namespace |
0 | 61 |
62 void Directory::systemLoad(const std::string &path, int flags) | |
63 { | |
64 std::ostringstream oss; | |
65 HANDLE handle; | |
66 WIN32_FIND_DATA fdata; | |
67 | |
68 oss << path << "\\*"; | |
69 handle = FindFirstFile(oss.str().c_str(), &fdata); | |
70 | |
71 if (handle == nullptr) | |
72 throw std::runtime_error(systemError()); | |
73 | |
74 do { | |
75 DirectoryEntry entry; | |
76 | |
77 entry.name = fdata.cFileName; | |
78 if (entry.name == "." && !(flags & Directory::Dot)) | |
79 continue; | |
80 if (entry.name == ".." && !(flags & Directory::DotDot)) | |
81 continue; | |
82 | |
83 switch (fdata.dwFileAttributes) { | |
84 case FILE_ATTRIBUTE_DIRECTORY: | |
85 entry.type = DirectoryEntry::Dir; | |
86 break; | |
87 case FILE_ATTRIBUTE_NORMAL: | |
88 entry.type = DirectoryEntry::File; | |
89 break; | |
90 case FILE_ATTRIBUTE_REPARSE_POINT: | |
91 entry.type = DirectoryEntry::Link; | |
92 break; | |
93 default: | |
94 break; | |
95 } | |
96 | |
97 m_list.push_back(entry); | |
98 } while (FindNextFile(handle, &fdata) != 0); | |
99 | |
100 FindClose(handle); | |
101 } | |
102 | |
103 #else | |
104 | |
105 void Directory::systemLoad(const std::string &path, int flags) | |
106 { | |
107 DIR *dp; | |
108 struct dirent *ent; | |
109 | |
110 if ((dp = opendir(path.c_str())) == nullptr) | |
23
03068f5ed79d
Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
111 throw std::runtime_error(std::strerror(errno)); |
0 | 112 |
113 while ((ent = readdir(dp)) != nullptr) { | |
114 DirectoryEntry entry; | |
115 | |
116 entry.name = ent->d_name; | |
117 if (entry.name == "." && !(flags & Directory::Dot)) | |
118 continue; | |
119 if (entry.name == ".." && !(flags & Directory::DotDot)) | |
120 continue; | |
121 | |
122 switch (ent->d_type) { | |
123 case DT_DIR: | |
124 entry.type = DirectoryEntry::Dir; | |
125 break; | |
126 case DT_REG: | |
127 entry.type = DirectoryEntry::File; | |
128 break; | |
129 case DT_LNK: | |
130 entry.type = DirectoryEntry::Link; | |
131 break; | |
132 default: | |
133 break; | |
134 } | |
135 | |
136 m_list.push_back(entry); | |
137 } | |
138 | |
139 closedir(dp); | |
140 } | |
141 | |
142 #endif | |
143 | |
144 bool operator==(const DirectoryEntry &e1, const DirectoryEntry &e2) | |
145 { | |
146 return e1.name == e2.name && e1.type == e2.type; | |
147 } | |
148 | |
149 Directory::Directory() | |
150 { | |
151 } | |
152 | |
153 Directory::Directory(const std::string &path, int flags) | |
154 { | |
155 systemLoad(path, flags); | |
156 } | |
157 | |
158 Directory::List::iterator Directory::begin() | |
159 { | |
160 return m_list.begin(); | |
161 } | |
162 | |
163 Directory::List::const_iterator Directory::cbegin() const | |
164 { | |
165 return m_list.cbegin(); | |
166 } | |
167 | |
168 Directory::List::iterator Directory::end() | |
169 { | |
170 return m_list.end(); | |
171 } | |
172 | |
173 Directory::List::const_iterator Directory::cend() const | |
174 { | |
175 return m_list.cend(); | |
176 } | |
177 | |
178 int Directory::count() const | |
179 { | |
180 return m_list.size(); | |
181 } | |
182 | |
183 bool operator==(const Directory &d1, const Directory &d2) | |
184 { | |
185 return d1.m_list == d2.m_list; | |
186 } | |
187 | |
188 } // !irccd |