BBN-Vax-TCP/src/ftp/tcp_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 int netfid;	/* id of network data connection */
	struct con *netps;   /* structure of network gubbish */

	netps = &(handle->np);
	netps->c_fcon = NetParams.ns.n_fcon;
	mkanyhost(netps->c_lcon);
	netps->c_lport = FTPSOCK - 1;		/* default unless PASV */
	netps->c_fport = NetParams.ns.n_fport;
	/* specify a relative, direct open that we initiate */
	netps->c_mode = CONACT | CONTCP;
	netps->c_rbufs = netps->c_sbufs = 0;
	*((offset & 1) ? &netps->c_sbufs : &netps->c_rbufs) = 3;
	netps->c_lo = netps->c_hi = 0;
	netps->c_timeo = 60;	/* give up after sixty seconds */
	sleep(2);

	/* try and open network data connection */
	if ((netfid = open (tcpfile, netps)) < 0)
	{
		netreply ("454 Can't Establish Data Connection; %s.\r\n",
			errmsg(0));
		exit (-1);
	}

/* 	ioctl(netfid, NETSETE, NULL); */
	return handle->fds = netfid;		/* give file id back */
}


/*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
*/

/* VARARGS */
netreply(printargs)
char * printargs;
{
	extern struct net_stuff NetParams;
	extern go_die();
	char replyline [256];

	sprintf (replyline,"%r", &printargs);
	if (write (NetParams.fds, replyline, strlen (replyline)) < 0)
	{
		fprintf (ERRFD,"(netreply) error in writing [\n");
		fprintf (ERRFD, "%r", &printargs);
		fprintf (ERRFD,"]; %s\n", errmsg(0));
		go_die (ERRFD, "\n");
	}
}