#!/usr/bin/perl -Tw
######################################################################
# (c) Michael Schilli 1999
######################################################################

use CGI qw/:standard :html3/;      # Standard-CGI-Funktionen
use Fcntl qw/:flock/;              # LOCK_EX etc. definieren

my $efile = 'email.dat';           # Datei mit Adressen

if(! defined param('email')) {     # Keine Email eingetragen 
                                   # (erster Aufruf?) => 
                                   # Einführungsseite
    print_form("Bitte tragen Sie Ihre Email-Adresse ein.");

} elsif (param('email') =~ /\S\@.+?\..+/) {
                                   # Gültige Email => 
                                   # abspeichern.
    if(register_email(param('email'), $efile)) {
        print_form("Registrierung erfolgreich. Vielen Dank.");
    } else {
        print_form("Fehler: $ERROR");
    }

} else {                           # Unsinn eingetragen, mit 
                                   # Fehlermeldung wiederholen.
    print_form("Ungültige Email-Adresse - bitte nochmal.");
}


###############################################################
sub print_form {        # Formular mit Nachrichtentext ausgeben
###############################################################
    my ($message) = @_;

    print header,
          start_html('-title' => "Registration"),
          h2($message), start_form(), 
          table(TR(td("Email:"),
                   td(textfield(
                         -name => 'email', 
                         -value => (param('email') || ""))),
                   td(submit(-value => "Registrieren")))),
          end_form();
}

###############################################################
sub register_email {               # Email in Datei aufnehmen
###############################################################
    my ($email, $filename) = @_;
                                   # Datei erzeugen, falls noch 
                                   # nicht vorhanden
    do {open(FILE, ">$efile"); close(FILE)} unless -f $efile;

    if(!open(FILE, "+<$efile")) {  # Read/Write öffnen.
        $ERROR = "$efile nicht zu öffnen (Interner Fehler)."; 
        return 0;
    }

    flock(FILE, LOCK_EX);          # Gegen parallele Zugriffe 
                                   # sichern
    seek(FILE, 0, 0);              # An den Dateianfang 
                                   # manövrieren

    while(<FILE>) {                # Nach neuer Email 
                                   # durchsuchen
        chomp;                     # Newline abscheiden
        if($_ eq $email) {
            $ERROR = "Sie sind bereits registriert.";
            close(FILE);
            return 0;
        }
    }
        
    seek(FILE, 0, 2);              # Email am Dateiende 
    print FILE "$email\n";         # anhängen
    close(FILE);
    return 1;
}
