#include "common.h" #include "Base.h" bool CGI::Base::initialize() { nRequests = 0; tStart = ::time(0); pid = ::getpid(); const char* sDirectory = ::getenv("RECORD_TO"); if (!sDirectory) { sDirectory = ::getenv("TEMP"); if (!sDirectory) { sDirectory = "/tmp"; } } sRecordDirectory = sDirectory; sRecordDirectory.strcat("/"); ::mkdir(sRecordDirectory,0777); const char* s = ::getenv("RECORD_ON"); wantRecord = (s && *s && (0 < atoi(s))); fRequest = ::fopen("/dev/null","r"); fResponse = ::fopen("/dev/null","w"); return true; } extern char** environ; static int countEnviron() { int n = 0; for (; environ[n]; ++n) { } return n; } static int compareEnviron(const void* a,const void* b) { const char* s1 = *(const char**)a; const char* s2 = *(const char**)b; int v = ::strcmp(s1,s2); //printf("compare '%s' to '%s' returns %d\n",s1,s2,v); return v; } static void sortEnviron() { int n = countEnviron(); ::qsort(environ,n,sizeof(char*),compareEnviron); } void CGI::Base::writeResponse(FILE* f) { fprintf(f,"Content-Type: text/html\n\nCGI %s

CGI %s

",getName(),getName()); fprintf(f,"
argumentvalue\n"); fprintf(f,"
\n"); fprintf(f,"

environment values

\n
");
    sortEnviron();
    for (int i = 0; environ[i]; ++i) {
        fprintf(f,"%s\n",environ[i]);
    }
    fprintf(f,"
\n"); if (!sScriptFilename) { fprintf(f,"

SCRIPT_FILENAME not set.

\n"); } else { fprintf(f,"

Could not run script: '%s'

\n",sScriptFilename); if (0 < ::strlen(sLastError)) { fprintf(f,"%s\n",sLastError.getBuffer()); } } } void CGI::Base::handleRequest() { sLastError = ""; sScriptFilename = ::getenv("SCRIPT_FILENAME"); if (!sScriptFilename) { writeResponse(fResponse); nameRecord(); recordResponse(); fprintf(fResponse,"

SCRIPT_FILENAME not set.

\n"); return; } if (!runScript()) { writeResponse(fResponse); } if (wantRecord) { nameRecord(); recordResponse(); } } void CGI::Base::nameRecord() { ++nRequests; time_t t = time(0); struct tm* p = ::localtime(&t); static const char sFormat[] = "%sCGI.%04d-%02d-%02d-%02d-%02d-%02d.%08lx.%d.log"; int n = ::strlen(sRecordDirectory) + ::strlen(sFormat) + 10; sprintf(sRecordName.getBuffer(n),sFormat, // sRecordDirectory.getBuffer(), // 1900 + p->tm_year, // 1 + p->tm_mon, // p->tm_mday, // p->tm_hour, // p->tm_min, // p->tm_sec, // (long) pid,nRequests); } void CGI::Base::recordResponse() { fprintf(fResponse,"

recorded to: '%s'

\n",sRecordName.getBuffer()); FILE* log = fopen(sRecordName,"w"); if (!log) { fprintf(fResponse,"

error: '%s'

\n",::strerror(errno)); return; } writeResponse(log); fclose(log); } bool CGI::Base::runScript() { return false; }