Exemplo n.º 1
0
obj string_to_rational_obj( char *str, unsigned radix )
{
    char *f;
    mpq_t b, w;

    f = strchr( str, '+' );       /* support WHOLE+NUM/DEN syntax */
    if (f) {
        MP_INT *num;
        mpz_t numa;
        if (!str2rat( &b, f+1, radix )) {
            return FALSE_OBJ;
        }
        *f = '\0';
        num = mpq_numref(w);
        if (!str2big( num, str, radix )) {
            *f = '+';
            return FALSE_OBJ;
        }
        *f = '+';
        mpz_init_set_si( mpq_denref(w), 1 );
        mpq_add( b, b, w );
    } else {
        if (!str2rat( &b, str, radix )) {
            return FALSE_OBJ;
        }
    }
    return rational_compact( b );
}
Exemplo n.º 2
0
obj string_to_bignum_obj(char *str, unsigned radix)
{
    mpz_t v;

    if (!str2big( &v[0], str, radix )) {
        return FALSE_OBJ;
    }
    return mpz_to_bignum( v );
}
Exemplo n.º 3
0
int instance_bigint_handler(netsnmp_mib_handler * handler,
                            netsnmp_handler_registration * reginfo,
                            netsnmp_agent_request_info * reqinfo,
                            netsnmp_request_info * requests)
{
  int err;
  int64_t *it = (int64_t *) handler->myvoid;
  int64_t tmp_it;
  char str[256];

  switch (reqinfo->mode)
    {
      /*
       * data requests
       */
    case MODE_GET:
      err = big2str(str, *it);
      if(!err)
        snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                                 (u_char *) str, strlen(str));
      else
        netsnmp_request_set_error(requests, SNMP_ERR_BADVALUE);
      break;

    case MODE_SET_ACTION:
      /*
       * update current
       */
      if(check_procedure_access(reginfo))
        {
          netsnmp_request_set_error(requests, SNMP_ERR_READONLY);
          return SNMP_ERR_READONLY;
        }
      err = str2big(&tmp_it, (char *)(requests->requestvb->val.string));
      if(!err)
        *it = tmp_it;
      else
        netsnmp_request_set_error(requests, SNMP_ERR_BADVALUE);

      break;

    }
  return SNMP_ERR_NOERROR;
}
Exemplo n.º 4
0
int instance_get_set_handler(netsnmp_mib_handler * handler,
                             netsnmp_handler_registration * reginfo,
                             netsnmp_agent_request_info * reqinfo,
                             netsnmp_request_info * requests)
{

  snmp_adm_type_union var;
  unsigned char type;
  register_info *info = NULL;
  int branch, num_stat_conf, err = 0, err_fct;
  char str[256];
  unsigned int tmp_it;

        /** XXX
	 *  Yet another tree structure specific computation
	 */
  /* what node do you want? */
  num_stat_conf = reginfo->rootoid[reginfo->rootoid_len - 3];
  branch = reginfo->rootoid[reginfo->rootoid_len - 4];

  /* look for our get_set */
  for(info = register_info_list; info; info = info->next)
    if(info->type == GET_SET &&
       info->function_info.get_set->num == num_stat_conf &&
       info->function_info.get_set->branch == branch)
      break;

  if(!info)
    {                           /* not found */
      netsnmp_request_set_error(requests, SNMP_ERR_GENERR);
      return SNMP_ERR_GENERR;
    }

  type = info->function_info.get_set->type;

  switch (reqinfo->mode)
    {
    case MODE_GET:
      /*
       * data requests
       */
      /* call the function */
      err =
          info->function_info.get_set->getter(&var, info->function_info.get_set->opt_arg);
      if(err)
        {
          snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                                   (u_char *) "SNMP_ADM_ERROR", strlen("SNMP_ADM_ERROR"));

          return SNMP_ERR_NOERROR;
        }
      switch (type)
        {
        case SNMP_ADM_INTEGER:
          snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
                                   (u_char *) & (var.integer), sizeof(var.integer));
          break;
        case SNMP_ADM_STRING:
          snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                                   (u_char *) var.string, strlen((char *)var.string));
          break;
        case SNMP_ADM_REAL:
          err = real2str(str, var.real);
          if(!err)
            snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                                     (u_char *) str, strlen(str));
          else
            netsnmp_request_set_error(requests, SNMP_ERR_BADVALUE);
          break;
        case SNMP_ADM_BIGINT:
          err = big2str(str, var.bigint);
          if(!err)
            snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                                     (u_char *) str, strlen(str));
          else
            netsnmp_request_set_error(requests, SNMP_ERR_BADVALUE);
          break;
        case SNMP_ADM_TIMETICKS:
          tmp_it = (var.time) * 100;

          snmp_set_var_typed_value(requests->requestvb, ASN_TIMETICKS,
                                   (u_char *) & (tmp_it), sizeof(tmp_it));
          break;

        default:
          netsnmp_request_set_error(requests, SNMP_ERR_BADVALUE);
        }

      break;
    case MODE_SET_ACTION:
      switch (type)
        {
        case SNMP_ADM_INTEGER:
          var.integer = *(int *)requests->requestvb->val.integer;
          break;
        case SNMP_ADM_STRING:
          strncpy(var.string, (char *)(requests->requestvb->val.string),
                  sizeof(var.string));
          break;
        case SNMP_ADM_REAL:
          err = str2real(&(var.real), (char *)(requests->requestvb->val.string));
          break;
        case SNMP_ADM_BIGINT:
          err = str2big(&(var.bigint), (char *)(requests->requestvb->val.string));
          break;
        case SNMP_ADM_TIMETICKS:
          tmp_it = *(unsigned int *)requests->requestvb->val.integer;
          var.time = tmp_it / 100;
          break;
        default:
          netsnmp_request_set_error(requests, SNMP_ERR_BADVALUE);
        }

      if(!err)
        {
          /* call the function */
          err_fct =
              info->function_info.get_set->setter(&var,
                                                  info->function_info.get_set->opt_arg);

          if(err_fct)
            netsnmp_request_set_error(requests, SNMP_ERR_BADVALUE);
        }
      else
        netsnmp_request_set_error(requests, SNMP_ERR_BADVALUE);
      break;
    }

  return SNMP_ERR_NOERROR;
}