unsigned int event_subscribe(unsigned int event_id, ptrEventCallback callback) { Subscriber *subscriber; Subscriber *cur_sub; LOG_DEBUG("Adding new subscriber to event ID %d...", event_id); subscriber = malloc(sizeof(Subscriber)); if (subscriber == NULL) { LOG_SEVERE("Could not assign new subscriber for event %d. In " \ "sufficient memory.", event_id); return; } memset(subscriber, '\0', sizeof(Subscriber)); subscriber->id = ++last_subscriber_id; subscriber->event_id = event_id; subscriber->callback = malloc(sizeof(ptrEventCallback)); if (subscriber->callback == NULL) { LOG_SEVERE("Could not assign new subscriber for event %d. In " \ "sufficient memory.", event_id); free(subscriber); return; } memcpy(subscriber->callback, callback, sizeof(ptrEventCallback)); // add the subscriber to the list queue_push(event_subscribers, subscriber); LOG_DEBUG("Subscriber added %d", subscriber->id); return subscriber->id; }
/** * context: {node, link} * tokens: {node-address, destination-prefix, area} */ int cli_net_node_link_ospf_area(SCliContext * pContext, STokens * pTokens) { net_node_t * pNode; ospf_area_t tArea; int iReturn = CLI_SUCCESS; net_iface_t * pLink; pLink = (net_iface_t *) cli_context_get_item_at_top(pContext); pNode = (net_node_t *) cli_context_get_item_at(pContext, 0); if (tokens_get_uint_at(pTokens, 2, &tArea)) { LOG_SEVERE("Error: invalid value for ospf-area (%s)\n", tokens_get_string_at(pTokens, 2)); return CLI_ERROR_COMMAND_FAILED; } //link_get_prefix(pLink, &sDestPrefix); switch(link_set_ospf_area(pLink, tArea)){ case OSPF_LINK_OK : break; case OSPF_LINK_TO_MYSELF_NOT_IN_AREA : LOG_SEVERE("Warning: ospf area link is changed\n"); break; case OSPF_SOURCE_NODE_NOT_IN_AREA : LOG_SEVERE("Error: source node must belong to area\n"); iReturn = CLI_ERROR_COMMAND_FAILED; break; case OSPF_DEST_NODE_NOT_IN_AREA : LOG_SEVERE("Error: destination node must belongs to area\n"); iReturn = CLI_ERROR_COMMAND_FAILED; break; case OSPF_DEST_SUBNET_NOT_IN_AREA : LOG_SEVERE("Error: destination subnet must belongs to area\n"); iReturn = CLI_ERROR_COMMAND_FAILED; break; case OSPF_SOURCE_NODE_LINK_MISSING : //never verified because link is found in context LOG_SEVERE("Error: link is not present\n"); iReturn = CLI_ERROR_COMMAND_FAILED; break; default : LOG_SEVERE("Error: unknown reasons\n"); iReturn = CLI_ERROR_COMMAND_FAILED; } return iReturn; }
/** * context: {subnet} * tokens: {area} */ int cli_net_subnet_ospf_area(SCliContext * pContext, STokens * pTokens) { net_subnet_t * pSubnet; ospf_area_t uArea; // Get node from context pSubnet= (net_subnet_t *) cli_context_get_item_at_top(pContext); // set subnet ospf area tokens_get_uint_at(pTokens, 1, &uArea); if (subnet_set_OSPFArea(pSubnet, uArea) != 0) { LOG_SEVERE("Warning: correctness of ospf are info of links on subnet is not guaranteed!\n"); return CLI_SUCCESS; } return CLI_SUCCESS; }