#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <stdarg.h>

void bury(int sig);

#define MAX_ARGS 22

int popen2(int *bout,
           int *bin,
           char *path,
           ...)
{
  int in[2];
  int out[2];
  int child;
  char *args[MAX_ARGS+1];
  va_list arg;
  int i;

  va_start(arg, path);
  /* make the parameter array: */
  for(i=0; i<MAX_ARGS; i++) {
    args[i] = va_arg(arg, char *);
    if(!args[i])
      break;
  }
  va_end(arg);

  pipe(in);
  pipe(out);

  signal(SIGCHLD, bury);
  
  child = fork();

  if (child < 0 ) {
    /* failed! */
    return 1;
  }
  else if (0 == child ) {
    /* child */
    
    dup2(in[0], fileno(stdin));
    dup2(out[1], fileno(stdout));
    
    fcntl(fileno(stdin), F_SETFD, 0);
    fcntl(fileno(stdout), F_SETFD, 0);
    
    execvp(path, args);
    /* not reached */
  }
  /* parent! */
  close(in[0]);
  close(out[1]);

#if 0
  fin = fdopen(in[1], "w");
  fout = fdopen(out[0], "r");

  *bout= fout;
  *bin = fin;
#else
  *bout = out[0];
  *bin = in[1];
#endif

  return 0;
}

int fdprintf(int fd, char *fmt, ...)
{
  char s[1024];
  va_list ap;
  va_start(ap, fmt);
  vsprintf(s, fmt, ap);
  va_end(ap);
  /* fwrite(s, strlen(s), 1, stderr); */
  return write(fd, s, strlen(s));
}

int main(void)
{
  int fdin;
  int fdout;
  char c;

  char buffer[256];
  int nbytes;
  int where=0;

  if(popen2(&fdout, &fdin, "telnet", "femboijnk", "wcsw087", NULL ))
    return -1;

  while(1) {
    /* fgets(buffer, 256, fout) */
    nbytes = read(fdout, buffer, 256);
    if(nbytes) {
      buffer[nbytes]=0;
      fwrite(buffer, nbytes, 1, stderr);
      
      if((0== where) && strstr(buffer, "login: ")) {
        fdprintf(fdin, "qradast\n");
        where++;
      }
      else if((1 == where) && strstr(buffer, "Password: ")) {
        fdprintf(fdin, "2ninja2\n");
        where++;
      }
      else if((2 == where) && strstr(buffer, "~>")) {
        fdprintf(fdin, "touch apa\n");
        where++;
        break;
      }
    }
  }

  return 0;
}


void bury(int sig)
{
  /* bury all dead children */
  wait(0);
}

