summaryrefslogtreecommitdiffabout
path: root/src/sitecing-plaincgi.cc
authorMichael Krelin <hacker@klever.net>2005-02-13 17:01:51 (UTC)
committer Michael Krelin <hacker@klever.net>2005-02-13 17:01:51 (UTC)
commit9aa669090e978dce5e1f4d1ca9d23a4d92208518 (patch) (unidiff)
tree37b8b1a8df046d2154af30f85f251ca5271672e5 /src/sitecing-plaincgi.cc
parentce1f37aae46ea95020d7b865f7a80e8abdfad0d8 (diff)
downloadsitecing-9aa669090e978dce5e1f4d1ca9d23a4d92208518.zip
sitecing-9aa669090e978dce5e1f4d1ca9d23a4d92208518.tar.gz
sitecing-9aa669090e978dce5e1f4d1ca9d23a4d92208518.tar.bz2
1. made fastcgi support optional
2. added 'plain' cgi support (kingate 0.0.1 required for it) 3. bumped version to 0.0.1 4. excluded doxygen 'dox' target from 'all'
Diffstat (limited to 'src/sitecing-plaincgi.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--src/sitecing-plaincgi.cc178
1 files changed, 178 insertions, 0 deletions
diff --git a/src/sitecing-plaincgi.cc b/src/sitecing-plaincgi.cc
new file mode 100644
index 0000000..1cd99ac
--- a/dev/null
+++ b/src/sitecing-plaincgi.cc
@@ -0,0 +1,178 @@
1#include <sys/types.h>
2#include <unistd.h>
3#include <signal.h>
4#include <getopt.h>
5#include <pwd.h>
6#include <grp.h>
7#include <errno.h>
8#include <syslog.h>
9#include <iostream>
10#include <memory>
11#include <typeinfo>
12using namespace std;
13#include "kingate/plaincgi.h"
14#include "kingate/cgi_gateway.h"
15using namespace kingate;
16#include "sitecing/sitecing_util.h"
17#include "sitecing/util.h"
18#include "sitecing/sitespace.h"
19#include "sitecing/sitecing_interface_cgi.h"
20#include "sitecing/cgi_component.h"
21#include "sitecing/configuration.h"
22#include "sitecing/magic.h"
23#include "sitecing/sitecing_exception.h"
24#include "sitecing/exception.h"
25using namespace sitecing;
26
27#include "config.h"
28#define PHEADER PACKAGE " Version " VERSION
29#define PCOPY "Copyright (c) 2005 Klever Group"
30
31class cdummyClass : public acomponent {
32 public:
33 void main(int _magic,va_list _args) {}
34 void *__the_most_derived_this() { return NULL; }
35} cdummyInstance;
36class adummyClass : public cgi_component {
37 public:
38 void main(int _magic,va_list _args) {}
39 void *__the_most_derived_this() { return NULL; }
40} adummyInstance;
41
42void process_request(configuration& config) {
43 try {
44 sitespace ss(config);
45 sitecing_interface_cgi scif(&ss);
46 string component_path;
47 string action;
48 config_options::action_handler_t *action_handler;
49 plaincgi_interface ci;
50 cgi_gateway gw(ci);
51 scif.prepare(&gw);
52 try {
53 component_path = normalize_path(gw.get_meta("PATH_INFO"),strip_leading_slash|strip_trailing_slash);
54 string full_component_path;
55 while(true) {
56 full_component_path = config.root_source+'/'+component_path;
57 if(!access(full_component_path.c_str(),F_OK))
58 break;
59 string::size_type sl = component_path.rfind('/');
60 if(sl==string::npos)
61 throw konforka::exception(CODEPOINT,"can't find the target component");
62 component_path.erase(sl);
63 }
64 action = component_path;
65 action_handler = config.lookup_action_handler(component_path);
66 if(action_handler) {
67 action = action_handler->action;
68 }
69 string pwd = dir_name(full_component_path);
70 if(chdir(pwd.c_str()))
71 throw konforka::exception(CODEPOINT,"failed to chdir() into document's directory");
72 so_component soc = ss.fetch(action,&scif);
73 if(action_handler) {
74 soc.ac->run(__magic_action,
75 config.root_source.c_str(), config.root_intermediate.c_str(), config.root_so.c_str(),
76 &(action_handler->args)
77 );
78 }else{
79 soc.ac->main(0,NULL);
80 }
81 }catch(http_status& hs) {
82 scif.headers["Status"] = hs.status+" "+hs.message;
83 string hshp = config.lookup_http_status_handler(component_path,hs.status);
84 if(!hshp.empty()) {
85 so_component hsh = ss.fetch(hshp,&scif); // TODO: handle error trying to handle status
86 hsh.ac->run(__magic_http_status,config.root_source.c_str(),config.root_intermediate.c_str(),
87 config.root_so.c_str(),action.c_str(),&hs);
88 }
89 }catch(compile_error& ce) {
90 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
91 if(co_exception_handler) {
92 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
93 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());
94 }else{
95 ce.see(CODEPOINT);
96 throw;
97 }
98 }catch(preprocessor_error& pe) {
99 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
100 if(co_exception_handler) {
101 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
102 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);
103 }else{
104 pe.see(CODEPOINT);
105 throw;
106 }
107 }catch(exception& e) {
108 config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
109 if(co_exception_handler) {
110 so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
111 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);
112 }
113 }
114 scif.flush();
115 }catch(exception& e) {
116 cerr << "->Oops: " << e.what() << endl;
117 }
118}
119
120int main(int argc,char **argv) {
121 const char* id = *argv;
122 const char* t;
123 while(t = index(id,'/')) {
124 id=t; id++;
125 }
126 openlog(id,LOG_PERROR|LOG_PID,LOG_USER);
127 try {
128 const char *esccf = getenv("SITECING_CONF");
129 string config_file = esccf ? esccf : "sitecing.conf";
130 while(true) {
131 static struct option opts[] = {
132 { "help", no_argument, 0, 'h' },
133 { "usage", no_argument, 0, 'h' },
134 { "version", no_argument, 0, 'V' },
135 { "license", no_argument, 0, 'L' },
136 { "config", required_argument, 0, 'f' },
137 { NULL, 0, 0, 0 }
138 };
139 int c = getopt_long(argc,argv,"f:hVL",opts,NULL);
140 if(c==-1)
141 break;
142 switch(c) {
143 case 'h':
144 cerr << PHEADER << endl
145 << PCOPY << endl << endl
146 << " -h, --help" << endl
147 << " --usage display this text" << endl
148 << " -V, --version display version number" << endl
149 << " -L, --license show license" << endl
150 << " -f filename, --config=filename" << endl
151 << " specify configuration file to use" << endl;
152 exit(0);
153 break;
154 case 'V':
155 cerr << VERSION << endl;
156 exit(0);
157 break;
158 case 'L':
159 extern const char *COPYING;
160 cerr << COPYING << endl;
161 exit(0);
162 break;
163 case 'f':
164 config_file = optarg;
165 break;
166 default:
167 cerr << "Huh??" << endl;
168 break;
169 }
170 }
171 configuration config(config_file);
172 process_request(config);
173 }catch(exception& e) {
174 /* cerr << "Oops: " << e.what() << endl; */
175 syslog(LOG_ERR,"uncaught exception: %s",e.what());
176 }
177 closelog();
178}