/*
 * 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;
}