ib_status_t ib_cfgmap_get(ib_cfgmap_t *cm, const char *name, void *pval, ib_ftype_t *ptype) { IB_FTRACE_INIT(ib_cfgmap_get); ib_field_t *f; ib_status_t rc; rc = ib_hash_get(cm->hash, name, &f); if (rc != IB_OK) { if (ptype != NULL) { *ptype = IB_FTYPE_GENERIC; } IB_FTRACE_RET_STATUS(rc); } switch (f->type) { case IB_FTYPE_BYTESTR: *(ib_bytestr_t **)pval = ib_field_value_bytestr(f); ib_util_log_debug(4, "GET FIELD type=%d %" IB_BYTESTR_FMT "=\"%" IB_BYTESTR_FMT "\" (%p)", f->type, IB_BYTESTRSL_FMT_PARAM(f->name,f->nlen), IB_BYTESTR_FMT_PARAM(*(ib_bytestr_t **)pval), *(void **)pval); break; case IB_FTYPE_LIST: *(ib_list_t **)pval = ib_field_value_list(f); break; case IB_FTYPE_NULSTR: *(char **)pval = ib_field_value_nulstr(f); ib_util_log_debug(4, "GET FIELD type=%d %" IB_BYTESTR_FMT "=\"%s\" (%p)", f->type, IB_BYTESTRSL_FMT_PARAM(f->name,f->nlen), *(char **)pval, *(void **)pval); break; case IB_FTYPE_NUM: *(ib_num_t *)pval = *(ib_field_value_num(f)); ib_util_log_debug(4, "GET FIELD type=%d %" IB_BYTESTR_FMT "=%d (%p)", f->type, IB_BYTESTRSL_FMT_PARAM(f->name,f->nlen), *(int *)pval, *(void **)pval); break; case IB_FTYPE_UNUM: *(ib_unum_t *)pval = *(ib_field_value_unum(f)); ib_util_log_debug(4, "GET FIELD type=%d %" IB_BYTESTR_FMT "=%d (%p)", f->type, IB_BYTESTRSL_FMT_PARAM(f->name,f->nlen), *(unsigned int *)pval, *(void **)pval); break; case IB_FTYPE_GENERIC: default: *(void **)pval = ib_field_value(f); break; } if (ptype != NULL) { *ptype = f->type; } IB_FTRACE_RET_STATUS(IB_OK); }
ib_status_t ib_tfn_transform_field(ib_tfn_t *tfn, ib_field_t *f, ib_flags_t *pflags) { IB_FTRACE_INIT(ib_tfn_transform); ib_bytestr_t *bs; char *str; uint8_t *data_out; size_t dlen_out; ib_status_t rc; switch(f->type) { case IB_FTYPE_BYTESTR: bs = ib_field_value_bytestr(f); rc = tfn->transform(tfn->fndata, f->mp, ib_bytestr_ptr(bs), ib_bytestr_length(bs), &data_out, &dlen_out, pflags); /* If it is modified and not done inplace, then the * field value needs to be updated. */ if ( IB_TFN_CHECK_FMODIFIED(*pflags) && !IB_TFN_CHECK_FINPLACE(*pflags)) { ib_bytestr_t *bs_new; rc = ib_bytestr_alias_mem(&bs_new, f->mp, data_out, dlen_out); if (rc != IB_OK) { IB_FTRACE_RET_STATUS(rc); } rc = ib_field_setv(f, bs_new); } IB_FTRACE_RET_STATUS(rc); case IB_FTYPE_NULSTR: str = ib_field_value_nulstr(f), rc = tfn->transform(tfn->fndata, f->mp, (uint8_t *)str, strlen(str), &data_out, &dlen_out, pflags); /* If it is modified and not done inplace, then the * field value needs to be updated. * * NOTE: Anytime a transformation modifies data it * MUST NUL terminate the data and it is a bug * if this is not done. */ if ( IB_TFN_CHECK_FMODIFIED(*pflags) && !IB_TFN_CHECK_FINPLACE(*pflags)) { rc = ib_field_setv(f, data_out); } IB_FTRACE_RET_STATUS(rc); } IB_FTRACE_RET_STATUS(IB_EINVAL); }