3 # A thing that implements dxcluster 'protocol'
5 # This is a perl module/program that sits on the end of a dxcluster
6 # 'protocol' connection and deals with anything that might come along.
8 # this program is called by ax25d and gets raw ax25 text on its input
10 # Copyright (c) 1998 Dirk Koopman G1TLH
17 $mode = 1; # 1 - \n = \r as EOL, 2 - \n = \n, 0 - transparent
18 $call = ""; # the callsign being used
19 @stdoutq = (); # the queue of stuff to send out to the user
20 $conn = 0; # the connection object for the cluster
21 $lastbit = ""; # the last bit of an incomplete input line
23 # cease communications
27 if (defined $conn && $sendz) {
28 $conn->send_now("Z$call|bye...\n");
33 # terminate program from signal
39 # handle incoming messages
42 my ($con, $msg, $err) = @_;
43 if (defined $err && $err) {
47 my ($sort, $call, $line) = $msg =~ /^(\w)(\S+)|(.*)$/;
50 my $nl = ($mode == 1) ? "\r" : "\n";
51 $nl = "" if $mode == 0;
52 $line =~ s/\n/\r/o if $mode == 1;
54 } elsif ($sort eq 'M') {
55 $mode = $line; # set new mode from cluster
56 } elsif ($sort eq 'Z') { # end, disconnect, go, away .....
71 $r = sysread($fh, $buf, 1024);
72 # print "sys: $r $buf";
75 $buf =~ s/\r/\n/o if $mode == 1;
76 $dangle = !($buf =~ /\n$/);
77 @lines = split /\n/, $buf;
78 if ($dangle) { # pull off any dangly bits
83 $first = shift @lines;
84 unshift @lines, ($lastbit . $first) if ($first);
85 foreach $first (@lines) {
86 $conn->send_now("D$call|$first");
90 $conn->send_now("D$call|$buf");
98 die "client.pl <call> [<mode>]\r\n" if (!$call);
99 $mode = $ARGV[1] if (@ARGV > 1);
101 select STDOUT; $| = 1;
103 $SIG{'INT'} = \&sig_term;
104 $SIG{'TERM'} = \&sig_term;
105 $SIG{'HUP'} = \&sig_term;
107 $conn = Msg->connect("$clusteraddr", $clusterport, \&rec_socket);
108 $conn->send_now("A$call|start");
109 Msg->set_event_handler(\*STDIN, "read" => \&rec_stdin);