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) (side-by-side diff)
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) (show 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
@@ -3,7 +3,8 @@ sitecing-build
sitecing-fastcgi
COPYING.o
.libs
.deps
COPYING.cc
Makefile
+sitecing-plaincgi
*.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 @@
-bin_PROGRAMS = sitecing-fastcgi sitecing-build
+bin_PROGRAMS = sitecing-build
+
+if HAVE_FCGI
+bin_PROGRAMS += sitecing-fastcgi
+endif
+if HAVE_PLAINCGI
+bin_PROGRAMS += sitecing-plaincgi
+endif
INCLUDES = -I${top_srcdir}/include ${KINGATE_CFLAGS} ${DOTCONF_CFLAGS} \
${PCREPP_CFLAGS}
-LIBS += ${top_builddir}/lib/libsitecing.la ${KINGATE_LIBS} ${DOTCONF_LIBS} \
+LIBS += ${top_builddir}/lib/libsitecing.la ${DOTCONF_LIBS} \
${PCREPP_LIBS}
sitecing_fastcgi_SOURCES = sitecing-fastcgi.cc \
COPYING.cc
+sitecing_fastcgi_LDADD = ${KINGATE_FCGI_LIBS}
sitecing_fastcgi_LDFLAGS = -rdynamic
sitecing_fastcgi_DEPENDENCIES = ${top_builddir}/lib/libsitecing.la
+sitecing_plaincgi_SOURCES = sitecing-plaincgi.cc \
+ COPYING.cc
+sitecing_plaincgi_LDFLAGS = -rdynamic
+sitecing_plaincgi_LDADD = ${KINGATE_PLAINCGI_LIBS}
+sitecing_plaincgi_DEPENDENCIES = ${top_builddir}/lib/libsitecing.la
+
sitecing_build_SOURCES = sitecing-build.cc \
COPYING.cc
+sitecing_build_LDADD = ${KINGATE_LIBS}
sitecing_build_DEPENDENCIES = ${top_builddir}/lib/libsitecing.la
COPYING.cc: ${top_srcdir}/COPYING
echo "const char * COPYING =" >$@ || (rm $@;exit 1)
sed 's/"/\\"/g' $< | sed 's/^/\"/' | sed 's/$$/\\n\"/' >>$@ || (rm $@;exit 1)
echo ";" >>$@ || (rm $@;exit 1)
+
+EXTRA_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 @@
+#include <sys/types.h>
+#include <unistd.h>
+#include <signal.h>
+#include <getopt.h>
+#include <pwd.h>
+#include <grp.h>
+#include <errno.h>
+#include <syslog.h>
+#include <iostream>
+#include <memory>
+#include <typeinfo>
+using namespace std;
+#include "kingate/plaincgi.h"
+#include "kingate/cgi_gateway.h"
+using namespace kingate;
+#include "sitecing/sitecing_util.h"
+#include "sitecing/util.h"
+#include "sitecing/sitespace.h"
+#include "sitecing/sitecing_interface_cgi.h"
+#include "sitecing/cgi_component.h"
+#include "sitecing/configuration.h"
+#include "sitecing/magic.h"
+#include "sitecing/sitecing_exception.h"
+#include "sitecing/exception.h"
+using namespace sitecing;
+
+#include "config.h"
+#define PHEADER PACKAGE " Version " VERSION
+#define PCOPY "Copyright (c) 2005 Klever Group"
+
+class cdummyClass : public acomponent {
+ public:
+ void main(int _magic,va_list _args) {}
+ void *__the_most_derived_this() { return NULL; }
+} cdummyInstance;
+class adummyClass : public cgi_component {
+ public:
+ void main(int _magic,va_list _args) {}
+ void *__the_most_derived_this() { return NULL; }
+} adummyInstance;
+
+void process_request(configuration& config) {
+ try {
+ sitespace ss(config);
+ sitecing_interface_cgi scif(&ss);
+ string component_path;
+ string action;
+ config_options::action_handler_t *action_handler;
+ plaincgi_interface ci;
+ cgi_gateway gw(ci);
+ scif.prepare(&gw);
+ try {
+ component_path = normalize_path(gw.get_meta("PATH_INFO"),strip_leading_slash|strip_trailing_slash);
+ string full_component_path;
+ while(true) {
+ full_component_path = config.root_source+'/'+component_path;
+ if(!access(full_component_path.c_str(),F_OK))
+ break;
+ string::size_type sl = component_path.rfind('/');
+ if(sl==string::npos)
+ throw konforka::exception(CODEPOINT,"can't find the target component");
+ component_path.erase(sl);
+ }
+ action = component_path;
+ action_handler = config.lookup_action_handler(component_path);
+ if(action_handler) {
+ action = action_handler->action;
+ }
+ string pwd = dir_name(full_component_path);
+ if(chdir(pwd.c_str()))
+ throw konforka::exception(CODEPOINT,"failed to chdir() into document's directory");
+ so_component soc = ss.fetch(action,&scif);
+ if(action_handler) {
+ soc.ac->run(__magic_action,
+ config.root_source.c_str(), config.root_intermediate.c_str(), config.root_so.c_str(),
+ &(action_handler->args)
+ );
+ }else{
+ soc.ac->main(0,NULL);
+ }
+ }catch(http_status& hs) {
+ scif.headers["Status"] = hs.status+" "+hs.message;
+ string hshp = config.lookup_http_status_handler(component_path,hs.status);
+ if(!hshp.empty()) {
+ so_component hsh = ss.fetch(hshp,&scif); // TODO: handle error trying to handle status
+ hsh.ac->run(__magic_http_status,config.root_source.c_str(),config.root_intermediate.c_str(),
+ config.root_so.c_str(),action.c_str(),&hs);
+ }
+ }catch(compile_error& ce) {
+ config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
+ if(co_exception_handler) {
+ so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
+ 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());
+ }else{
+ ce.see(CODEPOINT);
+ throw;
+ }
+ }catch(preprocessor_error& pe) {
+ config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
+ if(co_exception_handler) {
+ so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
+ 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);
+ }else{
+ pe.see(CODEPOINT);
+ throw;
+ }
+ }catch(exception& e) {
+ config_options *co_exception_handler = config.lookup_config(component_path,config_options::flag_exception_handler);
+ if(co_exception_handler) {
+ so_component eh = ss.fetch(co_exception_handler->exception_handler,&scif); // TODO: handle error trying to handle error.
+ 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);
+ }
+ }
+ scif.flush();
+ }catch(exception& e) {
+ cerr << "->Oops: " << e.what() << endl;
+ }
+}
+
+int main(int argc,char **argv) {
+ const char* id = *argv;
+ const char* t;
+ while(t = index(id,'/')) {
+ id=t; id++;
+ }
+ openlog(id,LOG_PERROR|LOG_PID,LOG_USER);
+ try {
+ const char *esccf = getenv("SITECING_CONF");
+ string config_file = esccf ? esccf : "sitecing.conf";
+ while(true) {
+ static struct option opts[] = {
+ { "help", no_argument, 0, 'h' },
+ { "usage", no_argument, 0, 'h' },
+ { "version", no_argument, 0, 'V' },
+ { "license", no_argument, 0, 'L' },
+ { "config", required_argument, 0, 'f' },
+ { NULL, 0, 0, 0 }
+ };
+ int c = getopt_long(argc,argv,"f:hVL",opts,NULL);
+ if(c==-1)
+ break;
+ switch(c) {
+ case 'h':
+ cerr << PHEADER << endl
+ << PCOPY << endl << endl
+ << " -h, --help" << endl
+ << " --usage display this text" << endl
+ << " -V, --version display version number" << endl
+ << " -L, --license show license" << endl
+ << " -f filename, --config=filename" << endl
+ << " specify configuration file to use" << endl;
+ exit(0);
+ break;
+ case 'V':
+ cerr << VERSION << endl;
+ exit(0);
+ break;
+ case 'L':
+ extern const char *COPYING;
+ cerr << COPYING << endl;
+ exit(0);
+ break;
+ case 'f':
+ config_file = optarg;
+ break;
+ default:
+ cerr << "Huh??" << endl;
+ break;
+ }
+ }
+ configuration config(config_file);
+ process_request(config);
+ }catch(exception& e) {
+ /* cerr << "Oops: " << e.what() << endl; */
+ syslog(LOG_ERR,"uncaught exception: %s",e.what());
+ }
+ closelog();
+}