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 ); }
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 ); }
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; }
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; }