rendered paste bodyif(numpipes==0){ // single command}else{ int fdsi[2]; // file descriptors currently dealing with input int fdso[2]; // file decsriptors currently dealing with output char** argv=new char*[cmd2.size()]; int i=0,j; if(pipe(fdso)<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(fdso[1],1); close(fdso[0]); close(fdso[1]); execvp(argv[0],argv); // error } for(j=0;argv[j];++j) { delete[] argv[j]; } for(int pipesdone=1;pipesdone<numpipes&&i<cmd2.size();++pipesdone) { fdsi[0]=fdso[0]; fdsi[1]=fdso[1]; if(pipe(fdso)<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(fdsi[0],0); dup2(fdso[1],1); close(fdso[0]); close(fdso[1]); execvp(argv[0],argv); // error } for(j=0;argv[j];++j) { delete[] argv[j]; } } 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(fdsi[0],0); close(fdso[0]); close(fdso[1]); execvp(argv[0],argv); // error } for(j=0;argv[j];++j) { delete[] argv[j]; }}