20 #include "JackSocketServerChannel.h"    21 #include "JackRequest.h"    22 #include "JackServer.h"    23 #include "JackLockedEngine.h"    24 #include "JackGlobals.h"    25 #include "JackServerGlobals.h"    26 #include "JackClient.h"    27 #include "JackTools.h"    28 #include "JackNotification.h"    29 #include "JackException.h"    39 JackSocketServerChannel::JackSocketServerChannel():
    40     fThread(this), fDecoder(NULL)
    46 JackSocketServerChannel::~JackSocketServerChannel()
    51 int JackSocketServerChannel::Open(
const char* server_name, JackServer* server)
    53     jack_log(
"JackSocketServerChannel::Open");
    56     if (fRequestListenSocket.Bind(jack_server_dir, server_name, 0) < 0) {
    57         jack_log(
"JackSocketServerChannel::Open : cannot create result listen socket");
    64     fDecoder = 
new JackRequestDecoder(server, 
this);
    69 void JackSocketServerChannel::Close()
    71    fRequestListenSocket.Close();
    74     std::map<int, std::pair<int, JackClientSocket*> >::iterator it;
    76     for (it = fSocketTable.begin(); it != fSocketTable.end(); it++) {
    77         pair<int, JackClientSocket*> elem = (*it).second;
    78         JackClientSocket* socket = elem.second;
    88 int JackSocketServerChannel::Start()
    90     if (fThread.Start() != 0) {
    91         jack_error(
"Cannot start Jack server listener");
    98 void JackSocketServerChannel::Stop()
   103 void JackSocketServerChannel::ClientCreate()
   105     jack_log(
"JackSocketServerChannel::ClientCreate socket");
   106     JackClientSocket* socket = fRequestListenSocket.Accept();
   108         fSocketTable[socket->GetFd()] = make_pair(-1, socket);
   111         jack_error(
"Client socket cannot be created");
   115 int JackSocketServerChannel::GetFd(JackClientSocket* socket_aux)
   117     std::map<int, std::pair<int, JackClientSocket*> >::iterator it;
   119     for (it = fSocketTable.begin(); it != fSocketTable.end(); it++) {
   120         pair<int, JackClientSocket*> elem = (*it).second;
   121         JackClientSocket* socket = elem.second;
   122         if (socket_aux == socket) {
   129 void JackSocketServerChannel::ClientAdd(detail::JackChannelTransactionInterface* socket_aux, JackClientOpenRequest* req, JackClientOpenResult *res)
   132     res->fResult = fServer->GetEngine()->ClientExternalOpen(req->fName, req->fPID, req->fUUID, &refnum, &res->fSharedEngine, &res->fSharedClient, &res->fSharedGraph);
   133     if (res->fResult == 0) {
   134         JackClientSocket* socket = dynamic_cast<JackClientSocket*>(socket_aux);
   136         int fd = GetFd(socket);
   138         fSocketTable[fd].first = refnum;
   140         jack_log(
"JackSocketServerChannel::ClientAdd ref = %d fd = %d", refnum, fd);
   143         if (setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, (
const char*)&on, 
sizeof(on)) < 0) {
   144             jack_log(
"JackSocketServerChannel::ClientAdd : setsockopt SO_NOSIGPIPE fd = %ld err = %s", fd, strerror(errno));
   152 void JackSocketServerChannel::ClientRemove(detail::JackChannelTransactionInterface* socket_aux, 
int refnum)
   154     JackClientSocket* socket = dynamic_cast<JackClientSocket*>(socket_aux);
   156     int fd = GetFd(socket);
   159     jack_log(
"JackSocketServerChannel::ClientRemove ref = %d fd = %d", refnum, fd);
   160     fSocketTable.erase(fd);
   166 void JackSocketServerChannel::ClientKill(
int fd)
   168     pair<int, JackClientSocket*> elem = fSocketTable[fd];
   169     JackClientSocket* socket = elem.second;
   170     int refnum = elem.first;
   173     jack_log(
"JackSocketServerChannel::ClientKill ref = %d fd = %d", refnum, fd);
   175         jack_log(
"Client was not opened : probably correspond to server_check");
   177         fServer->GetEngine()->ClientKill(refnum);
   180     fSocketTable.erase(fd);
   186 void JackSocketServerChannel::BuildPoolTable()
   191         fPollTable = 
new pollfd[fSocketTable.size() + 1];
   193         jack_log(
"JackSocketServerChannel::BuildPoolTable size = %d", fSocketTable.size() + 1);
   196         fPollTable[0].fd = fRequestListenSocket.GetFd();
   197         fPollTable[0].events = POLLIN | POLLERR;
   200         map<int, pair<int, JackClientSocket*> >::iterator it;
   203         for (i = 1, it = fSocketTable.begin(); it != fSocketTable.end(); it++, i++) {
   204             jack_log(
"JackSocketServerChannel::BuildPoolTable fSocketTable i = %ld fd = %ld", i, it->first);
   205             fPollTable[i].fd = it->first;
   206             fPollTable[i].events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL;
   215     sigaddset(&set, SIGPIPE);
   216     pthread_sigmask(SIG_BLOCK, &set, 0);
   220 bool JackSocketServerChannel::Execute()
   225         if ((poll(fPollTable, fSocketTable.size() + 1, 10000) < 0) && (errno != EINTR)) {
   226             jack_error(
"JackSocketServerChannel::Execute : engine poll failed err = %s request thread quits...", strerror(errno));
   231             for (
unsigned int i = 1; i < fSocketTable.size() + 1; i++) {
   232                 int fd = fPollTable[i].fd;
   233                 jack_log(
"JackSocketServerChannel::Execute : fPollTable i = %ld fd = %ld", i, fd);
   234                 if (fPollTable[i].revents & ~POLLIN) {
   235                     jack_log(
"JackSocketServerChannel::Execute : poll client error err = %s", strerror(errno));
   237                 } 
else if (fPollTable[i].revents & POLLIN) {
   238                     JackClientSocket* socket = fSocketTable[fd].second;
   241                     if (header.Read(socket) < 0) {
   242                         jack_log(
"JackSocketServerChannel::Execute : cannot decode header");
   247                         fDecoder->HandleRequest(socket, header.fType);
   253             if (fPollTable[0].revents & POLLERR) {
   254                 jack_error(
"Error on server request socket err = %s", strerror(errno));
   257             if (fPollTable[0].revents & POLLIN) {
   265     } 
catch (JackQuitException& e) {
   266         jack_log(
"JackSocketServerChannel::Execute : JackQuitException");
 SERVER_EXPORT void jack_error(const char *fmt,...)
SERVER_EXPORT void jack_log(const char *fmt,...)