#ifndef _H_EXECCLITOOL
#define _H_EXECCLITOOL
#include <fcntl.h>
#include <vector>
#include <security_cdsa_utilities/cssmdata.h>
#include <CoreFoundation/CFData.h>
class ExecCLITool
{
protected:
typedef const char * ConstCharPtr; typedef vector<ConstCharPtr> argvec;
typedef vector<CssmAutoData *> iodatavec;
public:
ExecCLITool();
~ExecCLITool();
int runx(const char *toolPath, const char *toolEnvVar = NULL);
int run(const char *toolPath, const char *toolEnvVar, ...);
void addin (const char *data,unsigned int length) { add(data,length,inputdata); };
void addout(const char *data,unsigned int length) { add(data,length,outputdata); };
void addincfs(CFStringRef theString, bool appendNULL=false);
void reset();
void addarg(ConstCharPtr theArg) { args.push_back(theArg); };
void addargs(int count,...);
CFDataRef getResults() const;
void dumpin() { dump(inputdata); };
void dumpout() { dump(outputdata); };
void debugdisp(const char *msg);
protected:
void child(const char *toolPath, const char *toolEnvVar);
int parent(pid_t pid);
void parentReadOutput();
void parentWriteInput(const char *data,unsigned int length);
void closeAllPipes();
void initializePipes();
void cleardata(iodatavec& vec);
void add(const char *data,unsigned int length,iodatavec& vec);
void dump(iodatavec& vec);
int stdoutpipe[2]; int stdinpipe [2];
bool eofSeen[2];
iodatavec inputdata; iodatavec outputdata;
argvec args;
static const unsigned int kReadBufSize = 1024;
enum
{
READ = 0,
WRITE = 1
};
};
#endif //_H_EXECCLITOOL