summaryrefslogtreecommitdiffabout
path: root/src
authorMichael Krelin <hacker@klever.net>2005-04-25 16:36:32 (UTC)
committer Michael Krelin <hacker@klever.net>2005-04-25 16:36:32 (UTC)
commit981b219f5297ad2ccc1fc1d0e24e41ec009c35a3 (patch) (unidiff)
tree9fa81d7fe70883ad26d946c902ba06edcebd4516 /src
parent54e344b7e3623e807b893b7febad3adfc6c1648f (diff)
downloadsitecing-981b219f5297ad2ccc1fc1d0e24e41ec009c35a3.zip
sitecing-981b219f5297ad2ccc1fc1d0e24e41ec009c35a3.tar.gz
sitecing-981b219f5297ad2ccc1fc1d0e24e41ec009c35a3.tar.bz2
moved a few utility functions to konforka and bumped konforka version requirement accordingly
Diffstat (limited to 'src') (more/less context) (ignore whitespace changes)
-rw-r--r--src/sitecing-build.cc5
-rw-r--r--src/sitecing-fastcgi.cc4
-rw-r--r--src/sitecing-plaincgi.cc4
3 files changed, 7 insertions, 6 deletions
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
@@ -1,198 +1,199 @@
1#include <sys/types.h> 1#include <sys/types.h>
2#include <dirent.h> 2#include <dirent.h>
3#include <getopt.h> 3#include <getopt.h>
4#include <iostream> 4#include <iostream>
5#include <memory> 5#include <memory>
6#include <fstream> 6#include <fstream>
7#include <cassert> 7#include <cassert>
8#include <set> 8#include <set>
9using namespace std; 9using namespace std;
10#include <konforka/util.h>
10#include "sitecing/sitecing_util.h" 11#include "sitecing/sitecing_util.h"
11#include "sitecing/util.h" 12#include "sitecing/util.h"
12#include "sitecing/sitespace.h" 13#include "sitecing/sitespace.h"
13#include "sitecing/sitecing_interface_cgi.h" 14#include "sitecing/sitecing_interface_cgi.h"
14#include "sitecing/cgi_component.h" 15#include "sitecing/cgi_component.h"
15#include "sitecing/configuration.h" 16#include "sitecing/configuration.h"
16#include "sitecing/magic.h" 17#include "sitecing/magic.h"
17#include "sitecing/sitecing_exception.h" 18#include "sitecing/sitecing_exception.h"
18#include "sitecing/exception.h" 19#include "sitecing/exception.h"
19using namespace sitecing; 20using namespace sitecing;
20 21
21#include "config.h" 22#include "config.h"
22#define PHEADER PACKAGE "-build Version " VERSION 23#define PHEADER PACKAGE "-build Version " VERSION
23#define PCOPY "Copyright (c) 2004 Klever Group" 24#define PCOPY "Copyright (c) 2004 Klever Group"
24 25
25static sitespace* site_space = NULL; 26static sitespace* site_space = NULL;
26typedef pair<dev_t,ino_t> the_inode_t; 27typedef pair<dev_t,ino_t> the_inode_t;
27set<the_inode_t> built_inodes; 28set<the_inode_t> built_inodes;
28 29
29void build_component(const string& component) { 30void build_component(const string& component) {
30 assert(site_space); 31 assert(site_space);
31 cerr << "Building " << component << endl; 32 cerr << "Building " << component << endl;
32 try { 33 try {
33 site_space->factory.make(site_space->config.root_so+component+".so"); 34 site_space->factory.make(site_space->config.root_so+component+".so");
34 }catch(compile_error& ce) { 35 }catch(compile_error& ce) {
35 ce.see(CODEPOINT); 36 ce.see(CODEPOINT);
36 ifstream err((site_space->config.root_intermediate+ce.component_path+".stderr").c_str(),ios::in); 37 ifstream err((site_space->config.root_intermediate+ce.component_path+".stderr").c_str(),ios::in);
37 if(err) { 38 if(err) {
38 cerr << err.rdbuf(); 39 cerr << err.rdbuf();
39 } 40 }
40 throw; 41 throw;
41 }catch(preprocessor_error& pe) { 42 }catch(preprocessor_error& pe) {
42 pe.see(CODEPOINT); 43 pe.see(CODEPOINT);
43 cerr << site_space->config.root_source << pe.component_name << ":" << pe.line_number << ":" << pe.what() << endl; 44 cerr << site_space->config.root_source << pe.component_name << ":" << pe.line_number << ":" << pe.what() << endl;
44 throw; 45 throw;
45 } 46 }
46} 47}
47 48
48void build_imports(const string& component); 49void build_imports(const string& component);
49 50
50void build_with_imports(const string& component) { 51void build_with_imports(const string& component) {
51 assert(site_space); 52 assert(site_space);
52 struct stat st; 53 struct stat st;
53 string cp = site_space->config.root_source+component; 54 string cp = site_space->config.root_source+component;
54 if(!lstat(cp.c_str(),&st)) { 55 if(!lstat(cp.c_str(),&st)) {
55 if(built_inodes.find(the_inode_t(st.st_dev,st.st_ino))!=built_inodes.end()) 56 if(built_inodes.find(the_inode_t(st.st_dev,st.st_ino))!=built_inodes.end())
56 return; 57 return;
57 built_inodes.insert(the_inode_t(st.st_dev,st.st_ino)); 58 built_inodes.insert(the_inode_t(st.st_dev,st.st_ino));
58 } 59 }
59 build_component(component); 60 build_component(component);
60 build_imports(component); 61 build_imports(component);
61} 62}
62 63
63void build_imports(const string& component) { 64void build_imports(const string& component) {
64 assert(site_space); 65 assert(site_space);
65 ifstream ifs((site_space->config.root_intermediate+component+".imports").c_str(),ios::in); 66 ifstream ifs((site_space->config.root_intermediate+component+".imports").c_str(),ios::in);
66 cerr << "Building components imported by " << component << endl; 67 cerr << "Building components imported by " << component << endl;
67 if(ifs) { 68 if(ifs) {
68 string import; 69 string import;
69 while(!ifs.eof()) { 70 while(!ifs.eof()) {
70 ifs >> import; 71 ifs >> import;
71 if(!import.empty()) 72 if(!import.empty())
72 build_with_imports(import); 73 build_with_imports(import);
73 } 74 }
74 } 75 }
75} 76}
76 77
77void build_http_status_handlers(const string& target) { 78void build_http_status_handlers(const string& target) {
78 assert(site_space); 79 assert(site_space);
79 set<string> stop_list; 80 set<string> stop_list;
80 string t = "/"; 81 string t = "/";
81 t += normalize_path(target,strip_leading_slash); 82 t += konforka::normalize_path(target,konforka::strip_leading_slash);
82 for(;;) { 83 for(;;) {
83 if(t[t.length()-1]=='/') { 84 if(t[t.length()-1]=='/') {
84 loaded_options* lo = site_space->config.lookup_loaded_options(t); 85 loaded_options* lo = site_space->config.lookup_loaded_options(t);
85 if( lo && (lo->flags&config_options::flag_http_status_handlers) ) { 86 if( lo && (lo->flags&config_options::flag_http_status_handlers) ) {
86 for(config_options::http_status_handlers_t::const_iterator i=lo->http_status_handlers.begin();i!=lo->http_status_handlers.end();++i) { 87 for(config_options::http_status_handlers_t::const_iterator i=lo->http_status_handlers.begin();i!=lo->http_status_handlers.end();++i) {
87 if(stop_list.find(i->first)==stop_list.end()) { 88 if(stop_list.find(i->first)==stop_list.end()) {
88 build_with_imports(i->second); 89 build_with_imports(i->second);
89 stop_list.insert(i->first); 90 stop_list.insert(i->first);
90 } 91 }
91 } 92 }
92 } 93 }
93 } 94 }
94 configuration::specs_t::iterator i=site_space->config.specs.find(t); 95 configuration::specs_t::iterator i=site_space->config.specs.find(t);
95 if( i!=site_space->config.specs.end() && (i->second.flags&config_options::flag_http_status_handlers) ) { 96 if( i!=site_space->config.specs.end() && (i->second.flags&config_options::flag_http_status_handlers) ) {
96 for(config_options::http_status_handlers_t::const_iterator ii=i->second.http_status_handlers.begin();ii!=i->second.http_status_handlers.end();++i) { 97 for(config_options::http_status_handlers_t::const_iterator ii=i->second.http_status_handlers.begin();ii!=i->second.http_status_handlers.end();++i) {
97 if(stop_list.find(ii->first)==stop_list.end()) { 98 if(stop_list.find(ii->first)==stop_list.end()) {
98 build_with_imports(ii->second); 99 build_with_imports(ii->second);
99 stop_list.insert(ii->first); 100 stop_list.insert(ii->first);
100 } 101 }
101 } 102 }
102 } 103 }
103 if(t.empty()) 104 if(t.empty())
104 return; 105 return;
105 string::size_type sl=t.rfind('/'); 106 string::size_type sl=t.rfind('/');
106 if(sl==string::npos) { 107 if(sl==string::npos) {
107 t.erase(); 108 t.erase();
108 }else{ 109 }else{
109 if(sl==(t.length()-1)) 110 if(sl==(t.length()-1))
110 t.erase(sl); 111 t.erase(sl);
111 else 112 else
112 t.erase(sl+1); 113 t.erase(sl+1);
113 } 114 }
114 } 115 }
115} 116}
116 117
117void build_target(const string& target) { 118void build_target(const string& target) {
118 assert(site_space); 119 assert(site_space);
119 string action = target; 120 string action = target;
120 config_options::action_handler_t *ah = site_space->config.lookup_action_handler(target); 121 config_options::action_handler_t *ah = site_space->config.lookup_action_handler(target);
121 if(ah) 122 if(ah)
122 action = ah->action; 123 action = ah->action;
123 build_with_imports(action); 124 build_with_imports(action);
124} 125}
125 126
126void build(const string& target) { 127void build(const string& target) {
127 assert(site_space); 128 assert(site_space);
128 build_http_status_handlers(target); 129 build_http_status_handlers(target);
129 config_options *co_exception_handler = site_space->config.lookup_config(target,config_options::flag_exception_handler); 130 config_options *co_exception_handler = site_space->config.lookup_config(target,config_options::flag_exception_handler);
130 if(co_exception_handler) { 131 if(co_exception_handler) {
131 string handler = co_exception_handler->exception_handler; 132 string handler = co_exception_handler->exception_handler;
132 build_with_imports(handler); 133 build_with_imports(handler);
133 } 134 }
134 string target_source = site_space->config.root_source+target; 135 string target_source = site_space->config.root_source+target;
135 struct stat st; 136 struct stat st;
136 if(stat(target_source.c_str(),&st)) 137 if(stat(target_source.c_str(),&st))
137 throw konforka::exception(CODEPOINT,"failed to stat() target"); 138 throw konforka::exception(CODEPOINT,"failed to stat() target");
138 if(S_ISREG(st.st_mode)) { 139 if(S_ISREG(st.st_mode)) {
139 build_target(target); 140 build_target(target);
140 }else if(S_ISDIR(st.st_mode)) { 141 }else if(S_ISDIR(st.st_mode)) {
141 build_http_status_handlers(target); 142 build_http_status_handlers(target);
142 DIR *d=opendir(target_source.c_str()); 143 DIR *d=opendir(target_source.c_str());
143 if(!d) 144 if(!d)
144 throw konforka::exception(CODEPOINT,"failed to opendir()"); 145 throw konforka::exception(CODEPOINT,"failed to opendir()");
145 for(struct dirent *de=readdir(d);de;de=readdir(d)) { 146 for(struct dirent *de=readdir(d);de;de=readdir(d)) {
146 if(!strcmp(de->d_name,".")) 147 if(!strcmp(de->d_name,"."))
147 continue; 148 continue;
148 if(!strcmp(de->d_name,"..")) 149 if(!strcmp(de->d_name,".."))
149 continue; 150 continue;
150 string subtarget = normalize_path(target+"/"+de->d_name); 151 string subtarget = konforka::normalize_path(target+"/"+de->d_name);
151 struct stat sts; 152 struct stat sts;
152 if(stat((site_space->config.root_source+subtarget).c_str(),&sts)) 153 if(stat((site_space->config.root_source+subtarget).c_str(),&sts))
153 throw konforka::exception(CODEPOINT,"failed to stat() subtarget"); 154 throw konforka::exception(CODEPOINT,"failed to stat() subtarget");
154 if(S_ISDIR(sts.st_mode)) { 155 if(S_ISDIR(sts.st_mode)) {
155 build(subtarget); 156 build(subtarget);
156 }else{ 157 }else{
157 if(site_space->config.match_autobuild_files(target,de->d_name)){ 158 if(site_space->config.match_autobuild_files(target,de->d_name)){
158 build_target(subtarget); 159 build_target(subtarget);
159 } 160 }
160 } 161 }
161 } 162 }
162 closedir(d); 163 closedir(d);
163 } 164 }
164} 165}
165 166
166int main(int argc,char **argv) { 167int main(int argc,char **argv) {
167 try { 168 try {
168 string config_file = "sitecing.conf"; 169 string config_file = "sitecing.conf";
169 while(true) { 170 while(true) {
170 static struct option opts[] = { 171 static struct option opts[] = {
171 { "help", no_argument, 0, 'h' }, 172 { "help", no_argument, 0, 'h' },
172 { "usage", no_argument, 0, 'h' }, 173 { "usage", no_argument, 0, 'h' },
173 { "version", no_argument, 0, 'V' }, 174 { "version", no_argument, 0, 'V' },
174 { "license", no_argument, 0, 'L' }, 175 { "license", no_argument, 0, 'L' },
175 { "config", required_argument, 0, 'f' }, 176 { "config", required_argument, 0, 'f' },
176 { NULL, 0, 0, 0 } 177 { NULL, 0, 0, 0 }
177 }; 178 };
178 int c = getopt_long(argc,argv,"f:hVL",opts,NULL); 179 int c = getopt_long(argc,argv,"f:hVL",opts,NULL);
179 if(c==-1) 180 if(c==-1)
180 break; 181 break;
181 switch(c) { 182 switch(c) {
182 case 'h': 183 case 'h':
183 cerr << PHEADER << endl 184 cerr << PHEADER << endl
184 << PCOPY << endl << endl 185 << PCOPY << endl << endl
185 << " -h, --help" << endl 186 << " -h, --help" << endl
186 << " --usage display this text" << endl 187 << " --usage display this text" << endl
187 << " -V, --version display version number" << endl 188 << " -V, --version display version number" << endl
188 << " -L, --license show license" << endl 189 << " -L, --license show license" << endl
189 << " -f filename, --config=filename" << endl 190 << " -f filename, --config=filename" << endl
190 << " specify configuration file to use" << endl; 191 << " specify configuration file to use" << endl;
191 exit(0); 192 exit(0);
192 break; 193 break;
193 case 'V': 194 case 'V':
194 cerr << VERSION << endl; 195 cerr << VERSION << endl;
195 exit(0); 196 exit(0);
196 break; 197 break;
197 case 'L': 198 case 'L':
198 extern const char *COPYING; 199 extern const char *COPYING;
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
@@ -120,116 +120,116 @@ sitecing_fastcgi_pm::sitecing_fastcgi_pm(const string& config_file)
120 throw konforka::exception(CODEPOINT,"failed to fork()"); 120 throw konforka::exception(CODEPOINT,"failed to fork()");
121 if(pf) { 121 if(pf) {
122 die_humbly=true; 122 die_humbly=true;
123 _exit(0); 123 _exit(0);
124 } 124 }
125 } 125 }
126 if(config.flags&configuration::flag_pid_file) { 126 if(config.flags&configuration::flag_pid_file) {
127 pidfile.set(config.pid_file); 127 pidfile.set(config.pid_file);
128 } 128 }
129 if(multi) 129 if(multi)
130 sem.init(); 130 sem.init();
131 } 131 }
132sitecing_fastcgi_pm::~sitecing_fastcgi_pm() { 132sitecing_fastcgi_pm::~sitecing_fastcgi_pm() {
133 if(fss) 133 if(fss)
134 delete fss; 134 delete fss;
135} 135}
136 136
137void sitecing_fastcgi_pm::process(int slot) { 137void sitecing_fastcgi_pm::process(int slot) {
138 signal(SIGINT,SIG_DFL); 138 signal(SIGINT,SIG_DFL);
139 signal(SIGABRT,SIG_DFL); 139 signal(SIGABRT,SIG_DFL);
140 signal(SIGTERM,SIG_DFL); 140 signal(SIGTERM,SIG_DFL);
141 give_up_privs(); 141 give_up_privs();
142 scoreboard_slot *sslot = sboard.get_slot(slot); 142 scoreboard_slot *sslot = sboard.get_slot(slot);
143 try { 143 try {
144 sitespace ss(config); 144 sitespace ss(config);
145 fcgi_socket& fs = *fss; 145 fcgi_socket& fs = *fss;
146 sitecing_interface_cgi scif(&ss); 146 sitecing_interface_cgi scif(&ss);
147 string component_path; 147 string component_path;
148 string action; 148 string action;
149 config_options::action_handler_t *action_handler; 149 config_options::action_handler_t *action_handler;
150 int rpc = 0; 150 int rpc = 0;
151 if(config.flags&configuration::flag_requests_per_child) 151 if(config.flags&configuration::flag_requests_per_child)
152 rpc = config.requests_per_child; 152 rpc = config.requests_per_child;
153 for(int req=0;(rpc<=0) || (req<rpc);rpc++) { 153 for(int req=0;(rpc<=0) || (req<rpc);rpc++) {
154 semaphore_lock sl; 154 semaphore_lock sl;
155 if(multi) { 155 if(multi) {
156 sslot->state = scoreboard_slot::state_idle; 156 sslot->state = scoreboard_slot::state_idle;
157 sl.sem = &sem; 157 sl.sem = &sem;
158 sl.lock(); 158 sl.lock();
159 } 159 }
160 sslot->state = scoreboard_slot::state_accept; 160 sslot->state = scoreboard_slot::state_accept;
161 fcgi_interface fi(fs); 161 fcgi_interface fi(fs);
162 sslot->state = scoreboard_slot::state_processing; 162 sslot->state = scoreboard_slot::state_processing;
163 if(multi) 163 if(multi)
164 sl.unlock(); 164 sl.unlock();
165 cgi_gateway gw(fi); 165 cgi_gateway gw(fi);
166 scif.prepare(&gw); 166 scif.prepare(&gw);
167 try { 167 try {
168 component_path = normalize_path(gw.path_info(),strip_leading_slash|strip_trailing_slash); 168 component_path = konforka::normalize_path(gw.path_info(),konforka::strip_leading_slash|konforka::strip_trailing_slash);
169 string full_component_path; 169 string full_component_path;
170 string sitecing_path_info; 170 string sitecing_path_info;
171 while(true) { 171 while(true) {
172 full_component_path = config.root_source+'/'+component_path; 172 full_component_path = config.root_source+'/'+component_path;
173 if(!access(full_component_path.c_str(),F_OK)) 173 if(!access(full_component_path.c_str(),F_OK))
174 break; 174 break;
175 string::size_type sl = component_path.rfind('/'); 175 string::size_type sl = component_path.rfind('/');
176 if(sl==string::npos) 176 if(sl==string::npos)
177 throw konforka::exception(CODEPOINT,"can't find the target component"); 177 throw konforka::exception(CODEPOINT,"can't find the target component");
178 sitecing_path_info.insert(0,component_path,sl,string::npos); 178 sitecing_path_info.insert(0,component_path,sl,string::npos);
179 component_path.erase(sl); 179 component_path.erase(sl);
180 } 180 }
181 fi.metavars["SITECING_PATH_INFO"]=sitecing_path_info; 181 fi.metavars["SITECING_PATH_INFO"]=sitecing_path_info;
182 action = component_path; 182 action = component_path;
183 action_handler = config.lookup_action_handler(component_path); 183 action_handler = config.lookup_action_handler(component_path);
184 if(action_handler) { 184 if(action_handler) {
185 action = action_handler->action; 185 action = action_handler->action;
186 } 186 }
187 string pwd = dir_name(full_component_path); 187 string pwd = konforka::dir_name(full_component_path);
188 if(chdir(pwd.c_str())) 188 if(chdir(pwd.c_str()))
189 throw konforka::exception(CODEPOINT,"failed to chdir() into document's directory"); 189 throw konforka::exception(CODEPOINT,"failed to chdir() into document's directory");
190 so_component soc = ss.fetch(action,&scif); 190 so_component soc = ss.fetch(action,&scif);
191 if(action_handler) { 191 if(action_handler) {
192 soc.ac->run(__magic_action, 192 soc.ac->run(__magic_action,
193 config.root_source.c_str(), config.root_intermediate.c_str(), config.root_so.c_str(), 193 config.root_source.c_str(), config.root_intermediate.c_str(), config.root_so.c_str(),
194 &(action_handler->args) 194 &(action_handler->args)
195 ); 195 );
196 }else{ 196 }else{
197 soc.ac->main(0,NULL); 197 soc.ac->main(0,NULL);
198 } 198 }
199 }catch(http_status& hs) { 199 }catch(http_status& hs) {
200 scif.headers["Status"] = hs.status+" "+hs.message; 200 scif.headers["Status"] = hs.status+" "+hs.message;
201 string hshp = config.lookup_http_status_handler(component_path,hs.status); 201 string hshp = config.lookup_http_status_handler(component_path,hs.status);
202 if(!hshp.empty()) { 202 if(!hshp.empty()) {
203 so_component hsh = ss.fetch(hshp,&scif); // TODO: handle error trying to handle status 203 so_component hsh = ss.fetch(hshp,&scif); // TODO: handle error trying to handle status
204 hsh.ac->run(__magic_http_status,config.root_source.c_str(),config.root_intermediate.c_str(), 204 hsh.ac->run(__magic_http_status,config.root_source.c_str(),config.root_intermediate.c_str(),
205 config.root_so.c_str(),action.c_str(),&hs); 205 config.root_so.c_str(),action.c_str(),&hs);
206 } 206 }
207 }catch(compile_error& ce) { 207 }catch(compile_error& ce) {
208 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler); 208 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
209 if(co_exception_handler) { 209 if(co_exception_handler) {
210 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error. 210 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
211 eh.ac->run(__magic_compile_error,ce.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),ce.component_path.c_str()); 211 eh.ac->run(__magic_compile_error,ce.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),ce.component_path.c_str());
212 }else{ 212 }else{
213 ce.see(CODEPOINT); 213 ce.see(CODEPOINT);
214 throw; 214 throw;
215 } 215 }
216 }catch(preprocessor_error& pe) { 216 }catch(preprocessor_error& pe) {
217 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler); 217 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
218 if(co_exception_handler) { 218 if(co_exception_handler) {
219 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error. 219 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
220 eh.ac->run(__magic_preprocess_error,pe.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),pe.component_name.c_str(),pe.line_number); 220 eh.ac->run(__magic_preprocess_error,pe.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),pe.component_name.c_str(),pe.line_number);
221 }else{ 221 }else{
222 pe.see(CODEPOINT); 222 pe.see(CODEPOINT);
223 throw; 223 throw;
224 } 224 }
225 }catch(exception& e) { 225 }catch(exception& e) {
226 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler); 226 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
227 if(co_exception_handler) { 227 if(co_exception_handler) {
228 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error. 228 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
229 eh.ac->run(__magic_generic_exception,e.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),component_path.c_str(),&e); 229 eh.ac->run(__magic_generic_exception,e.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),component_path.c_str(),&e);
230 } 230 }
231 } 231 }
232 scif.flush(); 232 scif.flush();
233 } 233 }
234 }catch(exception& e) { 234 }catch(exception& e) {
235 cerr << "->Oops: " << e.what() << endl; 235 cerr << "->Oops: " << e.what() << endl;
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
@@ -5,116 +5,116 @@
5#include <pwd.h> 5#include <pwd.h>
6#include <grp.h> 6#include <grp.h>
7#include <errno.h> 7#include <errno.h>
8#include <syslog.h> 8#include <syslog.h>
9#include <iostream> 9#include <iostream>
10#include <memory> 10#include <memory>
11#include <typeinfo> 11#include <typeinfo>
12using namespace std; 12using namespace std;
13#include "kingate/plaincgi.h" 13#include "kingate/plaincgi.h"
14#include "kingate/cgi_gateway.h" 14#include "kingate/cgi_gateway.h"
15using namespace kingate; 15using namespace kingate;
16#include "sitecing/sitecing_util.h" 16#include "sitecing/sitecing_util.h"
17#include "sitecing/util.h" 17#include "sitecing/util.h"
18#include "sitecing/sitespace.h" 18#include "sitecing/sitespace.h"
19#include "sitecing/sitecing_interface_cgi.h" 19#include "sitecing/sitecing_interface_cgi.h"
20#include "sitecing/cgi_component.h" 20#include "sitecing/cgi_component.h"
21#include "sitecing/configuration.h" 21#include "sitecing/configuration.h"
22#include "sitecing/magic.h" 22#include "sitecing/magic.h"
23#include "sitecing/sitecing_exception.h" 23#include "sitecing/sitecing_exception.h"
24#include "sitecing/exception.h" 24#include "sitecing/exception.h"
25using namespace sitecing; 25using namespace sitecing;
26 26
27#include "config.h" 27#include "config.h"
28#define PHEADER PACKAGE " Version " VERSION 28#define PHEADER PACKAGE " Version " VERSION
29#define PCOPY "Copyright (c) 2005 Klever Group" 29#define PCOPY "Copyright (c) 2005 Klever Group"
30 30
31class cdummyClass : public acomponent { 31class cdummyClass : public acomponent {
32 public: 32 public:
33 void main(int _magic,va_list _args) {} 33 void main(int _magic,va_list _args) {}
34 void *__the_most_derived_this() { return NULL; } 34 void *__the_most_derived_this() { return NULL; }
35} cdummyInstance; 35} cdummyInstance;
36class adummyClass : public cgi_component { 36class adummyClass : public cgi_component {
37 public: 37 public:
38 void main(int _magic,va_list _args) {} 38 void main(int _magic,va_list _args) {}
39 void *__the_most_derived_this() { return NULL; } 39 void *__the_most_derived_this() { return NULL; }
40} adummyInstance; 40} adummyInstance;
41 41
42void process_request(configuration& config) { 42void process_request(configuration& config) {
43 try { 43 try {
44 sitespace ss(config); 44 sitespace ss(config);
45 sitecing_interface_cgi scif(&ss); 45 sitecing_interface_cgi scif(&ss);
46 string component_path; 46 string component_path;
47 string action; 47 string action;
48 config_options::action_handler_t *action_handler; 48 config_options::action_handler_t *action_handler;
49 plaincgi_interface ci; 49 plaincgi_interface ci;
50 cgi_gateway gw(ci); 50 cgi_gateway gw(ci);
51 scif.prepare(&gw); 51 scif.prepare(&gw);
52 try { 52 try {
53 component_path = normalize_path(gw.path_info(),strip_leading_slash|strip_trailing_slash); 53 component_path = konforka::normalize_path(gw.path_info(),konforka::strip_leading_slash|konforka::strip_trailing_slash);
54 string full_component_path; 54 string full_component_path;
55 string sitecing_path_info; 55 string sitecing_path_info;
56 while(true) { 56 while(true) {
57 full_component_path = config.root_source+'/'+component_path; 57 full_component_path = config.root_source+'/'+component_path;
58 if(!access(full_component_path.c_str(),F_OK)) 58 if(!access(full_component_path.c_str(),F_OK))
59 break; 59 break;
60 string::size_type sl = component_path.rfind('/'); 60 string::size_type sl = component_path.rfind('/');
61 if(sl==string::npos) 61 if(sl==string::npos)
62 throw konforka::exception(CODEPOINT,"can't find the target component"); 62 throw konforka::exception(CODEPOINT,"can't find the target component");
63 sitecing_path_info.insert(0,component_path,sl,string::npos); 63 sitecing_path_info.insert(0,component_path,sl,string::npos);
64 component_path.erase(sl); 64 component_path.erase(sl);
65 } 65 }
66 ci.metavars["SITECING_PATH_INFO"]=sitecing_path_info; 66 ci.metavars["SITECING_PATH_INFO"]=sitecing_path_info;
67 action = component_path; 67 action = component_path;
68 action_handler = config.lookup_action_handler(component_path); 68 action_handler = config.lookup_action_handler(component_path);
69 if(action_handler) { 69 if(action_handler) {
70 action = action_handler->action; 70 action = action_handler->action;
71 } 71 }
72 string pwd = dir_name(full_component_path); 72 string pwd = konforka::dir_name(full_component_path);
73 if(chdir(pwd.c_str())) 73 if(chdir(pwd.c_str()))
74 throw konforka::exception(CODEPOINT,"failed to chdir() into document's directory"); 74 throw konforka::exception(CODEPOINT,"failed to chdir() into document's directory");
75 so_component soc = ss.fetch(action,&scif); 75 so_component soc = ss.fetch(action,&scif);
76 if(action_handler) { 76 if(action_handler) {
77 soc.ac->run(__magic_action, 77 soc.ac->run(__magic_action,
78 config.root_source.c_str(), config.root_intermediate.c_str(), config.root_so.c_str(), 78 config.root_source.c_str(), config.root_intermediate.c_str(), config.root_so.c_str(),
79 &(action_handler->args) 79 &(action_handler->args)
80 ); 80 );
81 }else{ 81 }else{
82 soc.ac->main(0,NULL); 82 soc.ac->main(0,NULL);
83 } 83 }
84 }catch(http_status& hs) { 84 }catch(http_status& hs) {
85 scif.headers["Status"] = hs.status+" "+hs.message; 85 scif.headers["Status"] = hs.status+" "+hs.message;
86 string hshp = config.lookup_http_status_handler(component_path,hs.status); 86 string hshp = config.lookup_http_status_handler(component_path,hs.status);
87 if(!hshp.empty()) { 87 if(!hshp.empty()) {
88 so_component hsh = ss.fetch(hshp,&scif); // TODO: handle error trying to handle status 88 so_component hsh = ss.fetch(hshp,&scif); // TODO: handle error trying to handle status
89 hsh.ac->run(__magic_http_status,config.root_source.c_str(),config.root_intermediate.c_str(), 89 hsh.ac->run(__magic_http_status,config.root_source.c_str(),config.root_intermediate.c_str(),
90 config.root_so.c_str(),action.c_str(),&hs); 90 config.root_so.c_str(),action.c_str(),&hs);
91 } 91 }
92 }catch(compile_error& ce) { 92 }catch(compile_error& ce) {
93 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler); 93 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
94 if(co_exception_handler) { 94 if(co_exception_handler) {
95 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error. 95 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
96 eh.ac->run(__magic_compile_error,ce.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),ce.component_path.c_str()); 96 eh.ac->run(__magic_compile_error,ce.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),ce.component_path.c_str());
97 }else{ 97 }else{
98 ce.see(CODEPOINT); 98 ce.see(CODEPOINT);
99 throw; 99 throw;
100 } 100 }
101 }catch(preprocessor_error& pe) { 101 }catch(preprocessor_error& pe) {
102 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler); 102 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
103 if(co_exception_handler) { 103 if(co_exception_handler) {
104 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error. 104 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
105 eh.ac->run(__magic_preprocess_error,pe.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),pe.component_name.c_str(),pe.line_number); 105 eh.ac->run(__magic_preprocess_error,pe.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),pe.component_name.c_str(),pe.line_number);
106 }else{ 106 }else{
107 pe.see(CODEPOINT); 107 pe.see(CODEPOINT);
108 throw; 108 throw;
109 } 109 }
110 }catch(exception& e) { 110 }catch(exception& e) {
111 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler); 111 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
112 if(co_exception_handler) { 112 if(co_exception_handler) {
113 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error. 113 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
114 eh.ac->run(__magic_generic_exception,e.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),component_path.c_str(),&e); 114 eh.ac->run(__magic_generic_exception,e.what(),config.root_source.c_str(),config.root_intermediate.c_str(),config.root_so.c_str(),component_path.c_str(),&e);
115 } 115 }
116 } 116 }
117 scif.flush(); 117 scif.flush();
118 }catch(exception& e) { 118 }catch(exception& e) {
119 cerr << "->Oops: " << e.what() << endl; 119 cerr << "->Oops: " << e.what() << endl;
120 } 120 }