File: safePopen.cc

package info (click to toggle)
gnuift 0.1.14%2Bds-1
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 5,632 kB
  • ctags: 2,973
  • sloc: cpp: 15,867; sh: 8,281; ansic: 1,812; perl: 1,007; php: 651; makefile: 483; lisp: 344
file content (37 lines) | stat: -rw-r--r-- 884 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "libMRML/include/CReaperDistributor.h"
#include "libMRML/include/CRPipe.h"
#include "libMRML/include/safePopen.h"
#include <iostream>
extern CReaperDistributor &getReaperDistributor();

int safePopen(char* const* argv){
  int lMode[2];
  if(pipe(lMode)){
    cerr << "NO PIPE" << endl;
  }else{
    int lExecveTask;
    if(!(lExecveTask=fork())){
      // embarrassing, but necessary, for reasons of race conditions
      sleep(1);
      char lWrite[12];
      sprintf(lWrite,"%d",lMode[1]);
	
      close(1);
      dup(lMode[1]);
	
      const char* lInstruction=argv[0];
	
      if(execve(lInstruction,
		argv,
		0)){
	cerr << "Could not execute " << lInstruction << ":" << strerror(errno) << endl;
      };
    }else{
      CReaper* lReaper=new CRPipe(lExecveTask,lMode[1]);
      getReaperDistributor().addReaper(lReaper);
      return lMode[0];
    }
  }
  return 0;
}