Code:
vector<string> left_args;
//left_comm_toks is a vector that stores strings.
// GetNumTokens returns the size of the left_com_toks vector
for(int i = 0; i < left_comm_toks.GetNumTokens(); i++)
{
left_args.push_back(left_comm_toks[i]);
}
vector<char *> left_argv;
// loop restores the vector with the same elements but diff type
for(int i = 0; i < left_args.size(); i++)
left_argv.push_back(const_cast<char *>(left_args[i].c_str()));
close(p[0]);
dup2(p[1], 1);
close(p[1]);
//argv[2] = 0;
execvp(arg0, left_argv); // get error right here left_arg is not the type that execvp wants
cerr << "Error on exec of " << arg0 << ": " << strerror(errno) << endl;
_exit(errno == ENOENT ? 127 : 126);
The above code of course does not work. What i think i need to do is copy the left_argv vector into a array so that execvp can use it. How can I go about doing this? Is there a way to cast the vector or something so i dont have to recopy into an array?
PS, this is not the whole code I just posted the part that is giving me trouble, the rest of the program works. Here is the WHOLE function just in case you need it.
Code:
void execute_command(string left_command, string right_command)
{
//char *argv[] = {"ls", "ls", 0};
//char *left_arg[] = {"ls", 0};
//char *right_arg[] = {"grep", "main", 0};
int p[2];
int pid;
int len, len2;
ParsedTokens left_comm_toks;
ParsedTokens right_comm_toks;
// int pipe(int filedes[2]);
// filedes[0] is for reading, filedes[1] is for writing
if(pipe(p) < 0)
{
cerr << strerror(errno) << endl;
exit(EXIT_FAILURE);
}
pid = fork();
if(pid < 0)
{
cerr << strerror(errno) << endl;
exit(EXIT_FAILURE);
}
if(pid == 0)
{
cout << "exec left arg" << endl;
char * tempstring;
tempstring = new char[left_command.length() + 1];
strcpy(tempstring, left_command.c_str());
left_comm_toks.ParseAndAddTokens(tempstring);
len = left_comm_toks[0].length();
const char * arg0 = left_comm_toks[0].c_str();
// converts left_command into left_argv[] which execvp uses
/*len = left_command.length();
char * const myArr = new char[len + 1];
for(int x = 0; x < len; x++)
myArr[x] = left_command[x];
myArr[len] = '\0';
char * const left_argv[] = {myArr,0};*/
vector<string> left_args;
for(int i = 0; i < left_comm_toks.GetNumTokens(); i++)
{
left_args.push_back(left_comm_toks[i]);
}
vector<char *> left_argv;
for(int i = 0; i < left_args.size(); i ++)
left_argv.push_back(const_cast<char *>(left_args[i].c_str()));
close(p[0]);
dup2(p[1], 1);
close(p[1]);
execvp(arg0, left_argv);
cerr << "Error on exec of " << arg0 << ": " << strerror(errno) << endl;
_exit(errno == ENOENT ? 127 : 126);
}
// do the same thing except for the right command
pid = fork();
if(pid < 0)
{
cerr << strerror(errno) << endl;
exit(EXIT_FAILURE);
}
if(pid == 0)
{
cout << "executing right command" << endl;
// converts left_command into left_argv[] which execvp uses
len2 = right_command.length();
char * const myArr2 = new char[len +1];
for(int x = 0; x < len2; x++)
myArr2[x] = right_command[x];
myArr2[len2] = '\0';
char *const right_argv[] = {myArr2, 0};
close(p[1]);
dup2(p[0], 0);
close(p[0]);
execvp(right_argv[0], right_argv);
cerr << "Error on exec of " << right_argv[0] << ": " << strerror(errno) << endl;
_exit(errno == ENOENT ? 127 : 126);
}
close(p[0]);
close(p[1]);
wait(0);
wait(0);
}