#include "./service_file.h" #include "aqhome-cgi/modules/mroot.h" #include "aqhome/aqhome.h" #include #include #include #include #include #include #include #include #define AQHOME_CGI_LOGFILE "/var/www/aqhome-cgi/log/aqhome-cgi.log" #define AQHOME_CGI_DEFAULT_STATIC_FILES "0-build/services/static" #define AQHOME_CGI_DEFAULT_RUNTIME_FILES "0-build/services/runtime" void _handleRequest(AQCGI_REQUEST *rq, const char *sPathStaticFiles, const char *sPathRuntimeFiles); int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles); AQH_MODULE *_loadModule(AQH_SERVICE *sv, AQCGI_REQUEST *rq, AQH_MODULE *mParent, const char *sModuleName); static void logStart(void); int main(int argc, char **argv) { AQCGI_REQUEST *rq; logStart(); GWEN_Logger_Open(GWEN_LOGDOMAIN, "gwenhywfar", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon); GWEN_Logger_Open(AQH_LOGDOMAIN, "aqhome", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon); GWEN_Logger_Open(AQCGI_LOGDOMAIN, "aqcgi", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon); GWEN_Logger_SetLevel(AQCGI_LOGDOMAIN, GWEN_LoggerLevel_Debug); GWEN_Logger_Open(NULL, "aqhome-cgi", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon); DBG_ERROR(NULL, "Init CGI"); AQCGI_Init(); rq=AQCGI_ReadRequest(); if (rq) { const char *sPathStaticFiles; const char *sPathRuntimeFiles; sPathStaticFiles=getenv("AQHOME_STATIC_FILES"); if (!(sPathStaticFiles && *sPathStaticFiles)) sPathStaticFiles=AQHOME_CGI_DEFAULT_STATIC_FILES; sPathRuntimeFiles=getenv("AQHOME_RUNTIME_FILES"); if (!(sPathRuntimeFiles && *sPathRuntimeFiles)) sPathRuntimeFiles=AQHOME_CGI_DEFAULT_RUNTIME_FILES; _handleRequest(rq, sPathStaticFiles, sPathRuntimeFiles); } else { fprintf(stdout, "Content-type: text/plain\n\n"); fprintf(stdout, "Error: No Request!\n"); return 0; } AQCGI_Fini(); fprintf(stdout, "Content-type: text/plain\n\n"); fprintf(stdout, "Request handled\n"); return 0; } void _handleRequest(AQCGI_REQUEST *rq, const char *sPathStaticFiles, const char *sPathRuntimeFiles) { AQH_SERVICE *sv; int rv; sv=AQH_ServiceFiles_new(sPathRuntimeFiles); rv=_handlePath(sv, rq, sPathStaticFiles); if (rv<0) { } AQH_Service_free(sv); } int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles) { AQH_MODULE *mRoot; AQH_MODULE *mParent; const GWEN_STRINGLIST *sl; mRoot=AQH_ModRoot_new(sv, sPathStaticFiles); mParent=mRoot; sl=AQCGI_Request_GetStringlistPath(rq); if (sl) { GWEN_STRINGLISTENTRY *se; se=GWEN_StringList_FirstEntry(sl); while(se) { GWEN_STRINGLISTENTRY *seNext; const char *s; seNext=GWEN_StringListEntry_Next(se); s=GWEN_StringListEntry_Data(se); if (s && *s) { if (seNext) { AQH_MODULE *m; DBG_ERROR(NULL, "Entry: %s (%s)", s, seNext?"not last":"last"); m=AQH_ModService_LoadSubModule(mParent, rq, s); if (m==NULL) { AQH_Module_free(mRoot); AQCGI_SendResponseWithStatus(rq, 404, "Not found"); return GWEN_ERROR_GENERIC; } mParent=m; } else { int rv; /* last, let module handle remaining part */ rv=AQH_ModService_HandleRequest(mParent, rq, s); if (rv<0) { DBG_INFO(NULL, "here (%d)", rv); AQH_Module_free(mRoot); return rv; } break; } } se=seNext; } AQH_Module_free(mRoot); return 0; } else { AQH_Module_free(mRoot); return GWEN_ERROR_GENERIC; } } void logStart() { FILE *f; f=fopen(AQHOME_CGI_LOGFILE, "a+"); if (f!=NULL) { fprintf(f, "Started.\n"); fclose(f); } }