-rw-r--r-- | lib/sitecing_util.cc | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/sitecing_util.cc b/lib/sitecing_util.cc index 5466b28..f892a60 100644 --- a/lib/sitecing_util.cc +++ b/lib/sitecing_util.cc | |||
@@ -27,71 +27,71 @@ namespace sitecing { | |||
27 | if( (*s)=='.' && s[1]=='/' ) | 27 | if( (*s)=='.' && s[1]=='/' ) |
28 | s+=2; | 28 | s+=2; |
29 | if(opts&strip_leading_slash) | 29 | if(opts&strip_leading_slash) |
30 | for(;(*s) && (*s)=='/';s++); | 30 | for(;(*s) && (*s)=='/';s++); |
31 | for(;*s;s++) { | 31 | for(;*s;s++) { |
32 | if( (*s)=='/' ) { | 32 | if( (*s)=='/' ) { |
33 | if(s[1]=='/') | 33 | if(s[1]=='/') |
34 | continue; | 34 | continue; |
35 | if(s[1]=='.' && s[2]=='/') { | 35 | if(s[1]=='.' && s[2]=='/') { |
36 | s+=2; | 36 | s+=2; |
37 | continue; | 37 | continue; |
38 | } | 38 | } |
39 | } | 39 | } |
40 | if(opts&restrict_dotdot) { | 40 | if(opts&restrict_dotdot) { |
41 | if( | 41 | if( |
42 | ( rv.empty() && s[0]=='.' && s[1]=='.' && s[2]=='/' )// "^../" | 42 | ( rv.empty() && s[0]=='.' && s[1]=='.' && s[2]=='/' )// "^../" |
43 | || ( s[0]=='/' && s[1]=='.' && s[2]=='.' && (s[3]==0 || s[3]=='/') ) // "/..(/|$)" | 43 | || ( s[0]=='/' && s[1]=='.' && s[2]=='.' && (s[3]==0 || s[3]=='/') ) // "/..(/|$)" |
44 | ) | 44 | ) |
45 | throw utility_restricted_sequence(CODEPOINT,"restricted updir sequence encountered"); | 45 | throw utility_restricted_sequence(CODEPOINT,"restricted updir sequence encountered"); |
46 | } | 46 | } |
47 | rv += *s; | 47 | rv += *s; |
48 | if( (*s) != '/' ) | 48 | if( (*s) != '/' ) |
49 | notslash=rv.length(); | 49 | notslash=rv.length(); |
50 | } | 50 | } |
51 | if(!(opts&strip_trailing_slash)) | 51 | if(!(opts&strip_trailing_slash)) |
52 | notslash++; | 52 | notslash++; |
53 | if(notslash<rv.length()) | 53 | if(notslash<rv.length()) |
54 | rv.erase(notslash); // XXX: check the logic of stripping/not strippling trailing slash | 54 | rv.erase(notslash); // XXX: check the logic of stripping/not strippling trailing slash |
55 | return rv; | 55 | return rv; |
56 | } | 56 | } |
57 | 57 | ||
58 | string strip_prefix(const string& str,const string& prefix) { | 58 | string strip_prefix(const string& str,const string& prefix) { |
59 | if(str.compare(0,prefix.length(),prefix)) | 59 | if( (str.length()<prefix.length()) || str.compare(0,prefix.length(),prefix)) |
60 | throw utility_no_prefix(CODEPOINT,"no such prefix"); | 60 | throw utility_no_prefix(CODEPOINT,"no such prefix"); |
61 | return str.substr(prefix.length()); | 61 | return str.substr(prefix.length()); |
62 | } | 62 | } |
63 | 63 | ||
64 | string strip_suffix(const string& str,const string& suffix) { | 64 | string strip_suffix(const string& str,const string& suffix) { |
65 | if(str.compare(str.length()-suffix.length(),suffix.length(),suffix)) | 65 | if( (str.length()<suffix.length()) || str.compare(str.length()-suffix.length(),suffix.length(),suffix)) |
66 | throw utility_no_suffix(CODEPOINT,"no such suffix"); | 66 | throw utility_no_suffix(CODEPOINT,"no such suffix"); |
67 | return str.substr(0,str.length()-suffix.length()); | 67 | return str.substr(0,str.length()-suffix.length()); |
68 | } | 68 | } |
69 | 69 | ||
70 | string dir_name(const string& filename) { | 70 | string dir_name(const string& filename) { |
71 | string::size_type sl = filename.find_last_of('/'); | 71 | string::size_type sl = filename.find_last_of('/'); |
72 | if(sl==string::npos) | 72 | if(sl==string::npos) |
73 | return ""; // no slashes -- no dir. | 73 | return ""; // no slashes -- no dir. |
74 | string::size_type nosl = filename.find_last_not_of('/',sl); | 74 | string::size_type nosl = filename.find_last_not_of('/',sl); |
75 | if(nosl==string::npos) | 75 | if(nosl==string::npos) |
76 | return ""; // only slashes -- no dir. XXX: only slashes after the last slash... does it mean no dir? | 76 | return ""; // only slashes -- no dir. XXX: only slashes after the last slash... does it mean no dir? |
77 | return filename.substr(0,nosl+1); | 77 | return filename.substr(0,nosl+1); |
78 | } | 78 | } |
79 | 79 | ||
80 | void make_path(const string& path,mode_t mode) { | 80 | void make_path(const string& path,mode_t mode) { |
81 | struct stat st; | 81 | struct stat st; |
82 | for(string::size_type sl=0;sl!=string::npos;sl=path.find('/',sl+1)) { | 82 | for(string::size_type sl=0;sl!=string::npos;sl=path.find('/',sl+1)) { |
83 | if(!sl) | 83 | if(!sl) |
84 | continue; | 84 | continue; |
85 | string p = path.substr(0,sl); | 85 | string p = path.substr(0,sl); |
86 | if(stat(p.c_str(),&st) || !S_ISDIR(st.st_mode)) { | 86 | if(stat(p.c_str(),&st) || !S_ISDIR(st.st_mode)) { |
87 | if(mkdir(p.c_str(),mode)) | 87 | if(mkdir(p.c_str(),mode)) |
88 | throw konforka::exception(CODEPOINT,"failed to mkdir()"); | 88 | throw konforka::exception(CODEPOINT,"failed to mkdir()"); |
89 | } | 89 | } |
90 | } | 90 | } |
91 | if(stat(path.c_str(),&st) || !S_ISDIR(st.st_mode)) { | 91 | if(stat(path.c_str(),&st) || !S_ISDIR(st.st_mode)) { |
92 | if(mkdir(path.c_str(),mode)) | 92 | if(mkdir(path.c_str(),mode)) |
93 | throw konforka::exception(CODEPOINT,"failed to mkdir()"); | 93 | throw konforka::exception(CODEPOINT,"failed to mkdir()"); |
94 | } | 94 | } |
95 | } | 95 | } |
96 | 96 | ||
97 | void file_lock::lock(const string& f) { | 97 | void file_lock::lock(const string& f) { |