#ifndef _H_EXECCLITOOL
#define _H_EXECCLITOOL
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/uio.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdarg.h>
#include <signal.h>
#include <fcntl.h>
#include <cstdio>
#include <cstdarg>
#include <map>
#include <stdlib.h>
#include <CoreFoundation/CFString.h>
class VAArgList
{
public:
VAArgList() {};
~VAArgList() { if (argv) free(argv); }
typedef const char * ArgvArgPtr;
int VAArgList::set(const char *path,va_list params);
const char* const*get() { return argv; }
int size() { return argn; }
private:
ArgvArgPtr *argv; int argn; bool mSet; };
class ExecCLITool
{
public:
ExecCLITool();
~ExecCLITool();
int run(const char *toolPath, const char *toolEnvVar, ...);
void input(const char *data,unsigned int length);
void input(CFStringRef theString, bool appendNULL=false);
const char * data() const { return dataRead; }
unsigned int length() const { return dataLength; }
protected:
void child(const char *toolPath, const char *toolEnvVar, VAArgList& arglist);
void parent(pid_t pid);
void parentReadOutput();
void parentWriteInput();
void closeAllPipes();
void initialize();
void reset();
int stdoutpipe[2]; int stdinpipe [2];
char *dataRead;
unsigned int dataLength;
char *dataToWrite;
unsigned int dataToWriteLength;
static const unsigned int kReadBufSize = 1024;
};
#endif //_H_EXECCLITOOL