/******************************************************************** * FUNCTION agt_hello_send * * Send the server <hello> message to the manager on the * specified session * * INPUTS: * scb == session control block * * RETURNS: * status *********************************************************************/ status_t agt_hello_send (ses_cb_t *scb) { assert( scb && "scb is NULL!" ); status_t res = NO_ERR; boolean anyout = FALSE; xmlns_id_t nc_id = xmlns_nc_id(); xml_msg_hdr_t msg; xml_msg_init_hdr(&msg); xml_attrs_t attrs; xml_init_attrs(&attrs); /* start the hello timeout */ (void)time(&scb->hello_time); /* get the server caps */ val_value_t *mycaps = agt_cap_get_capsval(); if (!mycaps) { res = SET_ERROR(ERR_INTERNAL_PTR); } /* setup the prefix map with the NETCONF and NCX namepsaces */ if (res == NO_ERR) { res = xml_msg_build_prefix_map(&msg, &attrs, TRUE, FALSE); } /* send the <?xml?> directive */ if (res == NO_ERR) { res = ses_start_msg(scb); } boolean mode_started = FALSE; if (res == NO_ERR) { ses_start_msg_mode(scb); mode_started = TRUE; } int32 msg_indent = ses_message_indent_count(scb); /* start the hello element */ if (res == NO_ERR) { anyout = TRUE; xml_wr_begin_elem_ex(scb, &msg, 0, nc_id, NCX_EL_HELLO, &attrs, TRUE, max(msg_indent, 0), FALSE); } /* send the capabilities list */ if (res == NO_ERR) { xml_wr_full_val(scb, &msg, mycaps, msg_indent); } /* send the session ID */ if (res == NO_ERR) { xml_wr_begin_elem(scb, &msg, nc_id, nc_id, NCX_EL_SESSION_ID, msg_indent); } if (res == NO_ERR) { xmlChar numbuff[NCX_MAX_NUMLEN]; snprintf((char *)numbuff, sizeof(numbuff), "%d", scb->sid); ses_putstr(scb, numbuff); } if (res == NO_ERR) { xml_wr_end_elem(scb, &msg, nc_id, NCX_EL_SESSION_ID, -1); } /* finish the hello element */ if (res == NO_ERR) { xml_wr_end_elem(scb, &msg, nc_id, NCX_EL_HELLO, max(msg_indent, 0)); } /* finish the message */ if (anyout) { ses_finish_msg(scb); } if (mode_started) { ses_stop_msg_mode(scb); } xml_clean_attrs(&attrs); xml_msg_clean_hdr(&msg); return res; } /* agt_hello_send */
/******************************************************************** * FUNCTION mgr_hello_send * * Send the manager <hello> message to the server on the * specified session * * INPUTS: * scb == session control block * * RETURNS: * status *********************************************************************/ status_t mgr_hello_send (ses_cb_t *scb) { val_value_t *mycaps; xml_msg_hdr_t msg; status_t res; xml_attrs_t attrs; boolean anyout; xmlns_id_t nc_id; #ifdef DEBUG if (!scb) { return SET_ERROR(ERR_INTERNAL_PTR); } #endif #ifdef MGR_HELLO_DEBUG if (LOGDEBUG2) { log_debug2("\nmgr sending hello on session %d", scb->sid); } #endif res = NO_ERR; anyout = FALSE; xml_msg_init_hdr(&msg); xml_init_attrs(&attrs); nc_id = xmlns_nc_id(); /* get my client caps, custom made for this session */ mycaps = mgr_cap_get_ses_capsval(scb); if (!mycaps) { res = SET_ERROR(ERR_INTERNAL_PTR); } /* setup the prefix map with the NETCONF namespace */ if (res == NO_ERR) { res = xml_msg_build_prefix_map(&msg, &attrs, TRUE, FALSE); } /* send the <?xml?> directive */ if (res == NO_ERR) { res = ses_start_msg(scb); } /* start the hello element */ if (res == NO_ERR) { anyout = TRUE; xml_wr_begin_elem_ex(scb, &msg, 0, nc_id, NCX_EL_HELLO, &attrs, ATTRQ, 0, START); } /* send the capabilities list */ if (res == NO_ERR) { xml_wr_full_val(scb, &msg, mycaps, NCX_DEF_INDENT); } /* finish the hello element */ if (res == NO_ERR) { xml_wr_end_elem(scb, &msg, nc_id, NCX_EL_HELLO, 0); } /* finish the message */ if (anyout) { ses_finish_msg(scb); } xml_clean_attrs(&attrs); xml_msg_clean_hdr(&msg); if (mycaps != NULL) { val_free_value(mycaps); } return res; } /* mgr_hello_send */
/******************************************************************** * FUNCTION mgr_rpc_send_request * * Send an <rpc> request to the agent on the specified session * non-blocking send, reply function will be called when * one is received or a timeout occurs * * INPUTS: * scb == session control block * req == request to send * rpyfn == reply callback function * * RETURNS: * status *********************************************************************/ status_t mgr_rpc_send_request (ses_cb_t *scb, mgr_rpc_req_t *req, mgr_rpc_cbfn_t rpyfn) { xml_msg_hdr_t msg; xml_attr_t *attr; status_t res; boolean anyout; xmlns_id_t nc_id; #ifdef DEBUG if (!scb || !req || !rpyfn) { return SET_ERROR(ERR_INTERNAL_PTR); } #endif #ifdef MGR_HELLO_DEBUG log_debug2("\nmgr sending RPC request %s on session %d", req->msg_id, scb->sid); #endif anyout = FALSE; xml_msg_init_hdr(&msg); nc_id = xmlns_nc_id(); /* make sure the message-id attribute is not already present */ attr = xml_find_attr_q(&req->attrs, 0, NCX_EL_MESSAGE_ID); if (attr) { dlq_remove(attr); xml_free_attr(attr); } /* setup the prefix map with the NETCONF (and maybe NCX) namespace */ res = xml_msg_build_prefix_map(&msg, &req->attrs, FALSE, (req->data->nsid == xmlns_ncx_id())); /* add the message-id attribute */ if (res == NO_ERR) { res = xml_add_attr(&req->attrs, 0, NCX_EL_MESSAGE_ID, req->msg_id); } /* set perf timestamp in case response timing active */ gettimeofday(&req->perfstarttime, NULL); /* send the <?xml?> directive */ if (res == NO_ERR) { res = ses_start_msg(scb); } /* start the <rpc> element */ if (res == NO_ERR) { anyout = TRUE; xml_wr_begin_elem_ex(scb, &msg, 0, nc_id, NCX_EL_RPC, &req->attrs, ATTRQ, 0, START); } /* send the method and parameters */ if (res == NO_ERR) { xml_wr_full_val(scb, &msg, req->data, NCX_DEF_INDENT); } /* finish the <rpc> element */ if (res == NO_ERR) { xml_wr_end_elem(scb, &msg, nc_id, NCX_EL_RPC, 0); } /* finish the message */ if (anyout) { ses_finish_msg(scb); } if (res == NO_ERR) { req->replycb = rpyfn; add_request(scb, req); } xml_msg_clean_hdr(&msg); return res; } /* mgr_rpc_send_request */