/* Cookie-Server zur Auswahl eines Cookies aus einer Datei */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

/* Datei mit den Namen der Statusfiles */
#include "filenames.h"

/* Den Status des Servers anhand eines Statusfiles anzeigen 
   WAITING : der Server wartet auf eine Anfrage eines Clients
   READY   : der Server ist mit der Beantwortung einer Anfrage
   fertig */
void ServerStatus (char *datei) {
    creat (datei, 0666);
}

/* Warten, bis eine Client-Anfrage REQUEST vorliegt */
void WarteAufClient (char *datei) {
    while (unlink (datei) == -1)
	sleep (1);
}

/* Schreibt die Antwort des Servers in die Datei RESPONSE */
void ErzeugeAntwort () {
    char cookie[120];
    FILE *datei;
    int i, j, lines;

    /* zufaellig einen Cookie aus der Datei COOKIE auswaehlen */
    datei = fopen (COOKIE, "r");
    lines = 0;
    while (fgets (cookie, 150, datei)) {
	lines++;
    }
    rewind (datei);
    i = 1 + (int) ((float) lines * rand () / (RAND_MAX +
					      1.0));
    for (j = 1; j <= i; j++) {
	fgets (cookie, 150, datei);
    }
    fclose (datei);

    /* das Cookie in die Datei RESPONSE schreiben,
     * aus der der Client es
     dann lesen soll */
    datei = fopen (RESPONSE, "w");
    fprintf (datei, "%s", cookie);
    fclose (datei);
}

/* Hauptroutine */
void main (int argc, char *argv[]) {
    /* Der Aufruf des Servers erlaubt die Uebergabe eines 
       Arbeitsverzeichnisses */
    if (argc > 1)
	chdir (argv[1]);

    /* Signalisieren, dass der Server auf Anfragen wartet */
    ServerStatus (WAITING);

    do {
	/* auf den Request eines Clients warten */
	WarteAufClient (REQUEST);

	/* die Antwort des Servers in RESPONSE schreiben */
	ErzeugeAntwort (RESPONSE);

	/* dem Client signalisieren, dass der Server
	 * fertig ist und die 
	 Antwort bereitsteht */
	ServerStatus (READY);
    } while (1);
}
