summaryrefslogtreecommitdiffabout
path: root/src
Unidiff
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,231 +1,232 @@
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;
199 cerr << COPYING << endl; 200 cerr << COPYING << endl;
200 exit(0); 201 exit(0);
201 break; 202 break;
202 case 'f': 203 case 'f':
203 config_file = optarg; 204 config_file = optarg;
204 break; 205 break;
205 default: 206 default:
206 cerr << "Huh??" << endl; 207 cerr << "Huh??" << endl;
207 break; 208 break;
208 } 209 }
209 } 210 }
210 configuration config(config_file,true); 211 configuration config(config_file,true);
211 if(!(config.flags&configuration::flag_root_source)) 212 if(!(config.flags&configuration::flag_root_source))
212 throw konforka::exception(CODEPOINT,"Unspecified root for sources"); 213 throw konforka::exception(CODEPOINT,"Unspecified root for sources");
213 if(!(config.flags&configuration::flag_root_intermediate)) 214 if(!(config.flags&configuration::flag_root_intermediate))
214 throw konforka::exception(CODEPOINT,"Unspecified root for intermediate files"); 215 throw konforka::exception(CODEPOINT,"Unspecified root for intermediate files");
215 if(!(config.flags&configuration::flag_root_so)) 216 if(!(config.flags&configuration::flag_root_so))
216 throw konforka::exception(CODEPOINT,"Unspecified root for shared objects"); 217 throw konforka::exception(CODEPOINT,"Unspecified root for shared objects");
217 sitespace ss(config); 218 sitespace ss(config);
218 site_space = &ss; 219 site_space = &ss;
219 if(optind<argc) { 220 if(optind<argc) {
220 for(int narg=optind;narg<argc;narg++) { 221 for(int narg=optind;narg<argc;narg++) {
221 const char *arg = argv[narg]; 222 const char *arg = argv[narg];
222 build(arg); 223 build(arg);
223 } 224 }
224 }else 225 }else
225 build("/"); 226 build("/");
226 return 0; 227 return 0;
227 }catch(exception& e) { 228 }catch(exception& e) {
228 cerr << "Oops: " << e.what() << endl; 229 cerr << "Oops: " << e.what() << endl;
229 return 1; 230 return 1;
230 } 231 }
231} 232}
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
@@ -72,212 +72,212 @@ sitecing_fastcgi_pm::sitecing_fastcgi_pm(const string& config_file)
72 uid = strtol(config.user.c_str(),NULL,0); 72 uid = strtol(config.user.c_str(),NULL,0);
73 if(errno) 73 if(errno)
74 throw konforka::exception(CODEPOINT,"failed to resolve User value to uid"); 74 throw konforka::exception(CODEPOINT,"failed to resolve User value to uid");
75 } 75 }
76 } 76 }
77 if(config.flags&configuration::flag_group) { 77 if(config.flags&configuration::flag_group) {
78 struct group *gtmp = getgrnam(config.group.c_str()); 78 struct group *gtmp = getgrnam(config.group.c_str());
79 if(gtmp) { 79 if(gtmp) {
80 gid = gtmp->gr_gid; 80 gid = gtmp->gr_gid;
81 }else{ 81 }else{
82 errno=0; 82 errno=0;
83 gid = strtol(config.group.c_str(),NULL,0); 83 gid = strtol(config.group.c_str(),NULL,0);
84 if(errno) 84 if(errno)
85 throw konforka::exception(CODEPOINT,"failed to resolve Group value to gid"); 85 throw konforka::exception(CODEPOINT,"failed to resolve Group value to gid");
86 } 86 }
87 } 87 }
88 if(!(config.flags&configuration::flag_root_source)) 88 if(!(config.flags&configuration::flag_root_source))
89 throw konforka::exception(CODEPOINT,"unspecified root for sources"); 89 throw konforka::exception(CODEPOINT,"unspecified root for sources");
90 if(!(config.flags&configuration::flag_root_intermediate)) 90 if(!(config.flags&configuration::flag_root_intermediate))
91 throw konforka::exception(CODEPOINT,"unspecified root for intermediate files"); 91 throw konforka::exception(CODEPOINT,"unspecified root for intermediate files");
92 if(!(config.flags&configuration::flag_root_so)) 92 if(!(config.flags&configuration::flag_root_so))
93 throw konforka::exception(CODEPOINT,"unspecified root for shared objects"); 93 throw konforka::exception(CODEPOINT,"unspecified root for shared objects");
94 if(config.flags&configuration::flag_min_children) 94 if(config.flags&configuration::flag_min_children)
95 min_children = config.min_children; 95 min_children = config.min_children;
96 if(config.flags&configuration::flag_max_children) 96 if(config.flags&configuration::flag_max_children)
97 max_children = config.max_children; 97 max_children = config.max_children;
98 if(config.flags&configuration::flag_min_spare_children) 98 if(config.flags&configuration::flag_min_spare_children)
99 min_spare_children = config.min_spare_children; 99 min_spare_children = config.min_spare_children;
100 if(config.flags&configuration::flag_max_spare_children) 100 if(config.flags&configuration::flag_max_spare_children)
101 max_spare_children = config.max_spare_children; 101 max_spare_children = config.max_spare_children;
102 if(max_children<min_spare_children) 102 if(max_children<min_spare_children)
103 throw konforka::exception(CODEPOINT,"inconsistent numbers of MaxChildren and MinSpareChildren"); 103 throw konforka::exception(CODEPOINT,"inconsistent numbers of MaxChildren and MinSpareChildren");
104 if(min_children>max_spare_children && max_spare_children>=0) 104 if(min_children>max_spare_children && max_spare_children>=0)
105 throw konforka::exception(CODEPOINT,"inconsistent numbers of MinChildren and MaxSpareChildren"); 105 throw konforka::exception(CODEPOINT,"inconsistent numbers of MinChildren and MaxSpareChildren");
106 if(config.flags&configuration::flag_multi_process) { 106 if(config.flags&configuration::flag_multi_process) {
107 multi = config.multi_process; 107 multi = config.multi_process;
108 }else{ 108 }else{
109 if(config.flags&configuration::flag_listen_socket) 109 if(config.flags&configuration::flag_listen_socket)
110 multi = true; 110 multi = true;
111 else 111 else
112 multi = false; 112 multi = false;
113 } 113 }
114 fss = (config.flags&configuration::flag_listen_socket)?new fcgi_socket(config.listen_socket.c_str(),5):new fcgi_socket(0); 114 fss = (config.flags&configuration::flag_listen_socket)?new fcgi_socket(config.listen_socket.c_str(),5):new fcgi_socket(0);
115 if(!fss) 115 if(!fss)
116 throw konforka::exception(CODEPOINT,"failed to establish listening socket"); 116 throw konforka::exception(CODEPOINT,"failed to establish listening socket");
117 if(config.flags&configuration::flag_daemonize && config.daemonize) { 117 if(config.flags&configuration::flag_daemonize && config.daemonize) {
118 pid_t pf = fork(); 118 pid_t pf = fork();
119 if(pf<0) 119 if(pf<0)
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;
236 } 236 }
237} 237}
238 238
239void sitecing_fastcgi_pm::run() { 239void sitecing_fastcgi_pm::run() {
240 if(multi) 240 if(multi)
241 manage(); 241 manage();
242 else 242 else
243 process(0); 243 process(0);
244} 244}
245 245
246void sitecing_fastcgi_pm::give_up_privs() { 246void sitecing_fastcgi_pm::give_up_privs() {
247 if(config.flags&configuration::flag_chroot) { 247 if(config.flags&configuration::flag_chroot) {
248 if(chroot(config.chroot.c_str())) 248 if(chroot(config.chroot.c_str()))
249 throw konforka::exception(CODEPOINT,"failed to chroot()"); 249 throw konforka::exception(CODEPOINT,"failed to chroot()");
250 } 250 }
251 if(config.flags&configuration::flag_group) { 251 if(config.flags&configuration::flag_group) {
252 if((getgid()!=gid) && setgid(gid)) 252 if((getgid()!=gid) && setgid(gid))
253 throw konforka::exception(CODEPOINT,"failed to setgid()"); 253 throw konforka::exception(CODEPOINT,"failed to setgid()");
254 } 254 }
255 if(config.flags&configuration::flag_user) { 255 if(config.flags&configuration::flag_user) {
256 if((getuid()!=uid) && setuid(uid)) 256 if((getuid()!=uid) && setuid(uid))
257 throw konforka::exception(CODEPOINT,"failed to setuid()"); 257 throw konforka::exception(CODEPOINT,"failed to setuid()");
258 } 258 }
259} 259}
260 260
261static sitecing_fastcgi_pm* _process_manager = NULL; 261static sitecing_fastcgi_pm* _process_manager = NULL;
262 262
263static void lethal_signal_handler(int signum) { 263static void lethal_signal_handler(int signum) {
264 _process_manager->finishing=true; 264 _process_manager->finishing=true;
265} 265}
266 266
267int main(int argc,char **argv) { 267int main(int argc,char **argv) {
268 const char* id = *argv; 268 const char* id = *argv;
269 const char* t; 269 const char* t;
270 while(t = index(id,'/')) { 270 while(t = index(id,'/')) {
271 id=t; id++; 271 id=t; id++;
272 } 272 }
273 openlog(id,LOG_PERROR|LOG_PID,LOG_USER); 273 openlog(id,LOG_PERROR|LOG_PID,LOG_USER);
274 try { 274 try {
275 string config_file = "sitecing.conf"; 275 string config_file = "sitecing.conf";
276 while(true) { 276 while(true) {
277 static struct option opts[] = { 277 static struct option opts[] = {
278 { "help", no_argument, 0, 'h' }, 278 { "help", no_argument, 0, 'h' },
279 { "usage", no_argument, 0, 'h' }, 279 { "usage", no_argument, 0, 'h' },
280 { "version", no_argument, 0, 'V' }, 280 { "version", no_argument, 0, 'V' },
281 { "license", no_argument, 0, 'L' }, 281 { "license", no_argument, 0, 'L' },
282 { "config", required_argument, 0, 'f' }, 282 { "config", required_argument, 0, 'f' },
283 { NULL, 0, 0, 0 } 283 { NULL, 0, 0, 0 }
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
@@ -1,168 +1,168 @@
1#include <sys/types.h> 1#include <sys/types.h>
2#include <unistd.h> 2#include <unistd.h>
3#include <signal.h> 3#include <signal.h>
4#include <getopt.h> 4#include <getopt.h>
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 }
121} 121}
122 122
123int main(int argc,char **argv) { 123int main(int argc,char **argv) {
124 const char* id = *argv; 124 const char* id = *argv;
125 const char* t; 125 const char* t;
126 while(t = index(id,'/')) { 126 while(t = index(id,'/')) {
127 id=t; id++; 127 id=t; id++;
128 } 128 }
129 openlog(id,LOG_PERROR|LOG_PID,LOG_USER); 129 openlog(id,LOG_PERROR|LOG_PID,LOG_USER);
130 try { 130 try {
131 const char *esccf = getenv("SITECING_CONF"); 131 const char *esccf = getenv("SITECING_CONF");
132 string config_file = esccf ? esccf : "sitecing.conf"; 132 string config_file = esccf ? esccf : "sitecing.conf";
133 while(true) { 133 while(true) {
134 static struct option opts[] = { 134 static struct option opts[] = {
135 { "help", no_argument, 0, 'h' }, 135 { "help", no_argument, 0, 'h' },
136 { "usage", no_argument, 0, 'h' }, 136 { "usage", no_argument, 0, 'h' },
137 { "version", no_argument, 0, 'V' }, 137 { "version", no_argument, 0, 'V' },
138 { "license", no_argument, 0, 'L' }, 138 { "license", no_argument, 0, 'L' },
139 { "config", required_argument, 0, 'f' }, 139 { "config", required_argument, 0, 'f' },
140 { NULL, 0, 0, 0 } 140 { NULL, 0, 0, 0 }
141 }; 141 };
142 int c = getopt_long(argc,argv,"f:hVL",opts,NULL); 142 int c = getopt_long(argc,argv,"f:hVL",opts,NULL);
143 if(c==-1) 143 if(c==-1)
144 break; 144 break;
145 switch(c) { 145 switch(c) {
146 case 'h': 146 case 'h':
147 cerr << PHEADER << endl 147 cerr << PHEADER << endl
148 << PCOPY << endl << endl 148 << PCOPY << endl << endl
149 << " -h, --help" << endl 149 << " -h, --help" << endl
150 << " --usage display this text" << endl 150 << " --usage display this text" << endl
151 << " -V, --version display version number" << endl 151 << " -V, --version display version number" << endl
152 << " -L, --license show license" << endl 152 << " -L, --license show license" << endl
153 << " -f filename, --config=filename" << endl 153 << " -f filename, --config=filename" << endl
154 << " specify configuration file to use" << endl; 154 << " specify configuration file to use" << endl;
155 exit(0); 155 exit(0);
156 break; 156 break;
157 case 'V': 157 case 'V':
158 cerr << VERSION << endl; 158 cerr << VERSION << endl;
159 exit(0); 159 exit(0);
160 break; 160 break;
161 case 'L': 161 case 'L':
162 extern const char *COPYING; 162 extern const char *COPYING;
163 cerr << COPYING << endl; 163 cerr << COPYING << endl;
164 exit(0); 164 exit(0);
165 break; 165 break;
166 case 'f': 166 case 'f':
167 config_file = optarg; 167 config_file = optarg;
168 break; 168 break;