#!/usr/bin/tclsh8.5
#
# $Id: 31a02b06f08d3d88a75730532cf7cc2506e250e2 $
#

## The common defaults
set filters_init_file "/usr/local/libexec/nbsp/filters.init";
if {[file exists $filters_init_file] == 0} {
	puts "dafilter-master disabled: $filters_init_file not found.";
	return 1;
}
source $filters_init_file;
unset filters_init_file;

if {$filters_init_status == 1} {
	return 1;
}
unset filters_init_status;

## Initialization of this filter.
set initfile [file join $common(libdir) "dafilter.init"];
if {[file exists $initfile] == 0} {
        puts "dafilter disabled: $initfile not found.";
        return 1;
}
source $initfile;

#
## variables of this filter
#
# dafilter(slave,<type>,open) 0;
# dafilter(slave,<type>,enable) 1;
# dafilter(slave,<type>,F) (dynamically initialized before entering main)
#
foreach type $dafilter(slave,types) { 
    set dafilter(slave,$type,open) 0;
    set dafilter(slave,$type,enable) 1;
}
set dafilter(manager)		1;

proc main {argc argv} {

    global dafilter;
    global errorInfo;

    cd $dafilter(datadir);

    # gets returns -1 on eof. In addition the server explicitly
    # signals the filters to quit by sending a blankline
    # (gets returns 0 in this case, and finfo is "").

    while {[gets stdin finfo] >= 0} {
	if {$finfo == ""} {
	    log_msg "Received request to quit.";
	    break;
	}

	set status [catch {process $finfo} errmsg];
	if {$status == 1} {
	    log_msg "Error processing $finfo";
	    log_msg $errmsg;
	    log_msg $errorInfo;
	}

	# If there was a write error, the functions close the connections.
	# We check and try to reopen it.
	foreach type $dafilter(slave,types) {
	    if {($dafilter(slave,$type,enable) == 1) && \
		($dafilter(slave,$type,open) == 0)} {
	        dafilter_slave_open $type;
	    }
	}

	# The hourly function to send the files to the news server.
	dafilter_nntp;
    }

    foreach type $dafilter(slave,types) {
	dafilter_slave_close $type;
    }
}

proc process {finfo} {

    global dafilter;

    filterlib_get_rcvars rc $finfo -nobody;

    foreach type $dafilter(slave,types) {
	if {[filterlib_uwildmat $dafilter(slave,$type,ure) $rc(fname)] && \
	    ($dafilter(slave,$type,enable) == 1)} {
	    dafilter_slave_write $type $finfo;
	    break;
	}
    }
}

#
# The dafilter_slave functions
#

proc dafilter_slave_open {type} {

    global dafilter;

    set status [catch {
	set dafilter(slave,$type,F) [open "|$dafilter(slave) -s" w];
	fconfigure $dafilter(slave,$type,F) -buffering line;
    } errmsg];

    if {$status == 0} {
	set dafilter(slave,$type,open) 1;
    } else {
	log_msg $errmsg
    }
}

proc dafilter_slave_close {type} {

    global dafilter;

    if {$dafilter(slave,$type,open) == 0} {
	return;
    }

    set status [catch {close $dafilter(slave,$type,F)} errmsg];
    set dafilter(slave,$type,open) 0;
    if {$status != 0} {
	log_msg $errmsg;
    }
}

proc dafilter_slave_write {type msg} {

    global dafilter;
    global errorInfo;

    if {$dafilter(slave,$type,open) == 0} {
	log_msg "Connection to slave $type is closed.";
	return;
    }

    set status [catch {puts $dafilter(slave,$type,F) $msg} errmsg];
    if {$status == 0} {
	return;
    }

    # If there as a write error, close the connection and retry.
    dafilter_slave_close $type;
    dafilter_slave_open $type;
    if {$dafilter(slave,$type,open) == 0} {
	log_msg $errmsg;
	return;
    }

    set status [catch {puts $dafilter(slave,$type,F) $msg} errmsg];
    if {$status != 0} {
	log_msg $errmsg;
	log_msg $errorInfo;
	return;
    }
}

#
# Dynamic initialization
#
# Open the pipes. In case a connection cannot be establish, log an error
# and continue but disable that type.
foreach type $dafilter(slave,types) { 
    dafilter_slave_open $type;
    if {$dafilter(slave,$type,open) == 0} {
	log_msg "Disabling the $type dispatching.";
	set dafilter(slave,$type,enable) 0;
    }
}

main $argc $argv;
