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) (side-by-side diff) | |
tree | 9fa81d7fe70883ad26d946c902ba06edcebd4516 | |
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-- | components/exception_dev | 7 | ||||
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | include/sitecing/sitecing_util.h | 85 | ||||
-rw-r--r-- | lib/component_factory.cc | 31 | ||||
-rw-r--r-- | lib/configuration.cc | 9 | ||||
-rw-r--r-- | lib/sitecing_parser.ll | 13 | ||||
-rw-r--r-- | lib/sitecing_util.cc | 117 | ||||
-rw-r--r-- | lib/sitespace.cc | 3 | ||||
-rw-r--r-- | src/sitecing-build.cc | 5 | ||||
-rw-r--r-- | src/sitecing-fastcgi.cc | 4 | ||||
-rw-r--r-- | src/sitecing-plaincgi.cc | 4 |
11 files changed, 47 insertions, 235 deletions
diff --git a/components/exception_dev b/components/exception_dev index d8c84e1..d62f462 100644 --- a/components/exception_dev +++ b/components/exception_dev @@ -12,2 +12,3 @@ #include <sitecing/magic.h> + #include <konforka/util.h> #include <konforka/exception.h> @@ -256,3 +257,3 @@ if((oel>0 && !oef.empty()) && (oel!=error_line || oef!=error_file)) { - string ef = "/"+sitecing::combine_path(root_source+component,oef); + string ef = "/"+konforka::combine_path(root_source+component,oef); report_error(ef,oel,remove_roots(cumulative)); @@ -266,3 +267,3 @@ if(!(cumulative.empty() || error_file.empty() || error_line<0)) { - error_file = "/"+sitecing::combine_path(root_source+component,error_file); + error_file = "/"+konforka::combine_path(root_source+component,error_file); report_error(error_file,error_line,remove_roots(cumulative)); @@ -320,3 +321,3 @@ <%codemethod string strip_roots(const string& filename) %> - string np = sitecing::normalize_path(filename); + string np = konforka::normalize_path(filename); try{ diff --git a/configure.ac b/configure.ac index a8aa142..fde326b 100644 --- a/configure.ac +++ b/configure.ac @@ -22,2 +22,6 @@ AC_WITH_PKGCONFIG +PKG_CHECK_MODULES([KONFORKA],[konforka >= 0.0.1],,[ + AC_MSG_ERROR([no proper version of konforka library found, get it at http://kin.klever.net/konforka/]) +]) + PKG_CHECK_MODULES([KINGATE],[kingate >= 0.0.1],,[ 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 @@ -6,2 +6,3 @@ #include <konforka/exception.h> +#include <konforka/util.h> @@ -23,10 +24,3 @@ namespace sitecing { }; - /** - * Restricted sequence encountered. - */ - class utility_restricted_sequence : public utility_error { - public: - utility_restricted_sequence(const string& fi,const string& fu,int l,const string& w) - : utility_error(fi,fu,l,w) { } - }; + /** @@ -57,12 +51,2 @@ namespace sitecing { /** - * Went up beyond root. - * @todo TODO: wish I could remember the details -- document me. - */ - class utility_beyond_root : public utility_error { - public: - utility_beyond_root(const string& fi,const string& fu,int l,const string& w) - : utility_error(fi,fu,l,w) { } - }; - - /** * The file lock object. Released at the object destruction. @@ -217,44 +201,2 @@ namespace sitecing { /** - * normalize_path options enumeration. - * @see normalize_path() - */ - enum normalize_path_options { - /** - * Restrict the /../ sequence. - */ - restrict_dotdot = 1, - /** - * Strip out the leading slash. - */ - strip_leading_slash = 2, - /** - * Strip out the trailing slash. - */ - strip_trailing_slash = 4 - }; - /** - * combine_path options enumeration. - * @see combine_path() - */ - enum combine_path_options { - /** - * The origin is file. Otherwise it is directory. - */ - origin_is_file = 1, - /** - * Fail if we've gone up beyond root. - */ - fail_beyond_root = 2 - }; - - /** - * Normalize pathname by stripping duplicate slashes, etc. - * @param path the path name. - * @param opts options. - * @return the normalized path. - * @see normalize_path_options - * @todo TODO: document exceptions. - */ - string normalize_path(const string& path,int opts=(restrict_dotdot|strip_trailing_slash)); - /** * Strip prefix from the string. @@ -274,25 +216,2 @@ namespace sitecing { string strip_suffix(const string& str,const string& suffix); - /** - * Get the directory part of the filename. - * @param filename the full file name. - * @return the directory part. - */ - string dir_name(const string& filename); - /** - * Combine path with the relative path. - * @param origin the origin. - * @param relative relative path to combine origin with. - * @param opts options. - * @return the pathc combined. - * @see combine_path_options - * @todo TODO: document exceptions. - */ - string combine_path(const string& origin,const string& relative,int opts=origin_is_file); - - /** - * Create directory and parent directories if needed. - * @param path the pathname. - * @param mode the mode for newly created directories. - */ - void make_path(const string& path,mode_t mode); diff --git a/lib/component_factory.cc b/lib/component_factory.cc index d9692de..af3d911 100644 --- a/lib/component_factory.cc +++ b/lib/component_factory.cc @@ -13,2 +13,3 @@ using namespace std; + #include <konforka/util.h> #include "sitecing/component_factory.h" @@ -26,5 +27,5 @@ namespace sitecing { : config(c), - root_source(normalize_path(c.root_source,strip_trailing_slash)+'/'), - root_intermediate(normalize_path(c.root_intermediate,strip_trailing_slash)+'/'), - root_so(normalize_path(c.root_so,strip_trailing_slash)+'/') { + root_source(konforka::normalize_path(c.root_source,konforka::strip_trailing_slash)+'/'), + root_intermediate(konforka::normalize_path(c.root_intermediate,konforka::strip_trailing_slash)+'/'), + root_so(konforka::normalize_path(c.root_so,konforka::strip_trailing_slash)+'/') { } @@ -33,3 +34,3 @@ namespace sitecing { deps.clear(); - string dp = normalize_path(dst,strip_trailing_slash); + string dp = konforka::normalize_path(dst,konforka::strip_trailing_slash); // source documents @@ -100,3 +101,3 @@ namespace sitecing { if(str.find_first_of("\\:")==string::npos) - deps.push_back(combine_path(config.root_source+nos,str)); + deps.push_back(konforka::combine_path(config.root_source+nos,str)); } @@ -116,3 +117,3 @@ namespace sitecing { bool component_factory::is_uptodate(const string& dst,file_list_t *deps) { - string dp = normalize_path(dst,strip_trailing_slash); + string dp = konforka::normalize_path(dst,konforka::strip_trailing_slash); try { @@ -137,3 +138,3 @@ namespace sitecing { void component_factory::build(const string& dst) { - string dp = normalize_path(dst,strip_trailing_slash); + string dp = konforka::normalize_path(dst,konforka::strip_trailing_slash); // sources @@ -152,3 +153,3 @@ namespace sitecing { throw konforka::exception(CODEPOINT,string("can't access compiled component code (")+o+")"); - make_path(dir_name(root_so+noro),0755); + konforka::make_path(konforka::dir_name(root_so+noro),0755); file_lock lock_cc(root_intermediate+noro+".o.lock"); @@ -197,4 +198,4 @@ namespace sitecing { throw konforka::exception(CODEPOINT,string("can't access preprocessed component code (")+cc+")"); - make_path(dir_name(cc),0755); - string pwd = dir_name(root_source+nos); + konforka::make_path(konforka::dir_name(cc),0755); + string pwd = konforka::dir_name(root_source+nos); auto_chdir dir_changer(pwd); @@ -237,3 +238,3 @@ namespace sitecing { throw konforka::exception(CODEPOINT,string("can't access component source (")+src+")"); - make_path(dir_name(root_intermediate+nos),0755); + konforka::make_path(konforka::dir_name(root_intermediate+nos),0755); file_lock lock(root_intermediate+nos+".lock"); @@ -244,3 +245,3 @@ namespace sitecing { static const char *id_chars = "abcdefghijklmnopqrstuvwxyz0123456789_ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - parser.class_name = normalize_path(nos,strip_leading_slash|strip_trailing_slash); + parser.class_name = konforka::normalize_path(nos,konforka::strip_leading_slash|konforka::strip_trailing_slash); for(string::size_type illc = parser.class_name.find_first_not_of(id_chars);illc!=string::npos;illc=parser.class_name.find_first_not_of(id_chars,illc)) { @@ -270,3 +271,3 @@ namespace sitecing { void component_factory::make(const string& dst) { - string dp = normalize_path(dst,strip_trailing_slash); + string dp = konforka::normalize_path(dst,konforka::strip_trailing_slash); try { @@ -319,3 +320,3 @@ namespace sitecing { string component_factory::get_classname(const string& component) { - string cn = root_intermediate+normalize_path(component,strip_trailing_slash|strip_leading_slash)+".classname"; + string cn = root_intermediate+konforka::normalize_path(component,konforka::strip_trailing_slash|konforka::strip_leading_slash)+".classname"; make(cn); @@ -329,3 +330,3 @@ namespace sitecing { void component_factory::get_ancestors(const string& component,file_list_t& rv) { - string cn = root_intermediate+normalize_path(component,strip_trailing_slash|strip_leading_slash)+".ancestors"; + string cn = root_intermediate+konforka::normalize_path(component,konforka::strip_trailing_slash|konforka::strip_leading_slash)+".ancestors"; make(cn); diff --git a/lib/configuration.cc b/lib/configuration.cc index 4ee1526..6b21690 100644 --- a/lib/configuration.cc +++ b/lib/configuration.cc @@ -8,2 +8,3 @@ using namespace std; + #include <konforka/util.h> #include <dotconf.h> @@ -306,3 +307,3 @@ namespace sitecing { string t = "/"; - t += normalize_path(target,strip_leading_slash); + t += konforka::normalize_path(target,konforka::strip_leading_slash); string rv; @@ -339,3 +340,3 @@ namespace sitecing { string t = "/"; - t += normalize_path(target,strip_leading_slash); + t += konforka::normalize_path(target,konforka::strip_leading_slash); for(;;) { @@ -371,3 +372,3 @@ namespace sitecing { string t = "/"; // always assume leading slash - t += normalize_path(target,strip_leading_slash); + t += konforka::normalize_path(target,konforka::strip_leading_slash); // XXX: reconsider precedence @@ -416,3 +417,3 @@ namespace sitecing { string t = "/"; - t += normalize_path(target,strip_leading_slash|strip_trailing_slash); + t += konforka::normalize_path(target,konforka::strip_leading_slash|konforka::strip_trailing_slash); t += "/"; diff --git a/lib/sitecing_parser.ll b/lib/sitecing_parser.ll index 4fd6709..8dd8d5f 100644 --- a/lib/sitecing_parser.ll +++ b/lib/sitecing_parser.ll @@ -9,2 +9,3 @@ using namespace std; +#include <konforka/util.h> #include "sitecing/sitecing_util.h" @@ -299,4 +300,4 @@ NOIDCHAR [^A-Za-z0-9_] } - string c = combine_path(component_basename,m.output); - member_variables.push_back(member_variable(m._type,m._name,normalize_path(c,strip_leading_slash),true)); + string c = konforka::combine_path(component_basename,m.output); + member_variables.push_back(member_variable(m._type,m._name,konforka::normalize_path(c,konforka::strip_leading_slash),true)); modi.pop_front(); @@ -333,4 +334,4 @@ NOIDCHAR [^A-Za-z0-9_] } - string c = combine_path(component_basename,m.output); - member_variables.push_back(member_variable(m._type,m._name,normalize_path(c,strip_leading_slash),true,true)); + string c = konforka::combine_path(component_basename,m.output); + member_variables.push_back(member_variable(m._type,m._name,konforka::normalize_path(c,konforka::strip_leading_slash),true,true)); modi.pop_front(); @@ -367,4 +368,4 @@ NOIDCHAR [^A-Za-z0-9_] } - string c = combine_path(component_basename,m.output); - ancestor_classes.push_back(ancestor_class(m._name,normalize_path(c,strip_leading_slash))); + string c = konforka::combine_path(component_basename,m.output); + ancestor_classes.push_back(ancestor_class(m._name,konforka::normalize_path(c,konforka::strip_leading_slash))); modi.pop_front(); diff --git a/lib/sitecing_util.cc b/lib/sitecing_util.cc index f892a60..f1432df 100644 --- a/lib/sitecing_util.cc +++ b/lib/sitecing_util.cc @@ -22,37 +22,2 @@ namespace sitecing { - string normalize_path(const string& path,int opts) { - const char *s = path.c_str(); - string rv; - string::size_type notslash = 0; - if( (*s)=='.' && s[1]=='/' ) - s+=2; - if(opts&strip_leading_slash) - for(;(*s) && (*s)=='/';s++); - for(;*s;s++) { - if( (*s)=='/' ) { - if(s[1]=='/') - continue; - if(s[1]=='.' && s[2]=='/') { - s+=2; - continue; - } - } - if(opts&restrict_dotdot) { - if( - ( rv.empty() && s[0]=='.' && s[1]=='.' && s[2]=='/' ) // "^../" - || ( s[0]=='/' && s[1]=='.' && s[2]=='.' && (s[3]==0 || s[3]=='/') ) // "/..(/|$)" - ) - throw utility_restricted_sequence(CODEPOINT,"restricted updir sequence encountered"); - } - rv += *s; - if( (*s) != '/' ) - notslash=rv.length(); - } - if(!(opts&strip_trailing_slash)) - notslash++; - if(notslash<rv.length()) - rv.erase(notslash); // XXX: check the logic of stripping/not strippling trailing slash - return rv; - } - string strip_prefix(const string& str,const string& prefix) { @@ -69,29 +34,2 @@ namespace sitecing { - string dir_name(const string& filename) { - string::size_type sl = filename.find_last_of('/'); - if(sl==string::npos) - return ""; // no slashes -- no dir. - string::size_type nosl = filename.find_last_not_of('/',sl); - if(nosl==string::npos) - return ""; // only slashes -- no dir. XXX: only slashes after the last slash... does it mean no dir? - return filename.substr(0,nosl+1); - } - - void make_path(const string& path,mode_t mode) { - struct stat st; - for(string::size_type sl=0;sl!=string::npos;sl=path.find('/',sl+1)) { - if(!sl) - continue; - string p = path.substr(0,sl); - if(stat(p.c_str(),&st) || !S_ISDIR(st.st_mode)) { - if(mkdir(p.c_str(),mode)) - throw konforka::exception(CODEPOINT,"failed to mkdir()"); - } - } - if(stat(path.c_str(),&st) || !S_ISDIR(st.st_mode)) { - if(mkdir(path.c_str(),mode)) - throw konforka::exception(CODEPOINT,"failed to mkdir()"); - } - } - void file_lock::lock(const string& f) { @@ -206,57 +144,2 @@ namespace sitecing { - string combine_path(const string& origin,const string& relative,int opts) { - string r = normalize_path(relative,0); - string rv; - // XXX: what to do if relative is empty is a question, really. - if(r.empty()) { - return normalize_path( (opts&origin_is_file)?dir_name(origin):origin ,strip_leading_slash|restrict_dotdot|strip_trailing_slash); - }else{ - if(r[0]=='/') { - r.erase(0,1); - }else{ - rv = normalize_path((opts&origin_is_file)?dir_name(origin):origin,restrict_dotdot|strip_trailing_slash); - } - } - string::size_type lsl = rv.rfind('/'); - for(string::size_type sl=r.find('/');sl!=string::npos;sl=r.find('/')) { - assert(sl!=0); - if(sl==1 && r[0]=='.') { - // it's a "./" - r.erase(0,2); - }else if(sl==2 && r[0]=='.' && r[1]=='.') { - // we have a "../" - if(lsl==string::npos) { - if(rv.empty() && (opts&fail_beyond_root)) - throw utility_beyond_root(CODEPOINT,"went beyond root while combining path"); - rv.clear(); - }else{ - rv.erase(lsl); - lsl = rv.rfind('/'); - } - r.erase(0,3); - }else{ - // we have a "something/" - lsl = rv.length(); - rv += '/'; - rv += r.substr(0,sl); - r.erase(0,sl+1); - } - } - if(r.empty()) - return rv+'/'; - if(r.length()==2 && r[0]=='.' && r[0]=='.') { - if(lsl==string::npos) { - if(rv.empty() & (opts&fail_beyond_root)) - throw utility_beyond_root(CODEPOINT,"went beyond root while combining path"); - return "/"; - }else{ - rv.erase(lsl+1); - return rv; - } - } - rv += '/'; - rv += r; - return rv; - } - void auto_chdir::pushdir(const string& td,bool ap) { diff --git a/lib/sitespace.cc b/lib/sitespace.cc index 0406d11..d5592bf 100644 --- a/lib/sitespace.cc +++ b/lib/sitespace.cc @@ -4,2 +4,3 @@ #include <cassert> + #include <konforka/util.h> #include "sitecing/sitespace.h" @@ -22,3 +23,3 @@ namespace sitecing { execute_sentenced(); - string sobase = normalize_path(c); + string sobase = konforka::normalize_path(c); string sopath = factory.root_so+sobase+".so"; diff --git a/src/sitecing-build.cc b/src/sitecing-build.cc index 4cad0a3..887ef83 100644 --- a/src/sitecing-build.cc +++ b/src/sitecing-build.cc @@ -9,2 +9,3 @@ using namespace std; +#include <konforka/util.h> #include "sitecing/sitecing_util.h" @@ -80,3 +81,3 @@ void build_http_status_handlers(const string& target) { string t = "/"; - t += normalize_path(target,strip_leading_slash); + t += konforka::normalize_path(target,konforka::strip_leading_slash); for(;;) { @@ -149,3 +150,3 @@ void build(const string& target) { continue; - string subtarget = normalize_path(target+"/"+de->d_name); + string subtarget = konforka::normalize_path(target+"/"+de->d_name); struct stat sts; diff --git a/src/sitecing-fastcgi.cc b/src/sitecing-fastcgi.cc index 756dcee..03587aa 100644 --- a/src/sitecing-fastcgi.cc +++ b/src/sitecing-fastcgi.cc @@ -167,3 +167,3 @@ void sitecing_fastcgi_pm::process(int slot) { try { - component_path = normalize_path(gw.path_info(),strip_leading_slash|strip_trailing_slash); + component_path = konforka::normalize_path(gw.path_info(),konforka::strip_leading_slash|konforka::strip_trailing_slash); string full_component_path; @@ -186,3 +186,3 @@ void sitecing_fastcgi_pm::process(int slot) { } - string pwd = dir_name(full_component_path); + string pwd = konforka::dir_name(full_component_path); if(chdir(pwd.c_str())) diff --git a/src/sitecing-plaincgi.cc b/src/sitecing-plaincgi.cc index 3bd291a..2f93cc5 100644 --- a/src/sitecing-plaincgi.cc +++ b/src/sitecing-plaincgi.cc @@ -52,3 +52,3 @@ void process_request(configuration& config) { try { - component_path = normalize_path(gw.path_info(),strip_leading_slash|strip_trailing_slash); + component_path = konforka::normalize_path(gw.path_info(),konforka::strip_leading_slash|konforka::strip_trailing_slash); string full_component_path; @@ -71,3 +71,3 @@ void process_request(configuration& config) { } - string pwd = dir_name(full_component_path); + string pwd = konforka::dir_name(full_component_path); if(chdir(pwd.c_str())) |