/*
* foocount v0.1 / 30.01.2000
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "foocount.h"
#include "cgi_lib.h"
#include "lock_file.h"
int main (void)
{
cgi_lib *cgi;
char foocount[5] = "0";
FILE *foocount_db;
lock_file *foocount_lock;
/* 'cgi_lib' Modul initialisieren. */
cgi = cgi_lib_new (cgi);
if (cgi == NULL)
{ /* Es trat ein Fehler auf. Welcher? */
switch (cgi_lib_errno)
{
case CGI_LIB_ALREADY_IN_USE:
{
cgi_lib_send_HTML (cgi, "cgi_lib: already in use\n");
break;
}
case CGI_LIB_OUT_OF_MEMORY:
{
cgi_lib_send_HTML (cgi, "cgi_lib: out of memory\n");
break;
}
case CGI_LIB_METHOD_UNKNOWN:
{
cgi_lib_send_HTML (cgi, "cgi_lib: method unknown\n");
break;
}
}
return cgi_lib_errno;
}
/*
* Wir erstellen ein 'advisory lockfile' ('FOOCOUNT_LOCK'). Dadurch
* wird verhindert dass mehrere Instanzen dieses CGI Programms zur
* selben Zeit in unsere Zaehlerdatei ('FOOCOUNT_DB') schreiben.
*/
foocount_lock = lock_file_new (foocount_lock, FOOCOUNT_LOCK);
if (foocount_lock == NULL)
{ /* Es trat ein Fehler auf. */
cgi_lib_send_HTML (cgi, "lock_file: out of memory\n");
cgi_lib_del (cgi);
return FOOCOUNT_OUT_OF_MEMORY;
}
/*
* Die Zaehlerdatei ('FOOCOUNT_DB') wird nun zum Lesen geoeffnet.
* Dabei kann kein Fehler auftreten. Ist die Datei nicht vorhanden
* so fand noch kein Zugriff statt.
*/
foocount_db = fopen (FOOCOUNT_DB, "r");
if (foocount_db != NULL)
{ /* Zaehlerstand einlesen. */
fscanf (foocount_db, "%5s", foocount);
fclose (foocount_db);
}
/*
* Zaehlerdatei ('FOOCOUNT_DB') zum
* aktuallisiere des Zaehlerstandes oeffnen.
*/
foocount_db = fopen (FOOCOUNT_DB, "w");
if (foocount_db == NULL)
{ /* Es trat ein Fehler auf. */
cgi_lib_send_HTML (cgi, "foocount: file not found\n");
cgi_lib_del (cgi);
return FOOCOUNT_FILE_NOT_FOUND;
}
/* Zaehlerstand inkrementieren und in die Zaehlerdatei schreiben. */
fprintf (foocount_db, "%d", atoi (foocount) + 1);
fclose (foocount_db);
/*
* Das zuvor erzeugte 'advisory lockfile' ('FOOCOUNT_LOCK') kann
* wieder entfernt werden. Der naechste Prozess kann nun auf die
* Zaehlerdatei ('FOOCOUNT_DB') zugreifen.
*/
if (lock_file_del (foocount_lock) != LOCK_FILE_OK)
{
cgi_lib_send_HTML (cgi, "lock_file: lockfile error\n");
cgi_lib_del (cgi);
return FOOCOUNT_LOCK_FILE_ERROR;
}
/* Zaehlerstand ausgeben. */
cgi_lib_send_HTML (cgi, foocount);
/*
* Fertig. Zum Schluss kann das das 'cgi_lib'
* Modul wieder aus dem Speicher entfernen.
*/
cgi_lib_del (cgi);
return FOOCOUNT_OK;
}