#!/usr/bin/perl
#############################################################
# "randurl.cgi" - Ein Perl CGI-Web-Skript zum Generieren eines zuflligen URL.
# -------------------------------------------------------------
# Copyright  1995, Alicia da Conceicao.
# Dieses Programm ist Freeware und kann von jedermann so lange frei genutzt,
# vertrieben und modifiziert werden, wie diese Nachricht vollstndig im Quellcode
# erscheint und kein Profit aus dem Programm gezogen wird. Jeder andere
# Verwendungszweck bedarf der schriftlichen Genehmigung der Autorin.
##########################################################

#********** DEKLARIERE GLOBALE VARIABLEN

# "$hostName"     Ist der Internet Host-Name (oder IP-Nummer) des
#                 Host-Computers, auf dem sich das CGI-Skript
#                 befindet. ndern Sie ihn in Ihren Host-Namen um.
# "$scriptDir"    Wie von HTTP spezifiziert, ist dies das Verzeichnis
#                 in dem sich dieses CGI-Skript befindet. ndern Sie
#                 es Ihrem Verzeichnis entsprechend.
# "$scriptName"   Wie von HTTP spezifiziert, ist dies der Name dieses 
#                 CGI-Skripts.
# "$scriptTitle"  Wird als Titel und berschrift der HTML-Ausgabe des 
#                 Skripts verwendet.
# "$listFileName" Ist der Name der Datei, welche die Liste der URLs 
#                 enthlt, von denen ein URL zufallsbedingt ausgwhlt 
#                 wird. Die erste Zeile dieser Datei sollte die
#                 Anzahl der in der Liste enthaltenen URLs
#                 beinhalten. Auf diese Weise mssen die URLs nicht 
#                 in einem Array untergebracht werden und die
#                 Datei braucht nur einmal gelesen zu werden. Jedes 
#                 URL der Liste sollte in einer separaten Zeile
#                 stehen und dementsprechend formatiert sein.
#                 Beispiel:
#                 scheme://host.name/verzeichnis/pfad/datei.name
#                 Befindet sich die Datei in einem separaten
#                 Verzeichnis, fgen Sie den Verzeichnispfad ein.

# "$numValues"    Ist die Anzahl der mglichen Zufallswerte, die aus 
#                 der ersten Zeile von "$listFileNam" erhalten
#                 werden.

# "$num"          Ist die zufallsbeding erzeugte Zahl zwischen 0 und
#                 ($numValues - 1).

# "$URL"          Ist das durch Zufall aus der URL-Liste ermittelte 
#                 URL.

$hostName = "ihr.host.name";
$scriptDir = "/ihr/verzeichnis";
$scriptName = $hostName.$scriptDir."/randurl.pl";
$scriptTitle = "Zufalls-URL";
$listFileName = "urls";
$numValues;

$num;
$URL;

# *********** ANFANG HAUPTPROGRAMM

&randomURL ();   # Rufe das Unterprogramm "randomURL" auf

# ***** Hier ist das Ausgabe-Ergebnis in HTML

print STDOUT "Content-type: text/html\n\n",
      "<html><head><title>", $scriptTitle, "</title></head><body>\n",
      "<h1>", $scriptTitle, "</h1>\n",
      "<p>Hier ist ein zufallsbedingtes URL <a href=\"", $URL, 
      "\"><b>", $URL, "</b></a>\.", "</p>\n",
      "<form method=\"post\" action=\"http://", $scriptName, "\">\n",
      "<input type=\"hidden\" name=\"uniqueindex\" value=\"", time, "-", $$,
      "\">\n",
      "<P><input type=\"submit\" value=\"Ein weiteres\"> zuflliges URL?</p>\n",
      "</form></body></html>\n";

#############################################################
# Beachten: Das Ergebnis des Skripts ist eine Ausgabe als HTML,
# insbesonders fr ein Form, das dem Skript erlaubt sich selbst 
# aufzurufen. Die Form enthlt einen versteckten Wert "uniqueIndex". 
# Der verwendete Wert besteht aus der Anzahl der Sekunden, die seit 
# dem Jahr 1970 verstrichen sind, denen die aktuelle Prozess-
# ID-Nummer ("$$") angehngt wurde. Diese Methode gewhrleistet, da 
# jedes Ausfhren dieses Skripts immer einen einzigartigen Wert haben 
# wird. Die Verwendung dieses einzigartigen Wertes fr eine Variable 
# in einem Form wird das Zwischenspeichern vermeiden und das nchste 
# Ausfhren des Skripts erzwingen.
#############################################################

# ********** ANFANG DER UNTERPROGRAMME:

#############################################################
# Beachte: Das Unterprogramm "randomValues" generiert eine zufallsbedingte
# Zahl und weist sie "$num" zu. Die Anzahl der Sekunden, die seit dem Jahr
# 1970 verstrichen sind und die aktuelle Prozess-ID-Nummer ("$$") wurden
# als Basis fr den Pseudo-Zahlen-Zufallsgenerator verwendet.
#############################################################

sub randomValue
    {
    srand (time + $$);               # Zahlen-Zufallsgenerator "laden"
    $num = int (rand ($numValues));  # generiere die Zufallszahl
    return $num;                     # schicke die Zufallszahl zurck
    }

#############################################################
# Beachten: Das Unterprogramm "randomURL" liest die URL-Datei ($listFileName)
# und weist "$RUL" ein zufallsbedingtes URL zu. Als erstes versucht das Unterprogramm
# die Datei zu ffnen. Wenn es das nicht kann, bricht das Programm mit einer
# Fehlermeldung ab. ffnet es die Datei, liest es die erste Zeile von "$listFileName",
# um "$numValues" zu erhalten. Dann ruft es das Unterprogramm "randomValue" auf, um
# einen Zufallswert ($num) zu generieren, der zwischen 0 und ($numValues - 1) liegt.
# Danach liest es die URL in "$listFileName" in der Zeile, die "$num" entspricht,
# und ordnet es "$URL" zu. Anschlieend wirft sie die Zeilenwechsel aus "$URL"
# und schickt "$URL" zurck.
#############################################################

sub randomURL
     {
     open (LISTFILE, $listFileName)
             || die "Content-type: text/plain\n\nKann Datei nicht ffnen!\n";
                                     # ffne die Datei oder brich ab
     $numValues = int (<LISTFILE>);  # Lies die erste Zeile von "$listFileName"
     &randomValue ();                # Rufe das Unterprogramm "randomValue" auf
     $URL = "";                      # Initialisiere "$URL"
     $j = 0;                         # Initialisiere die Zhlvariable "$j"
     for (; ($j <= $num) && ($j < $numValues) && !eof (LISTFILE); ++$j)
         { <LISTFILE>; }             # Lies weiter, bis "$num" erreicht ist
     if ($j == $num && !eof (LISTFILE))
         {
         $URL = <LISTFILE>;          # Weise die URL "$URL" zu
         chop ($URL);                # Wirf den einleitenden Zeilenwechsel raus
         }
     close (LISTFILE);               # Schliee die Datei
     return $URL;                    # Schicke "$URL" zurck
     }

