author | Michael Krelin <hacker@klever.net> | 2005-04-25 16:36:32 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2005-04-25 16:36:32 (UTC) |
commit | 981b219f5297ad2ccc1fc1d0e24e41ec009c35a3 (patch) (unidiff) | |
tree | 9fa81d7fe70883ad26d946c902ba06edcebd4516 /include/sitecing | |
parent | 54e344b7e3623e807b893b7febad3adfc6c1648f (diff) | |
download | sitecing-981b219f5297ad2ccc1fc1d0e24e41ec009c35a3.zip sitecing-981b219f5297ad2ccc1fc1d0e24e41ec009c35a3.tar.gz sitecing-981b219f5297ad2ccc1fc1d0e24e41ec009c35a3.tar.bz2 |
moved a few utility functions to konforka and bumped konforka version requirement accordingly
-rw-r--r-- | include/sitecing/sitecing_util.h | 87 |
1 files changed, 3 insertions, 84 deletions
diff --git a/include/sitecing/sitecing_util.h b/include/sitecing/sitecing_util.h index d1a6c4a..f642c74 100644 --- a/include/sitecing/sitecing_util.h +++ b/include/sitecing/sitecing_util.h | |||
@@ -1,341 +1,260 @@ | |||
1 | #ifndef __SITECING_SITECING_UTIL_H | 1 | #ifndef __SITECING_SITECING_UTIL_H |
2 | #define __SITECING_SITECING_UTIL_H | 2 | #define __SITECING_SITECING_UTIL_H |
3 | 3 | ||
4 | #include <sys/types.h> | 4 | #include <sys/types.h> |
5 | #include <string> | 5 | #include <string> |
6 | #include <konforka/exception.h> | 6 | #include <konforka/exception.h> |
7 | #include <konforka/util.h> | ||
7 | 8 | ||
8 | /** | 9 | /** |
9 | * @file | 10 | * @file |
10 | * @brief utility classes and functions. | 11 | * @brief utility classes and functions. |
11 | */ | 12 | */ |
12 | 13 | ||
13 | namespace sitecing { | 14 | namespace sitecing { |
14 | using namespace std; | 15 | using namespace std; |
15 | 16 | ||
16 | /** | 17 | /** |
17 | * Base class for utility exceptions. | 18 | * Base class for utility exceptions. |
18 | */ | 19 | */ |
19 | class utility_error : public konforka::exception { | 20 | class utility_error : public konforka::exception { |
20 | public: | 21 | public: |
21 | utility_error(const string& fi,const string& fu,int l,const string& w) | 22 | utility_error(const string& fi,const string& fu,int l,const string& w) |
22 | : konforka::exception(fi,fu,l,w) { } | 23 | : konforka::exception(fi,fu,l,w) { } |
23 | }; | 24 | }; |
24 | /** | 25 | |
25 | * Restricted sequence encountered. | ||
26 | */ | ||
27 | class utility_restricted_sequence : public utility_error { | ||
28 | public: | ||
29 | utility_restricted_sequence(const string& fi,const string& fu,int l,const string& w) | ||
30 | : utility_error(fi,fu,l,w) { } | ||
31 | }; | ||
32 | /** | 26 | /** |
33 | * No prefix or suffix found to strip out. | 27 | * No prefix or suffix found to strip out. |
34 | */ | 28 | */ |
35 | class utility_no_affix : public utility_error { | 29 | class utility_no_affix : public utility_error { |
36 | public: | 30 | public: |
37 | utility_no_affix(const string& fi,const string& fu,int l,const string& w) | 31 | utility_no_affix(const string& fi,const string& fu,int l,const string& w) |
38 | : utility_error(fi,fu,l,w) { } | 32 | : utility_error(fi,fu,l,w) { } |
39 | }; | 33 | }; |
40 | /** | 34 | /** |
41 | * No prefix to strip found. | 35 | * No prefix to strip found. |
42 | */ | 36 | */ |
43 | class utility_no_prefix : public utility_no_affix { | 37 | class utility_no_prefix : public utility_no_affix { |
44 | public: | 38 | public: |
45 | utility_no_prefix(const string& fi,const string& fu,int l,const string& w) | 39 | utility_no_prefix(const string& fi,const string& fu,int l,const string& w) |
46 | : utility_no_affix(fi,fu,l,w) { } | 40 | : utility_no_affix(fi,fu,l,w) { } |
47 | }; | 41 | }; |
48 | /** | 42 | /** |
49 | * No suffix to strip found. | 43 | * No suffix to strip found. |
50 | */ | 44 | */ |
51 | class utility_no_suffix : public utility_no_affix { | 45 | class utility_no_suffix : public utility_no_affix { |
52 | public: | 46 | public: |
53 | utility_no_suffix(const string& fi,const string& fu,int l,const string& w) | 47 | utility_no_suffix(const string& fi,const string& fu,int l,const string& w) |
54 | : utility_no_affix(fi,fu,l,w) { } | 48 | : utility_no_affix(fi,fu,l,w) { } |
55 | }; | 49 | }; |
56 | 50 | ||
57 | /** | 51 | /** |
58 | * Went up beyond root. | ||
59 | * @todo TODO: wish I could remember the details -- document me. | ||
60 | */ | ||
61 | class utility_beyond_root : public utility_error { | ||
62 | public: | ||
63 | utility_beyond_root(const string& fi,const string& fu,int l,const string& w) | ||
64 | : utility_error(fi,fu,l,w) { } | ||
65 | }; | ||
66 | |||
67 | /** | ||
68 | * The file lock object. Released at the object destruction. | 52 | * The file lock object. Released at the object destruction. |
69 | */ | 53 | */ |
70 | class file_lock { | 54 | class file_lock { |
71 | public: | 55 | public: |
72 | /** | 56 | /** |
73 | * The file descriptor. | 57 | * The file descriptor. |
74 | */ | 58 | */ |
75 | int fd; | 59 | int fd; |
76 | 60 | ||
77 | file_lock() | 61 | file_lock() |
78 | : fd(-1) { } | 62 | : fd(-1) { } |
79 | /** | 63 | /** |
80 | * @param f file name. | 64 | * @param f file name. |
81 | */ | 65 | */ |
82 | file_lock(const string& f) | 66 | file_lock(const string& f) |
83 | : fd(-1) { lock(f); } | 67 | : fd(-1) { lock(f); } |
84 | ~file_lock() { unlock(); } | 68 | ~file_lock() { unlock(); } |
85 | 69 | ||
86 | /** | 70 | /** |
87 | * Do lock. | 71 | * Do lock. |
88 | * @param f file name. | 72 | * @param f file name. |
89 | */ | 73 | */ |
90 | void lock(const string& f); | 74 | void lock(const string& f); |
91 | /** | 75 | /** |
92 | * @todo TODO: wish I could remember the details -- document me. | 76 | * @todo TODO: wish I could remember the details -- document me. |
93 | */ | 77 | */ |
94 | void lock(); | 78 | void lock(); |
95 | /** | 79 | /** |
96 | * Release the lock obtained. | 80 | * Release the lock obtained. |
97 | */ | 81 | */ |
98 | void unlock(); | 82 | void unlock(); |
99 | }; | 83 | }; |
100 | 84 | ||
101 | /** | 85 | /** |
102 | * The pid file. Removed at object destruction. | 86 | * The pid file. Removed at object destruction. |
103 | */ | 87 | */ |
104 | class pid_file { | 88 | class pid_file { |
105 | public: | 89 | public: |
106 | /** | 90 | /** |
107 | * The file name. | 91 | * The file name. |
108 | */ | 92 | */ |
109 | string file_name; | 93 | string file_name; |
110 | /** | 94 | /** |
111 | * Do we unlink the file after we're done? | 95 | * Do we unlink the file after we're done? |
112 | */ | 96 | */ |
113 | bool unlink_pid; | 97 | bool unlink_pid; |
114 | 98 | ||
115 | pid_file() | 99 | pid_file() |
116 | : unlink_pid(false) { } | 100 | : unlink_pid(false) { } |
117 | ~pid_file() { unlink(); } | 101 | ~pid_file() { unlink(); } |
118 | 102 | ||
119 | /** | 103 | /** |
120 | * @param f file name. | 104 | * @param f file name. |
121 | * @param u whether we want to unlink the file. | 105 | * @param u whether we want to unlink the file. |
122 | */ | 106 | */ |
123 | void set(const string& f,bool u=true); | 107 | void set(const string& f,bool u=true); |
124 | /** | 108 | /** |
125 | * Unlink the file if we wanted to in the first place. | 109 | * Unlink the file if we wanted to in the first place. |
126 | */ | 110 | */ |
127 | void unlink(); | 111 | void unlink(); |
128 | }; | 112 | }; |
129 | 113 | ||
130 | /** | 114 | /** |
131 | * The semaphore object. | 115 | * The semaphore object. |
132 | */ | 116 | */ |
133 | class semaphore { | 117 | class semaphore { |
134 | public: | 118 | public: |
135 | /** | 119 | /** |
136 | * The semaphore id. | 120 | * The semaphore id. |
137 | */ | 121 | */ |
138 | int semid; | 122 | int semid; |
139 | 123 | ||
140 | semaphore() | 124 | semaphore() |
141 | : semid(-1) { } | 125 | : semid(-1) { } |
142 | /** | 126 | /** |
143 | * @param sid semaphore id. | 127 | * @param sid semaphore id. |
144 | */ | 128 | */ |
145 | semaphore(int sid) | 129 | semaphore(int sid) |
146 | : semid(sid) { } | 130 | : semid(sid) { } |
147 | ~semaphore() { | 131 | ~semaphore() { |
148 | deinit(); | 132 | deinit(); |
149 | } | 133 | } |
150 | 134 | ||
151 | /** | 135 | /** |
152 | * Init semaphore. | 136 | * Init semaphore. |
153 | */ | 137 | */ |
154 | void init(); | 138 | void init(); |
155 | /** | 139 | /** |
156 | * Undo the init. | 140 | * Undo the init. |
157 | */ | 141 | */ |
158 | void deinit(); | 142 | void deinit(); |
159 | 143 | ||
160 | /** | 144 | /** |
161 | * Semaphore on. | 145 | * Semaphore on. |
162 | */ | 146 | */ |
163 | void on(); | 147 | void on(); |
164 | /** | 148 | /** |
165 | * Semaphore off. | 149 | * Semaphore off. |
166 | */ | 150 | */ |
167 | void off(); | 151 | void off(); |
168 | }; | 152 | }; |
169 | 153 | ||
170 | /** | 154 | /** |
171 | * The semaphor lock object, released at object destruction. | 155 | * The semaphor lock object, released at object destruction. |
172 | */ | 156 | */ |
173 | class semaphore_lock { | 157 | class semaphore_lock { |
174 | public: | 158 | public: |
175 | /** | 159 | /** |
176 | * Pointer to the semaphore we're operating on. | 160 | * Pointer to the semaphore we're operating on. |
177 | */ | 161 | */ |
178 | semaphore* sem; | 162 | semaphore* sem; |
179 | /** | 163 | /** |
180 | * Whether it is locked. | 164 | * Whether it is locked. |
181 | */ | 165 | */ |
182 | bool locked; | 166 | bool locked; |
183 | 167 | ||
184 | semaphore_lock() | 168 | semaphore_lock() |
185 | : sem(NULL), locked(false) {} | 169 | : sem(NULL), locked(false) {} |
186 | /** | 170 | /** |
187 | * @param s pointer to the semaphore. | 171 | * @param s pointer to the semaphore. |
188 | * @param l lock at creation? | 172 | * @param l lock at creation? |
189 | */ | 173 | */ |
190 | semaphore_lock(semaphore* s,bool l=true) | 174 | semaphore_lock(semaphore* s,bool l=true) |
191 | : sem(s), locked(false) { | 175 | : sem(s), locked(false) { |
192 | if(l) lock(); | 176 | if(l) lock(); |
193 | } | 177 | } |
194 | /** | 178 | /** |
195 | * @param s reference to the semaphore. | 179 | * @param s reference to the semaphore. |
196 | * @param l lock at creation? | 180 | * @param l lock at creation? |
197 | */ | 181 | */ |
198 | semaphore_lock(semaphore& s,bool l=true) | 182 | semaphore_lock(semaphore& s,bool l=true) |
199 | : sem(&s), locked(false) { | 183 | : sem(&s), locked(false) { |
200 | if(l) lock(); | 184 | if(l) lock(); |
201 | } | 185 | } |
202 | 186 | ||
203 | ~semaphore_lock() { | 187 | ~semaphore_lock() { |
204 | unlock(); | 188 | unlock(); |
205 | } | 189 | } |
206 | 190 | ||
207 | /** | 191 | /** |
208 | * Lock it. | 192 | * Lock it. |
209 | */ | 193 | */ |
210 | void lock(); | 194 | void lock(); |
211 | /** | 195 | /** |
212 | * Unlock it. | 196 | * Unlock it. |
213 | */ | 197 | */ |
214 | void unlock(); | 198 | void unlock(); |
215 | }; | 199 | }; |
216 | 200 | ||
217 | /** | 201 | /** |
218 | * normalize_path options enumeration. | ||
219 | * @see normalize_path() | ||
220 | */ | ||
221 | enum normalize_path_options { | ||
222 | /** | ||
223 | * Restrict the /../ sequence. | ||
224 | */ | ||
225 | restrict_dotdot = 1, | ||
226 | /** | ||
227 | * Strip out the leading slash. | ||
228 | */ | ||
229 | strip_leading_slash = 2, | ||
230 | /** | ||
231 | * Strip out the trailing slash. | ||
232 | */ | ||
233 | strip_trailing_slash = 4 | ||
234 | }; | ||
235 | /** | ||
236 | * combine_path options enumeration. | ||
237 | * @see combine_path() | ||
238 | */ | ||
239 | enum combine_path_options { | ||
240 | /** | ||
241 | * The origin is file. Otherwise it is directory. | ||
242 | */ | ||
243 | origin_is_file = 1, | ||
244 | /** | ||
245 | * Fail if we've gone up beyond root. | ||
246 | */ | ||
247 | fail_beyond_root = 2 | ||
248 | }; | ||
249 | |||
250 | /** | ||
251 | * Normalize pathname by stripping duplicate slashes, etc. | ||
252 | * @param path the path name. | ||
253 | * @param opts options. | ||
254 | * @return the normalized path. | ||
255 | * @see normalize_path_options | ||
256 | * @todo TODO: document exceptions. | ||
257 | */ | ||
258 | string normalize_path(const string& path,int opts=(restrict_dotdot|strip_trailing_slash)); | ||
259 | /** | ||
260 | * Strip prefix from the string. | 202 | * Strip prefix from the string. |
261 | * @param str the string. | 203 | * @param str the string. |
262 | * @param prefix prefix to strip. | 204 | * @param prefix prefix to strip. |
263 | * @return the string without prefix. | 205 | * @return the string without prefix. |
264 | * @todo TODO: document exceptions. | 206 | * @todo TODO: document exceptions. |
265 | */ | 207 | */ |
266 | string strip_prefix(const string& str,const string& prefix); | 208 | string strip_prefix(const string& str,const string& prefix); |
267 | /** | 209 | /** |
268 | * Strip suffix from the string. | 210 | * Strip suffix from the string. |
269 | * @param str the string. | 211 | * @param str the string. |
270 | * @param suffix suffix to strip. | 212 | * @param suffix suffix to strip. |
271 | * @return the string without suffix. | 213 | * @return the string without suffix. |
272 | * @todo TODO: document exceptions. | 214 | * @todo TODO: document exceptions. |
273 | */ | 215 | */ |
274 | string strip_suffix(const string& str,const string& suffix); | 216 | string strip_suffix(const string& str,const string& suffix); |
275 | /** | 217 | |
276 | * Get the directory part of the filename. | ||
277 | * @param filename the full file name. | ||
278 | * @return the directory part. | ||
279 | */ | ||
280 | string dir_name(const string& filename); | ||
281 | /** | ||
282 | * Combine path with the relative path. | ||
283 | * @param origin the origin. | ||
284 | * @param relative relative path to combine origin with. | ||
285 | * @param opts options. | ||
286 | * @return the pathc combined. | ||
287 | * @see combine_path_options | ||
288 | * @todo TODO: document exceptions. | ||
289 | */ | ||
290 | string combine_path(const string& origin,const string& relative,int opts=origin_is_file); | ||
291 | |||
292 | /** | ||
293 | * Create directory and parent directories if needed. | ||
294 | * @param path the pathname. | ||
295 | * @param mode the mode for newly created directories. | ||
296 | */ | ||
297 | void make_path(const string& path,mode_t mode); | ||
298 | |||
299 | /** | 218 | /** |
300 | * Change to the directory and pop back at object's destruction (e.g. when | 219 | * Change to the directory and pop back at object's destruction (e.g. when |
301 | * the object goes out of scope). | 220 | * the object goes out of scope). |
302 | */ | 221 | */ |
303 | class auto_chdir { | 222 | class auto_chdir { |
304 | public: | 223 | public: |
305 | /** | 224 | /** |
306 | * Saved working directory. | 225 | * Saved working directory. |
307 | */ | 226 | */ |
308 | string saved_pwd; | 227 | string saved_pwd; |
309 | /** | 228 | /** |
310 | * Whether we want to change back automatically. | 229 | * Whether we want to change back automatically. |
311 | */ | 230 | */ |
312 | bool autopop; | 231 | bool autopop; |
313 | 232 | ||
314 | auto_chdir() | 233 | auto_chdir() |
315 | : autopop(false) { } | 234 | : autopop(false) { } |
316 | /** | 235 | /** |
317 | * @param td destination path. | 236 | * @param td destination path. |
318 | * @param ap automatically come back? | 237 | * @param ap automatically come back? |
319 | */ | 238 | */ |
320 | auto_chdir(const string& td,bool ap=true) | 239 | auto_chdir(const string& td,bool ap=true) |
321 | : autopop(false) { pushdir(td,ap); } | 240 | : autopop(false) { pushdir(td,ap); } |
322 | ~auto_chdir() { | 241 | ~auto_chdir() { |
323 | if(autopop) | 242 | if(autopop) |
324 | popdir(); | 243 | popdir(); |
325 | } | 244 | } |
326 | 245 | ||
327 | /** | 246 | /** |
328 | * Change into directory. | 247 | * Change into directory. |
329 | * @param td the directory. | 248 | * @param td the directory. |
330 | * @param ap automaticall pop back? | 249 | * @param ap automaticall pop back? |
331 | */ | 250 | */ |
332 | void pushdir(const string& td,bool ap=true); | 251 | void pushdir(const string& td,bool ap=true); |
333 | /** | 252 | /** |
334 | * Change to the saved directory. | 253 | * Change to the saved directory. |
335 | */ | 254 | */ |
336 | void popdir(); | 255 | void popdir(); |
337 | }; | 256 | }; |
338 | 257 | ||
339 | } | 258 | } |
340 | 259 | ||
341 | #endif /* __SITECING_SITECING_UTIL_H */ | 260 | #endif /* __SITECING_SITECING_UTIL_H */ |