require 'chat2.pl';

sub init_children {
    # I actually need to write good children...

    push(@idle_runner_children, 
	 $runner = &open_proc("runner"));
    push(@idle_runner_children, 
	 $runner = &open_proc("runner"));
    push(@idle_fetcher_children, 
	 $fetcher = &open_proc("fetcher"));
    push(@idle_fetcher_children, 
	 $fetcher = &open_proc("fetcher"));
    push(@idle_fetcher_children, 
	 $fetcher = &open_proc("fetcher"));
    push(@idle_fetcher_children, 
	 $fetcher = &open_proc("fetcher"));
    print("Fetcher kids: @idle_fetcher_children\n\r") if $debug;
}

sub ask_fetcher_child {
    local($url) = @_;

    $fetcher =  shift(@idle_fetcher_children);
    print("Asking $fetcher for $url\n\r") if $debug;
    $wrote  = syswrite($fetcher,"$url\n",length($url)+1);
    print("Asked for $url ($wrote)\n\r") if $debug;
    push(@busy_fetcher_children, $fetcher);
}

sub listen {
        local($secs) = @_;
        local($return,$tmp) = "";
        while (length($tmp = &chat'expect($secs, '(.|\n)+', '$&'))) {
                print $tmp if $trace;
                $return .= $tmp;
        }
        $return;
}

sub open_proc { ## public
        local(@cmd) = @_;

        $thisfh = &checkout_filehandle();
        local(*TTY) = "__TTY" . time;
        local($pty,$tty) = &_getpty($thisfh,TTY);
        die "Cannot find a new pty" unless defined $pty;
        local($pid) = fork;
        die "Cannot fork: $!" unless defined $pid;
        unless ($pid) {
                close STDIN; close STDOUT; close STDERR;
                setpgrp(0,$$);
                if (open(DEVTTY, "/dev/tty")) {
                    ioctl(DEVTTY,0x20007471,0);         # XXX s/b &TIOCNOTTY
                    close DEVTTY;
                }
                open(STDIN,"<&TTY");
                open(STDOUT,">&TTY");
                open(STDERR,">&STDOUT");
                die "Oops" unless fileno(STDERR) == 2;  # sanity
                close($thisfh);
                exec @cmd;
                die "Cannot exec @cmd: $!";
        }
        close(TTY);
        $thisfh; # return symbol for switcharound
}
