#include <stdio.h>
#include <mbari/types.h>
#include <mbari/const.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/wait.h>
#include "ExternalApp.h"

#define dprintf if (debug) fprintf
 
ExternalApp::ExternalApp(const char *name)
{
  _pid = 0;
}


ExternalApp::~ExternalApp()
{
}


pid_t ExternalApp::pid()
{
  return _pid;
}


int ExternalApp::run(char **argv, char *errorBuf, 
		     int redirectedFd, int *pipeFd)
{
  MBool debug = FALSE;
  

  switch (_pid = fork())
  {
    case 0:
    // Child process

    // Re-direct stderr to pipe
    if (pipeFd)
    {  
      close(redirectedFd);
      dup(pipeFd[1]);
      close(pipeFd[0]);
    }
    
    dprintf(stderr, "Try to exec %s...\n", argv[0]);
    
    execvp(argv[0], argv);
    sprintf(errorBuf, "Couldn't exec \"%s\"", argv[0]); 
    perror(errorBuf);
    
    _exit(1);
    break;
    
    case -1:
    perror("CtdSetup::fork() failed");
    exit(1);
    break;
  }
  
  // In parent
  if (pipeFd)  
    close(pipeFd[1]);
  
  return _pid;
}

