Ejemplo n.º 1
0
/* 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;
}
Ejemplo n.º 2
0
/* 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;
}
Ejemplo n.º 3
0
/* 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;
}
Ejemplo n.º 4
0
	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);

	}
Ejemplo n.º 5
0
/* 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;
}