summaryrefslogtreecommitdiffabout
path: root/include
Unidiff
Diffstat (limited to 'include') (more/less context) (ignore whitespace changes)
-rw-r--r--include/sitecing/sitecing_util.h87
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
13namespace sitecing { 14namespace 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 */