Navigation


Changeset 903:4382d7420e65 in freeDiameter for libfdproto/dictionary.c


Ignore:
Timestamp:
Dec 15, 2012, 5:24:34 AM (11 years ago)
Author:
Sebastien Decugis <sdecugis@freediameter.net>
Branch:
default
Phase:
public
Message:

Add new AVP_BY_STRUCT method for searching vendor-specific AVPs. This allows more flexibility and superseeds AVP_BY_NAME_AND_VENDOR and AVP_BY_CODE_AND_VENDOR.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libfdproto/dictionary.c

    r834 r903  
    977977                        break;
    978978               
     979                case AVP_BY_STRUCT:
     980                        {
     981                                struct dict_avp_request_ex * _what = (struct dict_avp_request_ex *) what;
     982                                struct dict_object * vendor = NULL;
     983                               
     984                                CHECK_PARAMS( _what->avp_vendor.vendor || _what->avp_vendor.vendor_id || _what->avp_vendor.vendor_name );
     985                                CHECK_PARAMS( _what->avp_data.avp_code || _what->avp_data.avp_name );
     986                               
     987                                /* Now look for the vendor first */
     988                                if (_what->avp_vendor.vendor) {
     989                                        CHECK_PARAMS( ! _what->avp_vendor.vendor_id && ! _what->avp_vendor.vendor_name );
     990                                        vendor = _what->avp_vendor.vendor;
     991                                } else if (_what->avp_vendor.vendor_id) {
     992                                        CHECK_PARAMS( ! _what->avp_vendor.vendor_name );
     993                                        CHECK_FCT( search_vendor( dict, VENDOR_BY_ID, &_what->avp_vendor.vendor_id, &vendor ) );
     994                                } else {
     995                                        CHECK_FCT( search_vendor( dict, VENDOR_BY_NAME, &_what->avp_vendor.vendor_name, &vendor ) );
     996                                }
     997                               
     998                                if (vendor == NULL) {
     999                                        if (result)
     1000                                                *result = NULL;
     1001                                        else
     1002                                                ret = ENOENT;
     1003                                        goto end;
     1004                                }
     1005                               
     1006                                /* We now have our vendor = head of the appropriate avp list */
     1007                                if (_what->avp_data.avp_code) {
     1008                                        CHECK_PARAMS( ! _what->avp_data.avp_name );
     1009                                        SEARCH_scalar( _what->avp_data.avp_code, &vendor->list[1], avp.avp_code, 1, (struct dict_object *)NULL );
     1010                                } else {
     1011                                        SEARCH_os0( _what->avp_data.avp_name, &vendor->list[2], avp.avp_name, 1);
     1012                                }
     1013                        }
     1014                        break;
     1015               
    9791016                case AVP_BY_NAME_ALL_VENDORS:
    9801017                        {
Note: See TracChangeset for help on using the changeset viewer.