Fixed a few problems in the IpcLibs.
This commit is contained in:
		@@ -528,6 +528,8 @@ SChannel::sendReplyData(
 | 
			
		||||
//
 | 
			
		||||
//  Notes:
 | 
			
		||||
//
 | 
			
		||||
//  Environment:
 | 
			
		||||
//
 | 
			
		||||
// L2
 | 
			
		||||
//=======================================================================--
 | 
			
		||||
{
 | 
			
		||||
@@ -536,6 +538,8 @@ SChannel::sendReplyData(
 | 
			
		||||
   struct msghdr  sendmsgHdr = {0};
 | 
			
		||||
   struct iovec   ioVectors[2];
 | 
			
		||||
   unsigned long  bytesSent;
 | 
			
		||||
   unsigned long  totalBytesSent = 0;
 | 
			
		||||
   unsigned long  bytesToSend = sizeof(reqDataPktHdr) + serverDataLen;
 | 
			
		||||
 | 
			
		||||
   DbgTrace(1, "SChannel::sendReplyData- Start, Obj = %08X\n", this);
 | 
			
		||||
 | 
			
		||||
@@ -554,34 +558,72 @@ SChannel::sendReplyData(
 | 
			
		||||
         // the server.
 | 
			
		||||
         ioVectors[0].iov_base = reqDataPktHdr;
 | 
			
		||||
         ioVectors[0].iov_len = sizeof(reqDataPktHdr);
 | 
			
		||||
         ioVectors[1].iov_base = pServerData;
 | 
			
		||||
         ioVectors[1].iov_base = (char*) pServerData;
 | 
			
		||||
         ioVectors[1].iov_len = serverDataLen;
 | 
			
		||||
         sendmsgHdr.msg_iov = ioVectors;
 | 
			
		||||
         sendmsgHdr.msg_iovlen = 2;
 | 
			
		||||
         printf("SChannel::sendReplyData- Sending %d header bytes\n", sizeof(reqDataPktHdr));
 | 
			
		||||
         printf("SChannel::sendReplyData- Sending %d payload bytes\n", serverDataLen);
 | 
			
		||||
         while (1)
 | 
			
		||||
         {
 | 
			
		||||
            bytesSent = sendmsg(m_socket,
 | 
			
		||||
                                &sendmsgHdr,
 | 
			
		||||
                                MSG_NOSIGNAL);
 | 
			
		||||
            if (bytesSent != SOCKET_ERROR
 | 
			
		||||
                || errno != EINTR)
 | 
			
		||||
            if (bytesSent == SOCKET_ERROR)
 | 
			
		||||
            {
 | 
			
		||||
               // Check if we were interrupted during the transfer
 | 
			
		||||
               if (errno == EINTR)
 | 
			
		||||
               {
 | 
			
		||||
                  // Just try again
 | 
			
		||||
                  continue;
 | 
			
		||||
               }
 | 
			
		||||
 | 
			
		||||
               // An unrecoverable error was encountered during the send operation,
 | 
			
		||||
               // assume there was a communication failure. Close the socket to make
 | 
			
		||||
               // sure that the connectionThread cleans up.
 | 
			
		||||
               //printf("SChannel::sendReplyData- sendmsgn error, totalBytesSent = %d, bytesToSend = %d, errno = %d\n", totalBytesSent, bytesToSend, errno);
 | 
			
		||||
               DbgTrace(0, "SChannel::sendReplyData- sendmsgn error, errno = %d\n", errno);
 | 
			
		||||
               m_state = State_Disconnected;
 | 
			
		||||
               shutdown(m_socket, SHUT_RDWR);
 | 
			
		||||
               struct linger linger_opt = {1, 15};
 | 
			
		||||
               setsockopt(m_socket, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt));
 | 
			
		||||
               closesocket(m_socket);
 | 
			
		||||
               m_socket = INVALID_SOCKET;
 | 
			
		||||
               break;
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
         if (bytesSent != (sizeof(reqDataPktHdr) + serverDataLen))
 | 
			
		||||
         {
 | 
			
		||||
            // The send was unsuccessful, assume there was a communication
 | 
			
		||||
            // failure. Close the socket to make sure that the connectionThread
 | 
			
		||||
            // cleans up.
 | 
			
		||||
            m_state = State_Disconnected;
 | 
			
		||||
            shutdown(m_socket, SHUT_RDWR);
 | 
			
		||||
            struct linger linger_opt = {1, 15};
 | 
			
		||||
            setsockopt(m_socket, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt));
 | 
			
		||||
            closesocket(m_socket);
 | 
			
		||||
            m_socket = INVALID_SOCKET;
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
               // Account for the bytes sent
 | 
			
		||||
               totalBytesSent += bytesSent;
 | 
			
		||||
 | 
			
		||||
               // Check if we are done sending all of the data
 | 
			
		||||
               if (totalBytesSent >= bytesToSend)
 | 
			
		||||
               {
 | 
			
		||||
                  // We are done
 | 
			
		||||
                  break;
 | 
			
		||||
               }
 | 
			
		||||
               else
 | 
			
		||||
               {
 | 
			
		||||
                  // Adjust the ioVector structure to send data not yet sent
 | 
			
		||||
                  if (totalBytesSent >= sizeof(reqDataPktHdr))
 | 
			
		||||
                  {
 | 
			
		||||
                     // The packet header was sent, use only one ioVector.
 | 
			
		||||
                     int   serverDataAlreadySent = totalBytesSent - sizeof(reqDataPktHdr);
 | 
			
		||||
                     ioVectors[0].iov_base = (char*) pServerData + serverDataAlreadySent;
 | 
			
		||||
                     ioVectors[0].iov_len = serverDataLen - serverDataAlreadySent;
 | 
			
		||||
                     sendmsgHdr.msg_iov = ioVectors;
 | 
			
		||||
                     sendmsgHdr.msg_iovlen = 1;
 | 
			
		||||
                  }
 | 
			
		||||
                  else
 | 
			
		||||
                  {
 | 
			
		||||
                     // Not all of the packet header was sent, use two ioVectors.
 | 
			
		||||
                     ioVectors[0].iov_base = (char*) reqDataPktHdr + totalBytesSent;
 | 
			
		||||
                     ioVectors[0].iov_len = sizeof(reqDataPktHdr) - totalBytesSent;
 | 
			
		||||
                     ioVectors[1].iov_base = (char*) pServerData;
 | 
			
		||||
                     ioVectors[1].iov_len = serverDataLen;
 | 
			
		||||
                     sendmsgHdr.msg_iov = ioVectors;
 | 
			
		||||
                     sendmsgHdr.msg_iovlen = 2;
 | 
			
		||||
                  }
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
         // Return success even if the send failed to allow things to be cleaned up
 | 
			
		||||
@@ -605,7 +647,7 @@ SChannel::sendReplyData(
 | 
			
		||||
 | 
			
		||||
   return retStatus;
 | 
			
		||||
 | 
			
		||||
}  /*-- SChannel::sendData() --*/
 | 
			
		||||
}  /*-- SChannel::sendReplyData() --*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//++=======================================================================
 | 
			
		||||
@@ -621,12 +663,18 @@ SChannel::sendReplyError(
 | 
			
		||||
//
 | 
			
		||||
//  Notes:
 | 
			
		||||
//
 | 
			
		||||
// L1
 | 
			
		||||
//  Environment:
 | 
			
		||||
//
 | 
			
		||||
// L2
 | 
			
		||||
//=======================================================================--
 | 
			
		||||
{
 | 
			
		||||
   int            retStatus = -1;
 | 
			
		||||
   char           reqErrorPktHdr[ReqErrorPktHdrTemplate.length()];
 | 
			
		||||
   struct msghdr  sendmsgHdr = {0};
 | 
			
		||||
   struct iovec   ioVectors[1];
 | 
			
		||||
   unsigned long  bytesSent;
 | 
			
		||||
   unsigned long  totalBytesSent = 0;
 | 
			
		||||
   unsigned long  bytesToSend = sizeof(reqErrorPktHdr);
 | 
			
		||||
 | 
			
		||||
   DbgTrace(1, "SChannel::sendReplyError- Start, Obj = %08X\n", this);
 | 
			
		||||
 | 
			
		||||
@@ -641,30 +689,59 @@ SChannel::sendReplyError(
 | 
			
		||||
                                            0,
 | 
			
		||||
                                            reqErrorPktHdr) == 0)
 | 
			
		||||
      {
 | 
			
		||||
         // Packet header was built, now sent it to the client.
 | 
			
		||||
         // Packet header was built, now sent it along with the client data to
 | 
			
		||||
         // the server.
 | 
			
		||||
         ioVectors[0].iov_base = reqErrorPktHdr;
 | 
			
		||||
         ioVectors[0].iov_len = sizeof(reqErrorPktHdr);
 | 
			
		||||
         sendmsgHdr.msg_iov = ioVectors;
 | 
			
		||||
         sendmsgHdr.msg_iovlen = 1;
 | 
			
		||||
         while (1)
 | 
			
		||||
         {
 | 
			
		||||
            bytesSent = send(m_socket,
 | 
			
		||||
                             reqErrorPktHdr,
 | 
			
		||||
                             sizeof(reqErrorPktHdr),
 | 
			
		||||
                             MSG_NOSIGNAL);
 | 
			
		||||
            if (bytesSent != SOCKET_ERROR
 | 
			
		||||
                || errno != EINTR)
 | 
			
		||||
            bytesSent = sendmsg(m_socket,
 | 
			
		||||
                                &sendmsgHdr,
 | 
			
		||||
                                MSG_NOSIGNAL);
 | 
			
		||||
            if (bytesSent == SOCKET_ERROR)
 | 
			
		||||
            {
 | 
			
		||||
               // Check if we were interrupted during the transfer
 | 
			
		||||
               if (errno == EINTR)
 | 
			
		||||
               {
 | 
			
		||||
                  // Just try again
 | 
			
		||||
                  continue;
 | 
			
		||||
               }
 | 
			
		||||
 | 
			
		||||
               // An unrecoverable error was encountered during the send operation,
 | 
			
		||||
               // assume there was a communication failure. Close the socket to make
 | 
			
		||||
               // sure that the connectionThread cleans up.
 | 
			
		||||
               //printf("SChannel::sendReplyError- sendmsgn error, totalBytesSent = %d, bytesToSend = %d, errno = %d\n", totalBytesSent, bytesToSend, errno);
 | 
			
		||||
               DbgTrace(0, "SChannel::sendReplyError- sendmsgn error, errno = %d\n", errno);
 | 
			
		||||
               m_state = State_Disconnected;
 | 
			
		||||
               shutdown(m_socket, SHUT_RDWR);
 | 
			
		||||
               struct linger linger_opt = {1, 15};
 | 
			
		||||
               setsockopt(m_socket, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt));
 | 
			
		||||
               closesocket(m_socket);
 | 
			
		||||
               m_socket = INVALID_SOCKET;
 | 
			
		||||
               break;
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
         if (bytesSent != sizeof(reqErrorPktHdr))
 | 
			
		||||
         {
 | 
			
		||||
            // The send was unsuccessful, assume there was a communication
 | 
			
		||||
            // failure. Close the socket to make sure that the connectionThread
 | 
			
		||||
            // cleans up.
 | 
			
		||||
            m_state = State_Disconnected;
 | 
			
		||||
            shutdown(m_socket, SHUT_RDWR);
 | 
			
		||||
            struct linger linger_opt = {1, 15};
 | 
			
		||||
            setsockopt(m_socket, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt));
 | 
			
		||||
            closesocket(m_socket);
 | 
			
		||||
            m_socket = INVALID_SOCKET;
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
               // Account for the bytes sent
 | 
			
		||||
               totalBytesSent += bytesSent;
 | 
			
		||||
 | 
			
		||||
               // Check if we are done sending all of the data
 | 
			
		||||
               if (totalBytesSent >= bytesToSend)
 | 
			
		||||
               {
 | 
			
		||||
                  // We are done
 | 
			
		||||
                  break;
 | 
			
		||||
               }
 | 
			
		||||
               else
 | 
			
		||||
               {
 | 
			
		||||
                  // Adjust the ioVector structure to send data not yet sent
 | 
			
		||||
                  ioVectors[0].iov_base = (char*) reqErrorPktHdr + totalBytesSent;
 | 
			
		||||
                  ioVectors[0].iov_len = sizeof(reqErrorPktHdr) - totalBytesSent;
 | 
			
		||||
                  sendmsgHdr.msg_iov = ioVectors;
 | 
			
		||||
                  sendmsgHdr.msg_iovlen = 1;
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
         // Return success even if the send failed to allow things to be cleaned up
 | 
			
		||||
@@ -673,7 +750,7 @@ SChannel::sendReplyError(
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
         DbgTrace(0, "SChannel::sendReplyError- Error building Req Error Pkt Header, Obj = %08X\n", this);
 | 
			
		||||
         DbgTrace(0, "SChannel::sendReplyError- Error building Req Data Pkt Header, Obj = %08X\n", this);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   else
 | 
			
		||||
@@ -688,7 +765,7 @@ SChannel::sendReplyError(
 | 
			
		||||
 | 
			
		||||
   return retStatus;
 | 
			
		||||
 | 
			
		||||
}  /*-- SChannel::sendData() --*/
 | 
			
		||||
}  /*-- SChannel::sendReplyError() --*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//=========================================================================
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user