rendered paste bodyif(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;}