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); }
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; }
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; }