/* Decode agentx datagram */ static AGENTX_ERR_CODE_E agentx_decode(struct agentx_datagram *xdg) { AGENTX_ERR_CODE_E err; uint8_t *buf, dec_fail = 0; buf = xdg->recv_buf; /* PDU header */ err = pdu_hdr_parse(xdg, &buf); if (err) { SMARTSNMP_LOG(L_ERROR, "ERR(%d): %s\n", err, error_message(agentx_err_msg, elem_num(agentx_err_msg), err)); dec_fail = 1; goto DECODE_FINISH; } /* varbind or search range */ switch (xdg->pdu_hdr.type) { case AGENTX_PDU_GET: case AGENTX_PDU_GETNEXT: case AGENTX_PDU_GETBULK: /* search range */ err = search_range_parse(xdg, &buf); if (err) { SMARTSNMP_LOG(L_ERROR, "ERR(%d): %s\n", err, error_message(agentx_err_msg, elem_num(agentx_err_msg), err)); dec_fail = 1; } break; case AGENTX_PDU_TESTSET: case AGENTX_PDU_RESPONSE: /* var bind */ err = var_bind_parse(xdg, &buf); if (err) { SMARTSNMP_LOG(L_ERROR, "ERR(%d): %s\n", err, error_message(agentx_err_msg, elem_num(agentx_err_msg), err)); dec_fail = 1; } break; default: break; } DECODE_FINISH: /* If fail, do some clear things */ if (dec_fail) { agentx_datagram_clear(xdg); } /* We should free received buf here */ free(xdg->recv_buf); return err; }
/* Parse search range */ static AGENTX_ERR_CODE_E search_range_parse(struct agentx_datagram *xdg, uint8_t **buffer) { AGENTX_ERR_CODE_E err; uint8_t *buf; err = AGENTX_ERR_OK; buf = *buffer; while (xdg->pdu_hdr.payload_length > 0) { /* Alloc a new search range and add into search range list. */ struct x_search_range *sr = search_range_alloc(&buf, xdg->pdu_hdr.flags, &err); if (sr == NULL) { SMARTSNMP_LOG(L_ERROR, "ERR(%d): %s\n", err, error_message(agentx_err_msg, elem_num(agentx_err_msg), err)); *buffer = buf; break; } list_add_tail(&sr->link, &xdg->sr_in_list); xdg->sr_in_cnt++; xdg->pdu_hdr.payload_length -= buf - *buffer; *buffer = buf; } return err; }
/* Parse varbind */ static AGENTX_ERR_CODE_E var_bind_parse(struct agentx_datagram *xdg, uint8_t **buffer) { AGENTX_ERR_CODE_E err; uint8_t *buf; err = AGENTX_ERR_OK; buf = *buffer; while (xdg->pdu_hdr.payload_length > 0) { /* Alloc a new var_bind and add into var_bind list. */ struct x_var_bind *vb = var_bind_alloc(&buf, xdg->pdu_hdr.flags, &err); if (vb == NULL) { SMARTSNMP_LOG(L_ERROR, "ERR(%d): %s\n", err, error_message(agentx_err_msg, elem_num(agentx_err_msg), err)); *buffer = buf; break; } list_add_tail(&vb->link, &xdg->vb_in_list); xdg->vb_in_cnt++; xdg->pdu_hdr.payload_length -= buf - *buffer; *buffer = buf; } return err; }
OUTLINE::OUTLINE(PointS startpt, const vector<DIR>& new_steps) :start(startpt), stepcount(static_cast<int16_t>(new_steps.size())), steps(elem_num(stepcount)){ PointS pos = start; box = RectS(pos, pos); auto lastdir = new_steps.back(); auto prevdir = lastdir; int stepindex = 0; for (int srcindex = 0; srcindex < new_steps.size(); ++srcindex, ++stepindex){ auto dir = new_steps[srcindex]; set_step(stepindex, dir); pos += dir; box += pos; if (dir.isReverse(prevdir) && stepindex > 0){ stepindex -= 2; prevdir = stepindex == -1 ? lastdir : step_dir(stepindex); } else{ prevdir = dir; } } assert(pos.x == start.x&&pos.y == start.y);//ÂÖÀª±ØÐë·â±Õ int begin = 0; while (stepindex - 1 > begin && step_dir(begin).isReverse(step_dir(stepindex - 1))){ start += step_dir(begin); //ÆðµãÏòÇ°ÒÆ ++begin; --stepindex; //cancel there-and-back } for (int i = begin; i < stepindex; ++i){ set_step(i - begin, step_dir(i)); } stepcount = stepindex - begin; assert(stepcount >= 4); }
/* Init dummy root node */ static void mib_dummy_node_init(void) { const oid_t dummy_oid[] = { 1, 3, 6, 1 }; root_oid = xmalloc(elem_num(dummy_oid) * sizeof(oid_t)); oid_cpy(root_oid, dummy_oid, elem_num(dummy_oid)); root_oid_len = elem_num(dummy_oid); mib_dummy_node.type = MIB_OBJ_GROUP; mib_dummy_node.sub_id_cap = 1; mib_dummy_node.sub_id_cnt = 0; mib_dummy_node.sub_id = xmalloc(sizeof(oid_t)); mib_dummy_node.sub_id[0] = 0; mib_dummy_node.sub_ptr = xmalloc(sizeof(void *)); mib_dummy_node.sub_ptr[0] = NULL; }