#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <proto/socket.h>
#include <netdb.h>
#include <errno.h>
#include <dos/dos.h>
#include <dos/dostags.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Library *SocketBase=NULL;
#define bzero(base,n) memset(base,0,n)
#define bcopy(from,to,n) memcpy(to,from,n)

void Quit(int retcode)
{
	
	if (SocketBase) CloseLibrary(SocketBase);
	exit(retcode);
}

struct Process *MyCreateNewProcTags(ULONG Tag0,...)
{
	return CreateNewProc((struct TagItem *)&Tag0);
}

void main(void)
{
	struct servent *sp;
	struct sockaddr_in ServAddr;
	int Socket,SubSock;
	LONG SubSockID;
	int WaitSig;
	static char ArgStr[200];
	BPTR TelNetProg;
	long Len;
	
	SocketBase=OpenLibrary("bsdsocket.library",2);
	
	if (!SocketBase) Quit(20);
	
	sp=getservbyname("telnet","tcp");
	if (!sp) Quit(21);
	
	bzero(&ServAddr,sizeof(ServAddr));
	ServAddr.sin_port=sp->s_port;
	ServAddr.sin_addr.s_addr=htonl(INADDR_ANY);
	ServAddr.sin_family=AF_INET;
	ServAddr.sin_len=sizeof(ServAddr);
	Socket=socket(AF_INET,SOCK_STREAM,0);
	if (Socket < 0) Quit(22);
	bind(Socket,&ServAddr,sizeof(ServAddr));
	listen(Socket,5);
	WaitSig=AllocSignal(-1);
	if (WaitSig==-1) Quit(23);
	
	
	for (;;) {
		Len=sizeof(ServAddr);
		SubSock=accept(Socket,&ServAddr,&Len);
		if (SubSock < 0) {
			if (Errno()==EINTR) {
				CloseSocket(Socket);
				Quit(0);
			}
			continue;
		}
		SetSignal(0,(1<<WaitSig)); /* unset WaitSig signal */
		SubSockID=ReleaseSocket(SubSock,UNIQUE_ID);
		sprintf(ArgStr,"%u %u %u",(unsigned long)SubSockID,(unsigned long)WaitSig,(unsigned long)FindTask(NULL));
		TelNetProg=LoadSeg("tnserv:TelnetGetty");
		if (!TelNetProg) TelNetProg=LoadSeg("TelnetGetty/TelnetGetty");
		if (!TelNetProg) TelNetProg=LoadSeg("TelnetGetty");
		if (!TelNetProg) TelNetProg=LoadSeg("AmiTCP:Bin/TelnetGetty");
		if (TelNetProg) {
			if (MyCreateNewProcTags(NP_Seglist,TelNetProg,
				NP_Name,"telnet login",
				NP_Arguments,ArgStr,
				NP_StackSize,12000,
				NP_FreeSeglist,TRUE,
				TAG_END)) {
				
				/*CreateProc("telnet login",0,TelNetProg,12000);*/
				Wait(1<<WaitSig); /* Wait for new proc to start up */
			}
		}
	}
	
}
