All pastes #26702 Raw Edit

Miscellany

public cpp v1 · immutable
#26702 ·published 2005-10-26 03:19 UTC
rendered paste body
if(numpipes==0){	// single command}else{	int fdsl[2];	// file descriptors currently dealing the pipe to the left of the current process	int fdsr[2];	// file decsriptors currently dealing the pipe to the left of the current process	char** argv=new char*[cmd2.size()];	int i=0,j;	if(pipe(fdsr)<0)	{	//error	}	for(j=0;cmd2[i+j]!="|"&&i+j<cmd2.size();++j)	{	argv[j]=new char[cmd2[i+j].length()+1];		strcpy(argv[j],cmd2[i+j].c_str());	}	argv[j]=NULL;	i=j+1;	pid=fork();	if(pid<0)	{	//error	}	else if(pid==0)	{	dup2(fdsr[1],1);		close(fdsr[0]);		close(fdsr[1]);		execvp(argv[0],argv);		// error		_exit(errno==ENOENT?127:126);	}	for(j=0;argv[j];++j)	{	delete[] argv[j];	}	for(int pipesdone=1;pipesdone<numpipes&&i<cmd2.size();++pipesdone)	{	fdsl[0]=fdsr[0];		fdsl[1]=fdsr[1];		if(pipe(fdsr)<0)		{	//error		}		for(j=0;cmd2[i+j]!="|"&&i+j<cmd2.size();++j)		{	argv[j]=new char[cmd2[i+j].length()+1];			strcpy(argv[j],cmd2[i+j].c_str());		}		argv[j]=NULL;		i=j+1;		pid=fork();		if(pid<0)		{	//error		}		else if(pid==0)		{	dup2(fdsl[0],0);			dup2(fdsr[1],1);			close(fdsl[0]);			close(fdsl[1]);			close(fdsr[0]);			close(fdsr[1]);			execvp(argv[0],argv);			// error			_exit(errno==ENOENT?127:126);		}		for(j=0;argv[j];++j)		{	delete[] argv[j];		}		close(fdsl[0]);		close(fdsl[1]);	}	fdsl[0]=fdsr[0];	fdsl[1]=fdsr[1];	for(j=0;cmd2[i+j]!="|"&&i+j<cmd2.size();++j)	{	argv[j]=new char[cmd2[i+j].length()+1];		strcpy(argv[j],cmd2[i+j].c_str());	}	argv[j]=NULL;	i=j+1;	pid=fork();	if(pid<0)	{	//error	}	else if(pid==0)	{	dup2(fdsl[0],0);		close(fdsl[0]);		close(fdsl[1]);		execvp(argv[0],argv);		// error		_exit(errno==ENOENT?127:126);	}	for(j=0;argv[j];++j)	{	delete[] argv[j];	}	close(fdsl[0]);	close(fdsl[1]);	delete[] argv;}