smcp_status_t smcp_observable_update(smcp_observable_t context, uint8_t key) { smcp_status_t ret = SMCP_STATUS_OK; smcp_t const interface = smcp_get_current_instance(); int8_t i; #if !SMCP_EMBEDDED context->interface = interface; #endif if(interface->inbound.is_fake || interface->inbound.is_dupe) { goto bail; } for(i = context->first_observer-1; i >= 0; i = observer_table[i].next - 1) { if(observer_table[i].key != key) continue; if(smcp_inbound_is_related_to_async_response(&observer_table[i].async_response)) break; } if(interface->inbound.has_observe_option) { if(i == -1) { i = get_unused_observer_index(); if(i == -1) goto bail; if(context->last_observer == 0) { context->first_observer = context->last_observer = i + 1; } else { observer_table[context->last_observer-1].next = i +1; context->last_observer = i + 1; } observer_table[i].key = key; observer_table[i].seq = 0; observer_table[i].observable = context; } smcp_start_async_response(&observer_table[i].async_response,SMCP_ASYNC_RESPONSE_FLAG_DONT_ACK); ret = smcp_outbound_add_option_uint(COAP_OPTION_OBSERVE,observer_table[i].seq); } else if(i != -1) { free_observer(&observer_table[i]); } bail: return ret; }
cgi_node_request_t cgi_node_get_associated_request(cgi_node_t node) { cgi_node_request_t ret = NULL; int i; for(i = 0; i < CGI_NODE_MAX_REQUESTS; i++) { cgi_node_request_t request = &node->requests[i]; if (request->state < CGI_NODE_STATE_FINISHED) { continue; } if (!smcp_inbound_is_related_to_async_response(&request->async_response)) { syslog(LOG_DEBUG, "cgi_node_get_associated_request: %d: session mismatch", i); continue; } ret = request; break; } return ret; }