21 #include "JackTools.h"    22 #include "JackError.h"    23 #include "JackPlatformPlug.h"    24 #include <sys/types.h>    33 void JackFifo::BuildName(
const char* client_name, 
const char* server_name, 
char* res, 
int size)
    35     char ext_client_name[SYNC_MAX_NAME_SIZE + 1];
    36     JackTools::RewriteName(client_name, ext_client_name);
    37     sprintf(res, 
"%s/jack_fifo.%d_%s_%s", jack_client_dir, JackTools::GetUID(), server_name, ext_client_name);
    40 bool JackFifo::Signal()
    46         jack_error(
"JackFifo::Signal name = %s already desallocated!!", fName);
    53     if ((res = (write(fFifo, &c, 
sizeof(c)) != 
sizeof(c)))) {
    54         jack_error(
"JackFifo::Signal name = %s err = %s", fName, strerror(errno));
    59 bool JackFifo::SignalAll()
    65         jack_error(
"JackFifo::SignalAll name = %s already desallocated!!", fName);
    72     if ((res = (write(fFifo, &c, 
sizeof(c)) != 
sizeof(c)))) {
    73         jack_error(
"JackFifo::SignalAll name = %s err = %s", fName, strerror(errno));
    84         jack_error(
"JackFifo::Wait name = %s already desallocated!!", fName);
    88     if ((res = (read(fFifo, &c, 
sizeof(c)) != 
sizeof(c)))) {
    89         jack_error(
"JackFifo::Wait name = %s err = %s", fName, strerror(errno));
    95 #warning JackFifo::TimedWait not available : synchronous mode may not work correctly if FIFO are used    96 bool JackFifo::TimedWait(
long usec)
   102 bool JackFifo::TimedWait(
long usec)
   107         jack_error(
"JackFifo::TimedWait name = %s already desallocated!!", fName);
   112         res = poll(&fPoll, 1, usec / 1000);
   113     } 
while (res < 0 && errno == EINTR);
   115     if (fPoll.revents & POLLIN) {
   119         jack_log(
"JackFifo::TimedWait name = %s usec = %ld err = %s", fName, usec, strerror(errno));
   126 bool JackFifo::Allocate(
const char* name, 
const char* server_name, 
int value)
   129     BuildName(name, server_name, fName, 
sizeof(fName));
   130     jack_log(
"JackFifo::Allocate name = %s", fName);
   132     if (stat(fName, &statbuf) < 0) {
   133         if (errno == ENOENT || errno == EPERM) {
   134             if (mkfifo(fName, 0666) < 0) {
   135                 jack_error(
"Cannot create inter-client FIFO name = %s err = %s", name, strerror(errno));
   143         if (!S_ISFIFO(statbuf.st_mode)) {
   144             jack_error(
"FIFO name = %s already exists, but is not a FIFO", name);
   149     if ((fFifo = open(fName, O_RDWR | O_CREAT, 0666)) < 0) {
   150         jack_error(
"Cannot open FIFO name = %s err = %s", name, strerror(errno));
   154         fPoll.events = POLLERR | POLLIN | POLLHUP | POLLNVAL;
   160 bool JackFifo::ConnectAux(
const char* name, 
const char* server_name, 
int access)
   162     BuildName(name, server_name, fName, 
sizeof(fName));
   163     jack_log(
"JackFifo::ConnectAux name = %s", fName);
   167         jack_log(
"Already connected name = %s", name);
   171     if ((fFifo = open(fName, access)) < 0) {
   172         jack_error(
"Connect: can't connect named fifo name = %s err = %s", fName, strerror(errno));
   176         fPoll.events = POLLERR | POLLIN | POLLHUP | POLLNVAL;
   181 bool JackFifo::Connect(
const char* name, 
const char* server_name)
   183     return ConnectAux(name, server_name, O_RDWR);
   186 bool JackFifo::ConnectOutput(
const char* name, 
const char* server_name)
   188     return ConnectAux(name, server_name, O_WRONLY | O_NONBLOCK);
   191 bool JackFifo::ConnectInput(
const char* name, 
const char* server_name)
   193     return ConnectAux(name, server_name, O_RDONLY);
   196 bool JackFifo::Disconnect()
   199         jack_log(
"JackFifo::Disconnect %s", fName);
   200         if (close(fFifo) != 0) {
   201             jack_error(
"Disconnect: can't disconnect named fifo name = %s err = %s", fName, strerror(errno));
   213 void JackFifo::Destroy()
   216         jack_log(
"JackFifo::Destroy name = %s", fName);
   218         if (close(fFifo) != 0) {
   219             jack_error(
"Destroy: can't destroy fifo name = %s err = %s", fName, strerror(errno));
 SERVER_EXPORT void jack_error(const char *fmt,...)
SERVER_EXPORT void jack_log(const char *fmt,...)