# # Talker client process. This deals with the logon then just acts as a # dumb terminal sending all the input to the server process. # &stdalias.inc alias "talkserv" TALKS alias "talkdata/passfile" PASSFILE alias "- a newbie" NEWDESC var name desc servpid #------------------- Main procedure --------------------- proc main var line tmp print [format "\n~BB~FW*** ~FGWelcome to the ~FRAVIOS~FG talker ~FW***\n\n"] ### Log them on call get_name_pass if $result=FALSE print [format "\nLogon failed.\n\n"]; exit 0 endif print [format "\n\n~FGYou are logged in.\n\n"] ### Connect to server process if [set servpid $pcs?"talkserv"]="" print [format "\n~FR~LIError - Unable to connect to server process!\n\n"] exit 1 endif out servpid printnl "LOGON " name " " desc ### Set int on death interrupt servpid with "DEAD" on death ### Main loop onint from nonchild intproc while TRUE input line if [midstr line 1]="." call commands [midstr line 2 [strlen line]] else printnl [format "SAY %s" line] endif wend endproc #---- This is the part that does the actual login ---- proc get_name_pass var pass pass2 var fp wrong file_exists cnt line var pass_err set pass_err "\n\n\r~FYPassword must be 3 or more characters.\n\n" ### See if file exists if [trap [set fp [open to read PASSFILE]]]!=OK set file_exists 0 else set file_exists 1 endif set cnt 1 while TRUE if cnt>3 if file_exists; close fp; endif return FALSE endif set wrong 0 in "STDIN" do print "Enter name: "; input name until name!="" if [strlen name]<3 print [format "\nName must be 3 or more characters.\n\n"] inc cnt; continue endif set name [overstr name [upperstr [midstr name 1]] 1] # If file exists go back to start if file_exists in fp; cseek start 0 # reset pointer to top of file endif # Search through password file for our logon while file_exists and [not $eof] input line if [elements line 2]=name in "STDIN" echo off do print "Enter password: "; input pass until pass!="" echo on if [strlen pass]<3 print [format pass_err]; inc wrong; break endif if [crypt pass "NU"]=[head line] close fp set desc [tail [tail line]] return TRUE endif print [format "\n\n~FRIncorrect password.\n\n"] inc cnt; inc wrong break; endif in fp wend if wrong; continue; endif ### New user in "STDIN" printnl "New user..." echo off do print "Enter password: "; input pass until pass!="" if [strlen pass]<3 print [format pass_err]; inc cnt; echo on; continue; endif do print [format "\n\rPlease re-enter password: "]; input pass2 until pass2!="" echo on # Is password too short? if [strlen pass2]<3 print [format pass_err]; inc cnt; continue; endif # Has password been re-entered correctly? if pass!=pass2 print [format "\n\n\r~FRPasswords do not match.\n\n"]; inc cnt; continue; endif ### Write out new login to passfile if file_exists close fp; set fp [open to append PASSFILE] else set fp [open to write PASSFILE] endif out fp printnl [crypt pass "NU"] " " name " " NEWDESC close fp out "STDOUT" set desc NEWDESC return TRUE wend endproc #---- This deals with data coming from the server process ---- proc intproc var oldout mesg pid tl age if [set pid [head $int_mesg]]!=servpid; return; endif set oldout $out out "STDOUT" if [set tl [tail $int_mesg]]="EXIT"; exit 0; endif if tl=""; printnl else set mesg [midstr $int_mesg [math [strlen pid]+2] [strlen $int_mesg]] if mesg="PRM" set age [gettime time [math [gettime rawtime]-[gettime created]]] print [format "~FT<%s, %s, %s>\n" \ [midstr [gettime time] 1 5] [midstr age 1 5] name] else; printnl mesg endif endif out oldout endproc #---- If its a "quit" command deal with it locally else pass it to the #---- server process. proc commands line if [instr "QUIT" [upperstr [head line]]]=1 out "STDOUT"; print [format "\n\nBye bye...\n\n"] exit 0 endif printnl [format "COM %s" line] endproc