SASC
DVBSoftCAM

cPipe Class Reference

#include <thread.h>

List of all members.

Public Member Functions

 cPipe (void)
 ~cPipe ()
 operator FILE * ()
bool Open (const char *Command, const char *Mode)
int Close (void)

Detailed Description

Definition at line 162 of file thread.h.


Constructor & Destructor Documentation

cPipe::cPipe ( void  )

Definition at line 379 of file thread.cpp.

References NULL.

{
  pid = -1;
  f = NULL;
}
cPipe::~cPipe ( )

Definition at line 385 of file thread.cpp.

References Close().

{
  Close();
}

Member Function Documentation

int cPipe::Close ( void  )

Definition at line 448 of file thread.cpp.

References i, LOG_ERROR, NULL, and cCondWait::SleepMs().

Referenced by cPlainKeys::Action(), and ~cPipe().

{
  int ret = -1;

  if (f) {
     fclose(f);
     f = NULL;
     }

  if (pid > 0) {
     int status = 0;
     int i = 5;
     while (i > 0) {
           ret = waitpid(pid, &status, WNOHANG);
           if (ret < 0) {
              if (errno != EINTR && errno != ECHILD) {
                 LOG_ERROR;
                 break;
                 }
              }
           else if (ret == pid)
              break;
           i--;
           cCondWait::SleepMs(100);
           }
     if (!i) {
        kill(pid, SIGKILL);
        ret = -1;
        }
     else if (ret == -1 || !WIFEXITED(status))
        ret = -1;
     pid = -1;
     }

  return ret;
}
bool cPipe::Open ( const char *  Command,
const char *  Mode 
)

Definition at line 390 of file thread.cpp.

References fd, i, LOG_ERROR, LOG_ERROR_STR, and NULL.

Referenced by cPlainKeys::Action().

{
  int fd[2];

  if (pipe(fd) < 0) {
     LOG_ERROR;
     return false;
     }
  if ((pid = fork()) < 0) { // fork failed
     LOG_ERROR;
     close(fd[0]);
     close(fd[1]);
     return false;
     }

  const char *mode = "w";
  int iopipe = 0;

  if (pid > 0) { // parent process
     if (strcmp(Mode, "r") == 0) {
        mode = "r";
        iopipe = 1;
        }
     close(fd[iopipe]);
     f = fdopen(fd[1 - iopipe], mode);
     if ((f = fdopen(fd[1 - iopipe], mode)) == NULL) {
        LOG_ERROR;
        close(fd[1 - iopipe]);
        }
     return f != NULL;
     }
  else { // child process
     int iofd = STDOUT_FILENO;
     if (strcmp(Mode, "w") == 0) {
        mode = "r";
        iopipe = 1;
        iofd = STDIN_FILENO;
        }
     close(fd[iopipe]);
     if (dup2(fd[1 - iopipe], iofd) == -1) { // now redirect
        LOG_ERROR;
        close(fd[1 - iopipe]);
        _exit(-1);
        }
     else {
        int MaxPossibleFileDescriptors = getdtablesize();
        for (int i = STDERR_FILENO + 1; i < MaxPossibleFileDescriptors; i++)
            close(i); //close all dup'ed filedescriptors
        if (execl("/bin/sh", "sh", "-c", Command, NULL) == -1) {
           LOG_ERROR_STR(Command);
           close(fd[1 - iopipe]);
           _exit(-1);
           }
        }
     _exit(0);
     }
}
cPipe::operator FILE * ( ) [inline]

Definition at line 169 of file thread.h.

{ return f; }

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines