void* dequeue(queue_t *q) { lnode_t *n; pthread_mutex_lock(&q->lock); if (list_isempty(q->list)) { pthread_cond_wait(&q->notempty, &q->lock); } if (list_isfull(q->list)) { n = list_del_first(q->list); pthread_cond_broadcast(&q->notfull); } else { n = list_del_first(q->list); } pthread_mutex_unlock(&q->lock); return lnode_get(n); }
/** * Check for duplicate Message ID * @param op operation * @return status */ static int wsman_is_duplicate_message_id(op_t * op) { WsXmlNodeH header = wsman_get_soap_header_element(op->in_doc, NULL, NULL); int retVal = 0; SoapH soap; WsXmlNodeH msgIdNode; soap = op->dispatch->soap; msgIdNode = ws_xml_get_child(header, 0, XML_NS_ADDRESSING, WSA_MESSAGE_ID); if (msgIdNode != NULL) { lnode_t *node; char *msgId; msgId = ws_xml_get_node_text(msgIdNode); if (msgId[0] == 0 ) { generate_op_fault(op, WSA_INVALID_MESSAGE_INFORMATION_HEADER, 0 ); debug("MessageId missing"); return 1; } debug("Checking Message ID: %s", msgId); u_lock(soap); if (soap->processedMsgIdList == NULL) { soap->processedMsgIdList = list_create(LISTCOUNT_T_MAX); } #ifndef IGNORE_DUPLICATE_ID node = list_first(soap->processedMsgIdList); while (node != NULL) { if (!strcmp(msgId, (char *) node->list_data)) { debug("Duplicate Message ID: %s", msgId); retVal = 1; generate_op_fault(op, WSA_INVALID_MESSAGE_INFORMATION_HEADER, WSA_DETAIL_DUPLICATE_MESSAGE_ID); break; } node = list_next(soap->processedMsgIdList, node); } #endif if (!retVal) { while (list_count(soap->processedMsgIdList) >= PROCESSED_MSG_ID_MAX_SIZE) { node = list_del_first(soap->processedMsgIdList); u_free(node->list_data); u_free(node); } node = lnode_create(NULL); if (node) { node->list_data = u_str_clone(msgId); if (node->list_data == NULL) { u_free(node); } else { list_append(soap->processedMsgIdList, node); } } } u_unlock(soap); } else if (!wsman_is_identify_request(op->in_doc)) { generate_op_fault(op, WSA_MESSAGE_INFORMATION_HEADER_REQUIRED, 0); debug("No MessageId Header found"); return 1; } return retVal; }