#!/usr/bin/perl # tell client na stary aj novy protokol ( may be ) made # by (c) Kozo (jvajda@elf.stuba.sk) # ======================================================================= # modification history : # ---------- # version 0.0.1 Thu Sep 26 16:24:49 MESZ 1996 # toto bol uplny zaciatok a ledva vedelo otvorit socket # ---------- # version 0.5 Fri Oct 04 11:31:08 MESZ 1996 # podporuje oba protokoly heh .. # ---------- # version 0.6 Fri Oct 11 14:18:06 MESZ 1996 # podporuje aliasy # ---------- # version 0.7 Fri Oct 11 17:20:06 MESZ 1996 # podporuje .tellrc file # ---------- # version 0.8 Sat Oct 12 11:01:02 MESZ 1996 # vracia vlastne chybove hlasky .. nespolieha sa na server # caf gildir :-{)) # ---------- # version 0.9 Thu Nov 07 17:00:13 MEZ 1996 # podporuje novu strukturu .tellrc : # aj ked nie uplne inteligentne # ---------- # version 0.9.5 Tue Nov 19 17:31:58 MEZ 1996 # prepracovane spracovavanie rc file # ---------- # version 1.013 Thu Apr 17 19:13:15 MET DST 1997 # nic nove .. len gildir zmenil trochu protokol a # daemon tvrdi, ze vsetko pod 1.0 s nim nemoze komunikovat # # uvidime co z toho vznikne .. zatial je to ftakovina ... # ale zacina byt ciastocne kompati(de)bilna s c-ckovou verziou # ======================================================================= # ak chcem debugovat treba odhashovat :-{)) $DEBUG = "YES"; # version ID $VERSION = "1.013"; # testovanie poctu parametrov if ( $#ARGV < 1 ) { print "Tell client based on perl by Kozo (jvajda\@elf.stuba.sk)\n"; print "Version: $VERSION\n"; print "Usage: tell []\n"; exit(-1); } if ( $DEBUG ) { print "\nDEBUG INFORMATIONS about tell.pl\n\n"; } # default port $DEFAULT_PORT = '4224'; # definicia DEFAULT_RC file a nalezitosti v nom ... $PWD = (getpwuid($<))[7]; $DEFAULT_RC = "$PWD/.tellrc"; %RC = ('aliasfile',"$PWD/.elm/aliases.text"); # osahanie RC_FILE $RC_FILE = $ENV{'TELLRC'} || $DEFAULT_RC ; if ( -r $RC_FILE ){ open(RC,"$RC_FILE") || die "Can't write $arg: $!\n"; if ( $DEBUG ) { print "opening rc file $RC_FILE\n"; } while ( $_ = ) { chop; # za toto sa sice hanbim, ale funguje to ... mozno to bude niekedy lepsie # berie do uvahy konfiguraciu medzi prvymi vyskytmi if ( $_ =~ /^) { @line = split(" = ",$_); if ( $line[0] eq $REM_NAME ) { @alias = split("@",$line[2]); $REM_NAME = $alias[0]; $SERVER = $alias[1]; if ( $DEBUG ) { print "alias = @line\n"; } } } } if ( $DEBUG ) { print " loc_name = $LOC_NAME\n"; print " rem_name = $REM_NAME\n"; print " address = $SERVER\n"; print " port = $PORT\n"; print " tty = $TTY\n"; print " msg = $MSG\n"; } print "telling to $REM_NAME@$SERVER\n"; $SOCKADDR = 'S n a4 x8'; $AF_INET = 2; $SOCK_STREAM = 1; select(stdout); $|=1; # urcenie protokolu, adries, otvorenie socketov a tcp connections .. etc .. $proto = (getprotobyname('tcp'))[2]; $thisaddr = (gethostbyname(''))[4]; $thataddr = (gethostbyname($SERVER))[4]; $this = pack($SOCKADDR,$AF_INET,0,$thisaddr); $that = pack($SOCKADDR,$AF_INET,$PORT,$thataddr); socket(S,$AF_INET,$SOCK_STREAM,$proto) || die "socket: $!\n"; bind(S,$this) || die "bind: $!\n"; connect(S,$that) || die "connect: $!\n"; select(S); $| = 1; select(STDOUT); # tu sa zacina samotny client # tu sa bude rozhodovat o tom aky protokol pouzit print S "HELO $LOC_NAME $VERSION perl client\n"; read(S,$inp,256); @co = split(/\s+/,$inp); if ( $DEBUG ) { print " spat = @co\n"; } if ( $co[0] == "101" ) { # vymakol som novy protokol ( caf Gildir ) if ( $DEBUG ) { print "\nNew protocol mode ...\n"; } print S "TELL $REM_NAME $TTY : $MSG\n"; read(S,$inp,256); $spat = &what_from; print S "QUIT\n"; read(S,$inp,256); } else { if ( $DEBUG ) { print "\nOld protocol mode ...\n"; } # stary protokol print S "$LOC_NAME:$REM_NAME:$TTY:$MSG\n"; read(S,$inp,256); $spat = &what_from; } close S; # that's all folks :-{)) ############################################################################# # definicia podprogramov sub what_from { @co = split(/ /,$inp); $NUM = $co[0]; # kvazi case na chybove hlasky if ( $NUM == 200 ) { print "Text sent to tty of $REM_NAME\n"; } if ( $NUM == 201 ) { print "Text passed on\n"; } if ( $NUM == 210 ) { print "Text saved\n"; } if ( $NUM == 401 ) { print "$REM_NAME is not logged on\n"; } if ( $NUM == 402 ) { print "$REM_NAME is not on that tty ($TTY)\n"; } if ( $NUM == 403 ) { print "$REM_NAME refusing messages\n"; } if ( $NUM == 404 ) { print "You are not authorized\n"; } if ( $NUM == 501 ) { print "Syntax error\n"; } return($NUM); }