void find_in_array(bson_iterator *it, char *key_ref, char *value_ref, char *key_needed, char *value_needed) { char value_ref_found[MONGO_STRING_LENGTH]; char value_needed_found[MONGO_STRING_LENGTH]; bson_iterator i; while(bson_iterator_next(it)) { switch(bson_iterator_type(it)){ case bson_string: if (strcmp(bson_iterator_key(it), key_ref) == 0) strcpy(value_ref_found, bson_iterator_string(it)); if (strcmp(bson_iterator_key(it), key_needed) == 0) strcpy(value_needed_found, bson_iterator_string(it)); break; case bson_object: case bson_array: bson_iterator_init(&i, bson_iterator_value(it)); find_in_array(&i, key_ref, value_ref, key_needed, value_needed); break; default: break; } } if (strcmp(value_ref_found, value_ref) == 0) strcpy(value_needed, value_needed_found); }
static int reverse_map(uint8_t u, const uint8_t *arr, int n) { GVariant *v = g_variant_new_byte(u); int i = find_in_array(v, G_VARIANT_TYPE_BYTE, arr, n); g_variant_unref(v); return i; }
int find_radius_options(rlm_mongo_t *data, char *username, char *mac, char *password) { bson_buffer bb; bson query; bson field; bson result; bson_buffer_init(&bb); bson_append_string(&bb, data->search_field, username); if (strcmp(data->mac_field, "") != 0) { bson_append_string(&bb, data->mac_field, mac); } if (strcmp(data->enable_field, "") != 0) { bson_append_bool(&bb, data->enable_field, 1); } bson_from_buffer(&query, &bb); bson_buffer_destroy(&bb); bson_empty(&field); bson_empty(&result); MONGO_TRY{ if (mongo_find_one(conn, data->base, &query, &field, &result) == 0) { return 0; } }MONGO_CATCH{ mongo_start(data); return 0; } bson_iterator it; bson_iterator_init(&it, result.data); find_in_array(&it, data->username_field, username, data->password_field, password); bson_destroy(&result); return 1; }
static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { struct dev_context *devc = sdi->priv; int ret, i, ch = -1; uint64_t u, v; if (cg) /* sr_config_set will validate cg using config_list */ ch = ((struct sr_channel *)cg->channels->data)->index; if (sdi->status != SR_ST_ACTIVE) return SR_ERR_DEV_CLOSED; ret = SR_OK; switch (key) { case SR_CONF_LIMIT_FRAMES: devc->frame_limit = g_variant_get_uint64(data); break; case SR_CONF_SAMPLERATE: i = find_in_array(data, G_VARIANT_TYPE_UINT64, samplerates, ARRAY_SIZE(samplerates)); if (i == -1) ret = SR_ERR_ARG; else devc->rate = i; break; case SR_CONF_TRIGGER_SOURCE: i = find_in_array(data, G_VARIANT_TYPE_STRING, trigger_sources, ARRAY_SIZE(trigger_sources)); if (i == -1) ret = SR_ERR_ARG; else devc->cctl[0] = (devc->cctl[0] & 0x3F) | trigger_sources_map[i]; break; case SR_CONF_TRIGGER_SLOPE: i = find_in_array(data, G_VARIANT_TYPE_STRING, trigger_slopes, ARRAY_SIZE(trigger_slopes)); if (i == -1) ret = SR_ERR_ARG; else devc->edge = i; break; case SR_CONF_BUFFERSIZE: i = find_in_array(data, G_VARIANT_TYPE_UINT64, buffersizes, ARRAY_SIZE(buffersizes)); if (i == -1) ret = SR_ERR_ARG; else devc->last_step = i; break; case SR_CONF_VDIV: if (ch == -1) { ret = SR_ERR_CHANNEL_GROUP; } else if (!g_variant_is_of_type(data, G_VARIANT_TYPE("(tt)"))) { ret = SR_ERR_ARG; } else { g_variant_get(data, "(tt)", &u, &v); for (i = 0; i < (int)ARRAY_SIZE(vdivs); i++) if (vdivs[i][0] == u && vdivs[i][1] == v) break; if (i == ARRAY_SIZE(vdivs)) ret = SR_ERR_ARG; else devc->cctl[ch] = (devc->cctl[ch] & 0xCC) | vdivs_map[i]; } break; case SR_CONF_COUPLING: if (ch == -1) { ret = SR_ERR_CHANNEL_GROUP; } else { i = find_in_array(data, G_VARIANT_TYPE_STRING, coupling, ARRAY_SIZE(coupling)); if (i == -1) ret = SR_ERR_ARG; else devc->cctl[ch] = (devc->cctl[ch] & 0xF3) | coupling_map[i]; } break; case SR_CONF_PROBE_FACTOR: if (ch == -1) { ret = SR_ERR_CHANNEL_GROUP; } else { u = g_variant_get_uint64(data); if (!u) ret = SR_ERR_ARG; else devc->probe[ch] = u; } break; default: ret = SR_ERR_NA; } return ret; }
pslr_white_balance_mode_t get_pslr_white_balance_mode( char *str ) { return find_in_array( pslr_white_balance_mode_str, sizeof(pslr_white_balance_mode_str)/sizeof(pslr_white_balance_mode_str[0]),str); }
pslr_jpeg_image_tone_t get_pslr_jpeg_image_tone( char *str ) { return find_in_array( pslr_jpeg_image_tone_str, sizeof(pslr_jpeg_image_tone_str)/sizeof(pslr_jpeg_image_tone_str[0]),str); }
pslr_af_point_sel_t get_pslr_af_point_sel( char *str ) { return find_in_array( pslr_af_point_sel_str, sizeof(pslr_af_point_sel_str)/sizeof(pslr_af_point_sel_str[0]),str); }
pslr_drive_mode_t get_pslr_drive_mode( char *str ) { return find_in_array( pslr_drive_mode_str, sizeof(pslr_drive_mode_str)/sizeof(pslr_drive_mode_str[0]),str); }
pslr_ae_metering_t get_pslr_ae_metering( char *str ) { return find_in_array( pslr_ae_metering_str, sizeof(pslr_ae_metering_str)/sizeof(pslr_ae_metering_str[0]),str); }
pslr_color_space_t get_pslr_color_space( char *str ) { return find_in_array( pslr_color_space_str, sizeof(pslr_color_space_str)/sizeof(pslr_color_space_str[0]),str); }