summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--Makefile.am17
-rw-r--r--configure.ac22
-rw-r--r--src/.gitignore1
-rw-r--r--src/Makefile.am21
-rw-r--r--src/sitecing-plaincgi.cc178
5 files changed, 224 insertions, 15 deletions
diff --git a/Makefile.am b/Makefile.am
index 68f550d..fb04e49 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,10 +9,8 @@ endif
-LOCAL_TARGETS=
+all-local: NEWS
if HAVE_DOXYGEN
-LOCAL_TARGETS+=doxygen
+clean-local:
+ rm -rf doxydox
endif
-all-local: NEWS $(addprefix all-lota-,${LOCAL_TARGETS})
-clean-local: $(addprefix clean-lota-,${LOCAL_TARGETS})
-
NEWS: NEWS.xsl NEWS.xml
@@ -20,8 +18,5 @@ NEWS: NEWS.xsl NEWS.xml
-all-lota-doxygen: doxydox/built
-doxydox/built: $(wildcard ${top_srcdir}/include/sitecing/*.h)
+if HAVE_DOXYGEN
+dox:
${DOXYGEN}
- touch $@
-
-clean-lota-doxygen:
- rm -rf doxydox
+endif
diff --git a/configure.ac b/configure.ac
index acd34b9..0da7658 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,2 +1,2 @@
-AC_INIT([sitecing], [0.0], [sitecing-bugs@klever.net])
+AC_INIT([sitecing], [0.0.1], [sitecing-bugs@klever.net])
AC_CONFIG_SRCDIR([include/sitecing/sitecing_parser.h])
@@ -22,5 +22,23 @@ AC_WITH_PKGCONFIG
-PKG_CHECK_MODULES([KINGATE],[kingate-fcgi],,[
+PKG_CHECK_MODULES([KINGATE],[kingate],,[
AC_MSG_ERROR([no kingate library found, get it at http://kin.klever.net/kingate/])
])
+HAVE_FCGI=false
+HAVE_PLAINCGI=false
+PKG_CHECK_MODULES([KINGATE_FCGI],[kingate-fcgi],[
+ HAVE_FCGI=true
+],[
+ AC_MSG_NOTICE([no fastcgi support in kingate library])
+])
+PKG_CHECK_MODULES([KINGATE_PLAINCGI],[kingate-plaincgi],[
+ HAVE_PLAINCGI=true
+],[
+ AC_MSG_NOTICE([no plaincgi support in kingate library])
+])
+if ! (${HAVE_FCGI} || ${HAVE_PLAINCGI}) ; then
+ AC_MSG_ERROR([not a single CGI interface supported in kingate])
+fi
+AM_CONDITIONAL([HAVE_FCGI],[${HAVE_FCGI}])
+AM_CONDITIONAL([HAVE_PLAINCGI],[${HAVE_PLAINCGI}])
+
PKG_CHECK_MODULES([DOTCONF],[dotconf],,[
diff --git a/src/.gitignore b/src/.gitignore
index 6c2c79e..76716d5 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -8,2 +8,3 @@ 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,2 +1,9 @@
-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
@@ -4,3 +11,3 @@ 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}
@@ -9,2 +16,3 @@ sitecing_fastcgi_SOURCES = sitecing-fastcgi.cc \
COPYING.cc
+sitecing_fastcgi_LDADD = ${KINGATE_FCGI_LIBS}
sitecing_fastcgi_LDFLAGS = -rdynamic
@@ -12,4 +20,11 @@ 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
@@ -20 +35,3 @@ COPYING.cc: ${top_srcdir}/COPYING
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();
+}