summaryrefslogtreecommitdiffabout
path: root/src
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
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') (more/less context) (ignore whitespace changes)
-rw-r--r--src/.gitignore1
-rw-r--r--src/Makefile.am21
-rw-r--r--src/sitecing-plaincgi.cc178
3 files changed, 198 insertions, 2 deletions
diff --git a/src/.gitignore b/src/.gitignore
index 6c2c79e..76716d5 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -6,4 +6,5 @@ COPYING.o
6.deps 6.deps
7COPYING.cc 7COPYING.cc
8Makefile 8Makefile
9sitecing-plaincgi
9*.o 10*.o
diff --git a/src/Makefile.am b/src/Makefile.am
index cc33f3f..2ec650d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,20 +1,37 @@
1bin_PROGRAMS = sitecing-fastcgi sitecing-build 1bin_PROGRAMS = sitecing-build
2
3if HAVE_FCGI
4bin_PROGRAMS += sitecing-fastcgi
5endif
6if HAVE_PLAINCGI
7bin_PROGRAMS += sitecing-plaincgi
8endif
2 9
3INCLUDES = -I${top_srcdir}/include ${KINGATE_CFLAGS} ${DOTCONF_CFLAGS} \ 10INCLUDES = -I${top_srcdir}/include ${KINGATE_CFLAGS} ${DOTCONF_CFLAGS} \
4 ${PCREPP_CFLAGS} 11 ${PCREPP_CFLAGS}
5LIBS += ${top_builddir}/lib/libsitecing.la ${KINGATE_LIBS} ${DOTCONF_LIBS} \ 12LIBS += ${top_builddir}/lib/libsitecing.la ${DOTCONF_LIBS} \
6 ${PCREPP_LIBS} 13 ${PCREPP_LIBS}
7 14
8sitecing_fastcgi_SOURCES = sitecing-fastcgi.cc \ 15sitecing_fastcgi_SOURCES = sitecing-fastcgi.cc \
9 COPYING.cc 16 COPYING.cc
17sitecing_fastcgi_LDADD = ${KINGATE_FCGI_LIBS}
10sitecing_fastcgi_LDFLAGS = -rdynamic 18sitecing_fastcgi_LDFLAGS = -rdynamic
11sitecing_fastcgi_DEPENDENCIES = ${top_builddir}/lib/libsitecing.la 19sitecing_fastcgi_DEPENDENCIES = ${top_builddir}/lib/libsitecing.la
12 20
21sitecing_plaincgi_SOURCES = sitecing-plaincgi.cc \
22 COPYING.cc
23sitecing_plaincgi_LDFLAGS = -rdynamic
24sitecing_plaincgi_LDADD = ${KINGATE_PLAINCGI_LIBS}
25sitecing_plaincgi_DEPENDENCIES = ${top_builddir}/lib/libsitecing.la
26
13sitecing_build_SOURCES = sitecing-build.cc \ 27sitecing_build_SOURCES = sitecing-build.cc \
14 COPYING.cc 28 COPYING.cc
29sitecing_build_LDADD = ${KINGATE_LIBS}
15sitecing_build_DEPENDENCIES = ${top_builddir}/lib/libsitecing.la 30sitecing_build_DEPENDENCIES = ${top_builddir}/lib/libsitecing.la
16 31
17COPYING.cc: ${top_srcdir}/COPYING 32COPYING.cc: ${top_srcdir}/COPYING
18 echo "const char * COPYING =" >$@ || (rm $@;exit 1) 33 echo "const char * COPYING =" >$@ || (rm $@;exit 1)
19 sed 's/"/\\"/g' $< | sed 's/^/\"/' | sed 's/$$/\\n\"/' >>$@ || (rm $@;exit 1) 34 sed 's/"/\\"/g' $< | sed 's/^/\"/' | sed 's/$$/\\n\"/' >>$@ || (rm $@;exit 1)
20 echo ";" >>$@ || (rm $@;exit 1) 35 echo ";" >>$@ || (rm $@;exit 1)
36
37EXTRA_DIST = ${sitecing_fastcgi_SOURCES} ${sitecing_PLAINCGI_SOURCES}
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}