/* Internet TTY "link" (keyboard chat) server
 * Copyright 1991 Phil Karn, KA9Q
 */
#include <stdio.h>
#include <time.h>
#include "global.h"
#include "config.h"
#include "mbuf.h"
#include "socket.h"
#include "telnet.h"
#include "session.h"
#include "proc.h"
#include "tty.h"
#include "mailbox.h"
#include "commands.h"

#ifdef ALLSERV
static int Sttylink = -1;	/* Protoype socket for service */
extern int Attended;
static char Tnbanner[] = "Welcome to TTY-Link at %s - The system is %s.\n";
extern char SysopBusy[];
extern int Numrows,Numcols;

int
ttylstart(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct sockaddr_in lsocket;
	int s,type;

	if(Sttylink != -1){
		return 0;
	}
	psignal(Curproc,0);	/* Don't keep the parser waiting */
	chname(Curproc,"TTYlink listener");

	lsocket.sin_family = AF_INET;
	lsocket.sin_addr.s_addr = INADDR_ANY;
	if(argc < 2)
		lsocket.sin_port = IPPORT_TTYLINK;
	else
		lsocket.sin_port = atoi(argv[1]);

	Sttylink = socket(AF_INET,SOCK_STREAM,0);
	bind(Sttylink,(char *)&lsocket,sizeof(lsocket));
	listen(Sttylink,1);
	for(;;){
		if((s = accept(Sttylink,NULLCHAR,(int *)NULL)) == -1)
			break;	/* Service is shutting down */
		
#ifdef UNIX
        if(!Attended){
#else
		/* Check for enough mem for new screen - WG7J */
		if(availmem() < Memthresh+(2*Numrows*Numcols)){
#ifndef TNOS_68K
			usprintf(s,"System is overloaded; try again later\r\n");
#else
			usprintf(s,"System is overloaded; try again later\r\l");
#endif
			shutdown(s,1);
		} else if(!Attended)	{
#endif
			usprintf(s,SysopBusy);
			shutdown(s,1);
		} else {
			type = TELNET;
			if (newproc("chat",2048,ttylhandle,s,(void *)&type,NULL,0) == NULLPROC)
				shutdown(s, 1);
		}
	}
	return 0;
}
/* This function handles all incoming "chat" sessions, be they TCP,
 * NET/ROM or AX.25
 */
void
ttylhandle(s,t,p)
int s;
void *t;
void *p;
{
int type,index;
struct session *sp;
char addr[MAXSOCKSIZE];
int len = MAXSOCKSIZE;
struct telnet tn;
extern char *Motd;
time_t nowtime;

	type = * (int *)t;
	sockmode(s,SOCK_ASCII);
	sockowner(s,Curproc);	/* We own it now */
	log(s,"open %s",Sestypes[type]);

	/* Allocate a session descriptor */
	if((sp = newsession(NULLCHAR,type,1)) == NULLSESSION){
        tputs(TooManySessions);
		close_s(s);
		return;
	}
	index = sp - Sessions;

	/* Initialize a Telnet protocol descriptor */
	memset((char *)&tn,0,sizeof(tn));
	tn.session = sp;	/* Upward pointer */
	sp->cb.telnet = &tn;	/* Downward pointer */
	sp->s = s;
	sp->proc = Curproc;

	time(&nowtime);		/* current time */

	getpeername(s,addr,&len);
	tprintf("\007Incoming %s session %u from %s on %s",
	 Sestypes[type],index,psocket(addr),ctime(&nowtime));

	usprintf(s, Tnbanner, Hostname, Attended ? "attended" : "unattended");
	if(Motd != NULLCHAR)
		usprintf(s, "%s", Motd);

	tnrecv(&tn);
}

/* Shut down Ttylink server */
int
ttyl0(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return (deleteserver (&Sttylink));
}
#endif /*ALLSERV*/
