home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Multimedia / MPlay / Source / Process.m < prev   
Encoding:
Text File  |  1995-10-20  |  1.6 KB  |  103 lines

  1. /*
  2.  * Process.m
  3.  */
  4. #import "Process.h"
  5.  
  6. @implementation Process
  7.  
  8. -initFromCommand:(char **)argv
  9. {
  10.     [super init];
  11.     
  12.     if(argv==0 || argv[0]==0 || access(argv[0],X_OK)){
  13.         return nil;
  14.     }
  15.     
  16.     if(pipe(toProcess)== -1){
  17.         [self free];
  18.         return nil; /* could not open first pipe */
  19.     }
  20.     
  21.     if(pipe(fromProcess)== -1){
  22.         close(toProcess[0]);
  23.         close(toProcess[1]);
  24.         [self free];
  25.         return nil;
  26.     }
  27.     
  28.     pid=fork();
  29.     
  30.     if(pid== -1){
  31.         [self free]; /* no more processes */
  32.         return nil;
  33.     }
  34.     
  35.     if(pid==0){
  36.         /* executued by the child, set up and execv */
  37.         close(0);                 /* stdin */
  38.         close(1);                 /* stdout */
  39.  
  40.         close(toProcess[1]);
  41.         close(fromProcess[0]);
  42.  
  43.         dup2(toProcess[0], 0);     /* stdin */
  44.         dup2(toProcess[1], 1);     /* stdout */
  45.  
  46.         close(2);                 /* stderr */
  47.         dup2(fromProcess[1], 2);/* stderr */
  48.  
  49.     execv(argv[0], argv);
  50.     perror(NXArgv[0]);
  51.     exit(1);
  52.     }
  53.     
  54.     close(toProcess[0]);        /* exectude by parent */
  55.     close(fromProcess[1]);        /* close the other ends of the pipe */
  56.     return self;
  57. }
  58.  
  59. - free
  60. {
  61.     if(fdHandlerInstalled) DPSRemoveFD(fromProcess[0]);
  62.     if(toProcess[1]) close(toProcess[1]);
  63.     if(fromProcess[0]) close(fromProcess[0]);
  64.     if(pid>0) kill(pid,9);
  65.     return [super free];
  66. }
  67.  
  68. - (int)toFd
  69. {
  70.     return toProcess[1];
  71. }
  72.  
  73. - (int)fromFd
  74. {
  75.     return fromProcess[0];
  76. }
  77.  
  78. /* send a line to the process */
  79. - writeLine:(const char *)aLine
  80. {
  81.     int len = strlen(aLine);
  82.     
  83.     write(toProcess[1], aLine, len);
  84.     
  85.     if(len>0 && aLine[len-1] != '\n'){
  86.         write(toProcess[1], "\n", 1); /* courtesy */
  87.     }
  88.     
  89.     return self;
  90. }
  91.  
  92. - dpsWatchFD:(DPSFDProc)handler data:(void *)userData priority:(int)pri
  93. {
  94.     DPSAddFD(fromProcess[0], handler, userData, pri);
  95.     fdHandlerInstalled = YES;
  96.     return self;
  97. }
  98.  
  99. @end
  100.  
  101.  
  102.         
  103.