Example #1
0
void x_ipc_msgInfoMsgInitialize(void)
{
  int32 refId;
  MSG_DATA_PTR msgData;
  
  LOCK_CM_MUTEX;
  LOCK_IO_MUTEX;
  if (x_ipc_readNBytes(GET_C_GLOBAL(serverRead),
		       (char *)&refId, sizeof(int32)) != StatOK) {
    GET_C_GLOBAL(serverRead) = NO_SERVER_GLOBAL;
    GET_C_GLOBAL(serverWrite) = NO_SERVER_GLOBAL;
    X_IPC_MOD_ERROR("ERROR: Socket connection broken or access denied to central server\n");
    UNLOCK_IO_MUTEX;
    UNLOCK_CM_MUTEX;
    return;
  }

  NET_INT_TO_INT(refId);
  
  msgData = NEW(MSG_DATA_TYPE);
  msgData->refId = refId;
  msgData->name = strdup(X_IPC_MSG_INFO_QUERY);
  msgData->msg_class = QueryClass;
  
  msgData->msgFormat = (FORMAT_PTR)x_ipc_formatterRecv(GET_C_GLOBAL(serverRead));
  msgData->resFormat = (FORMAT_PTR)x_ipc_formatterRecv(GET_C_GLOBAL(serverRead));
  UNLOCK_IO_MUTEX;
  UNLOCK_CM_MUTEX;
  
  (void)x_ipc_msgCreate(msgData);
}
Example #2
0
X_IPC_RETURN_STATUS_TYPE x_ipc_dataMsgSend(int sd, DATA_MSG_PTR dataMsg)
{
  int32 headerAmount, classAmount, dataAmount;
  X_IPC_RETURN_STATUS_TYPE res;
  char *sendInfo;
  struct iovec *tmpVec;
  
  LOCK_IO_MUTEX;
  headerAmount = HEADER_SIZE();
  classAmount = dataMsg->classTotal;
  dataAmount = dataMsg->msgTotal;
  
  sendInfo = (char *)&(dataMsg->classTotal);
  dataMsg->classId = SET_DATA_ENDIAN(dataMsg->classId,dataMsg->dataByteOrder);
  dataMsg->classId = SET_CLASS_ENDIAN(dataMsg->classId,
				      dataMsg->classByteOrder);
  dataMsg->classId = SET_ALIGNMENT(dataMsg->classId);
  
  INT_TO_NET_INT(dataMsg->classTotal);
  INT_TO_NET_INT(dataMsg->msgTotal);
  INT_TO_NET_INT(dataMsg->parentRef);
  INT_TO_NET_INT(dataMsg->intent);
  INT_TO_NET_INT(dataMsg->classId);
  INT_TO_NET_INT(dataMsg->dispatchRef);
  INT_TO_NET_INT(dataMsg->msgRef);
  
  if (classAmount > 0)  {
    tmpVec = x_ipc_copyVectorization(dataMsg->vec,2);
    tmpVec[0].iov_base = sendInfo;
    tmpVec[0].iov_len = headerAmount;
    tmpVec[1].iov_base = dataMsg->classData;
    tmpVec[1].iov_len = classAmount;
    res = x_ipc_writeNBuffers(sd, tmpVec,headerAmount+classAmount+dataAmount);
  } else if (dataAmount > 0) {
    tmpVec = x_ipc_copyVectorization(dataMsg->vec,1);
    tmpVec[0].iov_base = sendInfo;
    tmpVec[0].iov_len = headerAmount;
    res = x_ipc_writeNBuffers(sd, tmpVec,headerAmount+classAmount+dataAmount);
  } else {
    res = x_ipc_writeNBytes(sd, sendInfo, headerAmount);
  }

  NET_INT_TO_INT(dataMsg->classTotal);
  NET_INT_TO_INT(dataMsg->msgTotal);
  NET_INT_TO_INT(dataMsg->parentRef);
  NET_INT_TO_INT(dataMsg->intent);
  NET_INT_TO_INT(dataMsg->classId);
  NET_INT_TO_INT(dataMsg->dispatchRef);
  NET_INT_TO_INT(dataMsg->msgRef);
  
  dataMsg->classId = GET_CLASSID(dataMsg->classId);
  
  UNLOCK_IO_MUTEX;
  return res;
}
Example #3
0
X_IPC_RETURN_STATUS_TYPE x_ipc_dataMsgRecv(int sd, DATA_MSG_PTR *dataMsg,
					   int32 replyRef, void *replyBuf, 
					   int32 replyLen)
{
  X_IPC_RETURN_STATUS_TYPE status;
  
  DATA_MSG_TYPE header;

  *dataMsg = NULL;
  
  LOCK_IO_MUTEX;
  status = x_ipc_readNBytes(sd, (char *)&(header.classTotal), HEADER_SIZE());
  if (status != StatOK) {
    *dataMsg = NULL;
    UNLOCK_IO_MUTEX;
    return status;
  }
  
  NET_INT_TO_INT(header.classTotal);
  NET_INT_TO_INT(header.msgTotal);

  *dataMsg = x_ipc_dataMsgAlloc(header.classTotal + sizeof(DATA_MSG_TYPE));
  **dataMsg = header;
  
  NET_INT_TO_INT((*dataMsg)->parentRef);
  NET_INT_TO_INT((*dataMsg)->intent);
  NET_INT_TO_INT((*dataMsg)->classId);
  NET_INT_TO_INT((*dataMsg)->dispatchRef);
  NET_INT_TO_INT((*dataMsg)->msgRef);
  
  if( header.msgTotal > 0) {
    (*dataMsg)->dataRefCountPtr = (int32 *)x_ipcMalloc(sizeof(int32));
    *((*dataMsg)->dataRefCountPtr) = 1;
  } else {
    (*dataMsg)->dataRefCountPtr = NULL;
  }
  (*dataMsg)->refCount = 0;
  (*dataMsg)->dataStruct = NULL;
  (*dataMsg)->dataByteOrder = GET_DATA_ENDIAN((*dataMsg)->classId);
  (*dataMsg)->classByteOrder = GET_CLASS_ENDIAN((*dataMsg)->classId);
  (*dataMsg)->alignment = (ALIGNMENT_TYPE)GET_ALIGNMENT((*dataMsg)->classId);
  (*dataMsg)->classId = GET_CLASSID((*dataMsg)->classId);
  LOCK_M_MUTEX;
  GET_M_GLOBAL(byteOrder) = (*dataMsg)->dataByteOrder;
  GET_M_GLOBAL(alignment) = (*dataMsg)->alignment;
  UNLOCK_M_MUTEX;
  
  if (header.classTotal > 0)
    (*dataMsg)->classData = ((char *)*dataMsg + sizeof(DATA_MSG_TYPE));
  else
    (*dataMsg)->classData = NULL;
  
  /*  For now, we only handle packed data. */
  if ((*dataMsg)->alignment != ALIGN_PACKED) {
    X_IPC_MOD_ERROR("ERROR: received message with data that is not packed.");
    UNLOCK_IO_MUTEX;
    return StatError;
  }
  
  /* Want to be able to use the already allocated buffer, if possible. */
  
  if (((*dataMsg)->msgRef == replyRef) && (replyBuf != NULL) &&
      (replyLen == header.msgTotal)) {
    (*dataMsg)->msgData = (char *)replyBuf;
    (*dataMsg)->dataStruct = (char *)replyBuf;
  } else if (header.msgTotal > 0)
    (*dataMsg)->msgData = (char *)x_ipcMalloc((unsigned) header.msgTotal);
  else
    (*dataMsg)->msgData = NULL;
  
  if ((header.msgTotal > 0) && (header.classTotal >0)) {
    status = x_ipc_read2Buffers(sd, (*dataMsg)->classData, header.classTotal,
				(*dataMsg)->msgData, header.msgTotal);
  } else if (header.classTotal > 0) {
    status = x_ipc_readNBytes(sd, (*dataMsg)->classData, header.classTotal);
  } else if (header.msgTotal > 0) {
    status = x_ipc_readNBytes(sd, (*dataMsg)->msgData, header.msgTotal);
  }
  
  /* Need to create the vector here.  */
  (*dataMsg)->vec = (struct iovec *)x_ipcMalloc(2 * sizeof(struct iovec));
  
  (*dataMsg)->vec[0].iov_base = (*dataMsg)->msgData;
  (*dataMsg)->vec[0].iov_len = (*dataMsg)->msgTotal;
  
  (*dataMsg)->vec[1].iov_base = NULL;
  (*dataMsg)->vec[1].iov_len = 0;
  
  UNLOCK_IO_MUTEX;
  return status;
}