$TITLE ('GET - REQUEST FILES FROM A REMOTE SERVER KERMIT') get$module: /* COPYRIGHT (C) 1985, Trustees of Columbia University in the City of New */ /* York. Permission is granted to any individual or institution to use, */ /* copy, or redistribute this software so long as it is not sold for */ /* profit, provided this copyright notice is retained. /* /* Contains the following public routines: */ /* get, gethelp */ do; declare true literally '0FFH'; declare false literally '00H'; declare space literally '020H'; declare cr literally '0DH'; declare lf literally '0AH'; declare null literally '00H'; declare crlf literally 'cr,lf,null'; declare bel literally '07H'; declare pksize literally '94'; declare packet(pksize) byte external; /* buffer for packets */ declare state byte external; /* FSM last state */ declare msgnum byte external; /* message number */ declare tries byte external; /* max number of retries */ declare oldtry byte external; declare port byte external; /* the port to use */ declare maxtry byte external; /* the number of retries to attempt */ declare def$drive(5) byte external; /* the default local drive */ declare filename address external; /* the address of the filename */ declare (count, status, pklen) address; declare myquote literally '023H'; declare myeol literally 'cr'; declare chrmsk literally '07FH'; declare fullname(20) byte; declare remotefile(20) byte; declare debug byte external; /* Current Kermit parameters */ declare spsize byte external; /* the present packet size */ declare timeint byte external; /* the present time out */ declare numpads byte external; /* how many pads to send */ declare padchar byte external; /* the present pad character */ declare eol byte external; /* the present eol character */ declare quote byte external; /* the present quote character */ /* here are the subroutines */ print: procedure(string)external; declare string address; end print; newline: procedure external; end newline; token: procedure address external; end token; nout: procedure (n) external; declare n address; end nout; movevar: procedure (offset, source,dest) byte external; declare offset byte; declare (source, dest) address; end movevar; spack: procedure(type, pknum, length, packet) external; declare (type, pknum, length, packet) address; end spack; rpack: procedure(length, pknum, packet) byte external; declare (length, pknum, packet) address; end rpack; spar: procedure (a) external; declare a address; end spar; rpar: procedure (a) external; declare a address; end rpar; rfile: procedure byte external; end rfile; rdata: procedure byte external; end rdata; /* SSINIT: Send a server initialization packet */ ssinit: procedure byte; declare (len, num, retc) byte; if tries > maxtry then return 'A'; else tries = tries + 1; if debug then call print(.('ssinit...\$')); call spar(.packet); call spack('I', msgnum, 6, .packet); /* send init packet */ retc = rpack(.len, .num, .packet); if (retc = 'N') then return state; if (retc = 'E') then do; /* Error packet received, so use default params */ eol = myeol; quote = myquote; return 'R'; end; if (retc <> 'Y') then return 'A'; /* Process params */ call rpar(.packet); if eol = 0 then eol = myeol; if quote = 0 then quote = myquote; oldtry = tries; tries = 0; return 'R'; end ssinit; /* SGCMD: Send the server GET command */ sgcmd: procedure byte; declare (len, num, retc) byte; declare foffset byte; declare fnptr address; declare fnchr based fnptr byte; if tries > maxtry then return 'A'; else tries = tries + 1; if debug then call print(.('sgcmd...\$')); /* Crack the file name */ fnptr = filename; if fnchr = ':' then /* File name on command has a drive */ foffset = movevar(0,filename+4,.remotefile); /* Strip drive */ else foffset = movevar(0,filename,.remotefile); len = 0; /* count characters in filename */ fnptr = .remotefile; do while fnchr > space; len = len + 1; fnptr = fnptr + 1; end; if debug then do; call print(.('File name length is: ',null)); call nout(len); call newline; end; /* debug */ call spack('R', msgnum, len, .remotefile); retc = rpack(.len, .num, .packet); if (retc = 'S') then do; /* process params */ call rpar(.packet); if eol = 0 then eol = myeol; if quote = 0 then quote = myquote; call spar(.packet); call spack('Y', msgnum, 6, .packet); /* Ack w/params */ msgnum = (msgnum + 1) mod 64; oldtry = tries; tries = 0; filename = token; /* retrieve possible 2nd operand */ return 'F'; end; if (retc = 'N' or retc = false) then return state; return 'A'; end sgcmd; /* Display help for the GET command */ gethelp:procedure public; call print(.('\GET\\$')); call print(.(' The GET command requests a specific file from the $')); call print(.('remote server.\\$')); call print(.('Syntax:\\$')); call print(.(' GET file [local-file]\\$')); call print(.('If the "local-file" is not specified, Kermit $')); call print(.('will name the local file\$')); call print(.('with the file name sent by the remote Kermit.\\$')); end gethelp; /* GET: This is the main code for the get command. It is an FSM for */ /* requesting files from a remote server. The main loop calls various */ /* routines until it finishes or an error occurs; this is signified by */ /* a true or false result being returned to the main 'kermit' routine. */ get: procedure public; if debug then call print(.('Get a file\$')); state = 'I'; msgnum = 0; tries = 0; oldtry = 0; filename = token; if (filename = 0) then do; call print(.('No files specified\$')); return; end; do while (state <> true and state <> false); if state = 'D' then state = rdata; else if state = 'I' then state = ssinit; else if state = 'F' then state = rfile; else if state = 'R' then state = sgcmd; else if state = 'C' then state = true; else state = false; end; if state then call print(.('\OK',bel,crlf)); else call print(.('get failed\$')); end get; end get$module;