BBN-Vax-TCP/src/ftp/ncp_srv.c
#include "ftp.h"
/* subroutines for srvrftp only (use srvrftp externals) */
/*name:
dataconnection
function:
connect with either U4,U5 or U+5,U+4 from the base
currently available thru file descriptor 0.
algorithm:
set up appropriate open parameters
try to open the file
signal error
exit
return opened file
parameters:
offset - offset from local socket
returns:
file descriptor of opened data connection
globals:
openparam=
calls:
open (sys)
netreply
called by:
retrieve
store
append
history:
initial coding 4/12/76 by S. F. Holmgren
*/
dataconnection( offset, handle )
int offset;
struct net_stuff *handle;
{
extern struct net_stuff NetParams;
register netfid; /* id of network data connection */
struct netopen *netps; /* structure of network gubbish */
netps = &(handle->np);
netps->o_host = NetParams.np.o_host;
netps->o_lskt = offset - 2; /* set local from telnet base */
netps->o_fskt[0] = 0; /* clear any high bits */
netps->o_fskt[1] = (offset^01); /* make (u+4,u+5) or (u+5,u+4) */
netps->o_relid = 1; /* specify local telnet base */
/* specify a relative, direct open that we initiate */
netps->o_type = (RELATIVE | DIRECT | INIT );
netps->o_nmal = 3000; /* set allocation level */
netps->o_timo = 60; /* give up after sixty seconds */
/* try and open network data connection */
if( (netfid = open( ncpfile,&netps )) < 0 )
{
netreply("454 Can't Establish Data Connection; %s.\r\n",errmsg(0));
exit( -1 );
}
return( netfid ); /* give file id back */
}
/*name:
sendsock
function:
send ftp sock command
algorithm:
send ascii sock string
send ascii local socket number
send cr lf
parameters:
offset from base socket to send
returns:
nothing
globals:
openparam.o_lskt
calls:
netreply
locv (sys)
called by:
store
retrieve
append
history:
initial coding 4/12/76 by S. F. Holmgren
*/
sendsock( offset )
{
netreply("255 SOCK %s\r\n",locv(0,NetParams.np.o_lskt+offset-2));
}
/*name:
netreply
function:
send & log appropriate ascii responses
algorithm:
send it to the standard output file & to the log file
parameters:
str to be sent to net
returns:
nothing
globals:
none
calls:
fdprintf(sys)
go_die()
called by:
the world
history:
initial coding 4/13/76 by S. F. Holmgren
replaced by fdprintf facility to permit greater
versatility in replies (e.g.,
including errmsg, etc.) dm/bbn Apr 10, '80
*/
netreply(printargs)
char *printargs;
{
extern struct net_stuff NetParams;
extern int go_die();
if(fprintf(NetParams.fds,"%r", &printargs) < 0){
fdprintf(ERRFD,"(netreply) error in writing [");
fdprintf(ERRFD, "%r", &printargs);
fdprintf(ERRFD,"]; %s\n", errmsg(0));
go_die(ERRFD, "\n");
}
}