Navigation


Changeset 603:4df4119a51b1 in freeDiameter for extensions/dict_legacy_xml


Ignore:
Timestamp:
Nov 25, 2010, 4:30:49 PM (13 years ago)
Author:
Sebastien Decugis <sdecugis@nict.go.jp>
Branch:
default
Phase:
public
Message:

Completed first version of dict_legacy_xml.fdx

File:
1 edited

Legend:

Unmodified
Added
Removed
  • extensions/dict_legacy_xml/dict_lxml_xml.c

    r600 r603  
    189189        uint32_t        code;
    190190        uint8_t *       name;
    191         uint32_t        flags;
    192         uint32_t        fmask;
     191        uint8_t         flags;
     192        uint8_t         fmask;
    193193        struct fd_list  reqrules_fixed;     /* list of t_rule */
    194194        struct fd_list  reqrules_required;  /* list of t_rule */
     
    411411        uint32_t        code;
    412412        uint8_t *       name;
    413         uint32_t        flags;
    414         uint32_t        fmask;
     413        uint8_t         flags;
     414        uint8_t         fmask;
    415415        uint32_t        vendor;
    416416        struct fd_list  type;             /* list of t_avptype -- there must be at max 1 item in the list */
     
    11961196}
    11971197
    1198 /* The SAX parser sends a warning, error, fatalerror
     1198/* The SAX parser sends a warning, error, fatalerror -- do we need these ?
    11991199static void SAXwarning (void * ctx, const char * msg, ...)
    12001200{
     
    12111211*/
    12121212
     1213
     1214
     1215
    12131216/*********************************************/
    12141217 /* 2nd pass: from memory to fD dictionary */
    1215 
    1216 static int dict_to_fD(struct t_dictionary * dict, int * nb_created)
     1218/*********************************************/
     1219
     1220/* Find or create a vendor */
     1221static int vend_to_fD(struct t_vend * v, struct dictionary * fD_dict, struct dict_object ** fd_v, int * nb_added)
    12171222{
    1218         TODO("Parse the dict tree, add objects in the fD dictionary, update count");
    1219         return ENOTSUP;
     1223        int ret;
     1224        struct dict_object * prev = NULL;
     1225        struct dict_vendor_data vd;
     1226
     1227        TRACE_ENTRY("%p %p %p %p", v, fD_dict, fd_v, nb_added);
     1228       
     1229        CHECK_PARAMS(v && fD_dict);
     1230       
     1231        /* Prepare the data in fD's format */
     1232        memset(&vd, 0, sizeof(vd));
     1233        vd.vendor_id   = v->id;
     1234        vd.vendor_name = (char *)v->name;
     1235       
     1236        /* Create or search in the dictionary */
     1237        ret = fd_dict_new ( fD_dict, DICT_VENDOR, &vd, NULL, &prev );
     1238        if (fd_v)
     1239                *fd_v = prev;
     1240        if (ret == EEXIST) {
     1241                /* Conflict with existing entry */
     1242                CHECK_FCT( fd_dict_getval(prev, &vd) );
     1243                TRACE_DEBUG(INFO, "[dict_legacy_xml] Warning: Conflicting entry.");
     1244                TRACE_DEBUG(INFO, "[dict_legacy_xml]   New entry (ignored): %u - '%s'", v->id, (char *)v->name);
     1245                TRACE_DEBUG(INFO, "[dict_legacy_xml]   Old entry          : %u - '%s'", vd.vendor_id, vd.vendor_name);
     1246                return 0;
     1247        } else {
     1248                /* other errors are stoppers */
     1249                CHECK_FCT(ret);
     1250        }
     1251       
     1252        /* Update count */
     1253        if (nb_added)
     1254                *nb_added += 1;
     1255       
     1256        /* Done */
     1257        return 0;
     1258}
     1259
     1260/* Find the base fD type from a type name */
     1261static int resolve_base_type(struct dictionary * fD_dict, uint8_t * type_name, enum dict_avp_basetype * basetype, struct dict_object **type)
     1262{
     1263        int ret;
     1264        struct dict_type_data td;
     1265        struct dict_object *t;
     1266       
     1267        TRACE_ENTRY("%p, %p %p", fD_dict, type_name, basetype);
     1268        CHECK_PARAMS( fD_dict && type_name && basetype );
     1269       
     1270        /* First, check if the type is already in the dictionary */
     1271        ret = fd_dict_search ( fD_dict, DICT_TYPE, TYPE_BY_NAME, type_name, &t, ENOENT);
     1272        switch (ret) {
     1273                case 0: /* the type is already in the dictionary */
     1274                        CHECK_FCT( fd_dict_getval(t, &td) );
     1275                        *basetype = td.type_base;
     1276                        if (type)
     1277                                *type = t;
     1278                        return 0;
     1279               
     1280                case ENOENT: /* We did not find it, it is maybe normal */
     1281                        break;
     1282                       
     1283                default:
     1284                        /* An unexpected error occurred */
     1285                        CHECK_FCT(ret);
     1286        }
     1287       
     1288        /* at this point we did not find the type in the dictionary */
     1289#define PREDEF_TYPES( _typename_, _basetype_ )                  \
     1290        if (!strcasecmp((char *)type_name, (_typename_))) {     \
     1291                *basetype = (_basetype_);                       \
     1292                return 0;                                       \
     1293        }
     1294       
     1295        PREDEF_TYPES( "OctetString", AVP_TYPE_OCTETSTRING );
     1296        PREDEF_TYPES( "Integer32",   AVP_TYPE_INTEGER32   );
     1297        PREDEF_TYPES( "Integer64",   AVP_TYPE_INTEGER64   );
     1298        PREDEF_TYPES( "Unsigned32",  AVP_TYPE_UNSIGNED32  );
     1299        PREDEF_TYPES( "Enumerated",  AVP_TYPE_UNSIGNED32  );
     1300        PREDEF_TYPES( "Unsigned64",  AVP_TYPE_UNSIGNED64  );
     1301        PREDEF_TYPES( "Float32",     AVP_TYPE_FLOAT32     );
     1302        PREDEF_TYPES( "Float64",     AVP_TYPE_FLOAT64     );
     1303       
     1304        /* When we reach this point, we have not yet found this type anywhere. */
     1305        TODO("Type not found. Maybe search in whole xmldictionary if it is defined later?");
     1306        TRACE_DEBUG(INFO, "The type '%s' could not be resolved. Please check it is defined before use.", type_name);
     1307        return ENOENT;
     1308}
     1309
     1310/* Find or create a type. */
     1311static int typdefn_to_fD(struct t_typedefn * t, struct dictionary * fD_dict, struct dict_object * fd_appl, struct dict_object ** fd_t, int * nb_added)
     1312{
     1313        int ret;
     1314        struct dict_object * prev = NULL;
     1315        struct dict_type_data td;
     1316
     1317        TRACE_ENTRY("%p %p %p %p %p", t, fD_dict, fd_appl, fd_t, nb_added);
     1318       
     1319        CHECK_PARAMS(t && fD_dict);
     1320       
     1321        /* Prepare the data in fD's format */
     1322        memset(&td, 0, sizeof(td));
     1323        td.type_name = (char *)t->name;
     1324       
     1325        /* infer td.type_base from t->parent_name */
     1326        CHECK_FCT( resolve_base_type(fD_dict, t->parent_name, &td.type_base, NULL) );
     1327       
     1328        /* Create or search in the dictionary */
     1329        ret = fd_dict_new ( fD_dict, DICT_TYPE, &td, fd_appl, &prev );
     1330        if (fd_t)
     1331                *fd_t = prev;
     1332        if (ret == EEXIST) {
     1333                /* Conflict with existing entry */
     1334                enum dict_avp_basetype xmlbt = td.type_base;
     1335                extern const char * type_base_name[]; /* in libfreeDiameter/dictionary.c */
     1336                CHECK_FCT( fd_dict_getval(prev, &td) );
     1337                TRACE_DEBUG(INFO, "[dict_legacy_xml] Warning: Conflicting entry.");
     1338                TRACE_DEBUG(INFO, "[dict_legacy_xml]   New entry (ignored): '%s' (%d - %s)", t->name, xmlbt, type_base_name[xmlbt] );
     1339                TRACE_DEBUG(INFO, "[dict_legacy_xml]   Old entry          : '%s' (%d - %s)", td.type_name, td.type_base, type_base_name[td.type_base]);
     1340                return 0;
     1341        } else {
     1342                /* other errors are stoppers */
     1343                CHECK_FCT(ret);
     1344        }
     1345       
     1346        /* Update count */
     1347        if (nb_added)
     1348                *nb_added += 1;
     1349       
     1350        /* Done */
     1351        return 0;
     1352}
     1353
     1354/* Process one list of rules */
     1355static int rules_to_fD_onelist(struct dictionary * fD_dict, struct dict_object * parent, enum rule_position position, struct fd_list * list, int * nb_added)
     1356{
     1357        struct dict_rule_data rd;
     1358        struct fd_list * li;
     1359        int order = 0;
     1360        int ret;
     1361
     1362        TRACE_ENTRY("%p %p %d %p %p", fD_dict, parent, position, list, nb_added);
     1363       
     1364        CHECK_PARAMS(fD_dict && parent && position && list);
     1365       
     1366        for (li = list->next; li != list; li = li->next) {
     1367                struct t_rule * r = (struct t_rule *)li;
     1368               
     1369                /* The [AVP] rule in all ABNF definitions is implicit in freeDiameter, skip it */
     1370                if (!strcmp((char *)r->avpname, "AVP"))
     1371                        continue;
     1372               
     1373                /* Prepare rule data */
     1374                memset(&rd, 0, sizeof(rd));
     1375                rd.rule_position = position;
     1376                rd.rule_order = ++order; /* actually only used for fixed rules, but no harm for others */
     1377                rd.rule_min = r->min;
     1378                rd.rule_max = r->max;
     1379               
     1380                /* Resolve the AVP */
     1381                ret = fd_dict_search(fD_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, r->avpname, &rd.rule_avp, ENOENT);
     1382                if (ret == ENOENT) {
     1383                        TRACE_DEBUG(INFO, "[dict_legacy_xml] Error: AVP '%s' used in a rule before being defined.", r->avpname);
     1384                }
     1385                CHECK_FCT(ret);
     1386               
     1387                /* Now create the new rule */
     1388                CHECK_FCT( fd_dict_new ( fD_dict, DICT_RULE, &rd, parent, NULL ) );
     1389                if (nb_added)
     1390                        *nb_added += 1;
     1391        }
     1392       
     1393        return 0;
     1394}
     1395
     1396/* Process lists of rules */
     1397static int rules_to_fD(struct dictionary * fD_dict, struct dict_object * parent, struct fd_list * fixed, struct fd_list * required, struct fd_list * optional, int * nb_added)
     1398{
     1399        TRACE_ENTRY("%p %p %p %p %p %p", fD_dict, parent, fixed, required, optional, nb_added);
     1400       
     1401        /* Process the rules */
     1402        CHECK_FCT( rules_to_fD_onelist(fD_dict, parent, RULE_FIXED_HEAD, fixed, nb_added) );
     1403        CHECK_FCT( rules_to_fD_onelist(fD_dict, parent, RULE_REQUIRED, required, nb_added) );
     1404        CHECK_FCT( rules_to_fD_onelist(fD_dict, parent, RULE_OPTIONAL, optional, nb_added) );
     1405       
     1406        return 0;
     1407}
     1408
     1409/* Find or create an AVP (and dependent objects) */
     1410static int avp_to_fD(struct t_avp * a, struct dictionary * fD_dict, struct dict_object * fd_appl, struct dict_object ** fd_a, int * nb_added)
     1411{
     1412        int ret;
     1413        struct dict_object * prev = NULL, *type = NULL;
     1414        struct dict_avp_data ad;
     1415        struct fd_list * li;
     1416
     1417        TRACE_ENTRY("%p %p %p %p %p", a, fD_dict, fd_appl, fd_a, nb_added);
     1418       
     1419        CHECK_PARAMS(a && fD_dict);
     1420       
     1421        /* Prepare the data in fD's format */
     1422        memset(&ad, 0, sizeof(ad));
     1423        ad.avp_code   = a->code;
     1424        ad.avp_vendor = a->vendor;
     1425        ad.avp_name   = (char *)a->name;
     1426        ad.avp_flag_mask = a->fmask;
     1427        ad.avp_flag_val  = a->flags;
     1428       
     1429        if (!FD_IS_LIST_EMPTY(&a->type)) {
     1430                /* special exception: we use per-AVP enumerated types in fD */
     1431                if (strcasecmp("Enumerated", (char *)((struct t_avptype *)a->type.next)->type_name))
     1432                        goto enumerated;
     1433               
     1434                /* The type was explicitly specified, resolve it */
     1435                CHECK_FCT( resolve_base_type(fD_dict, ((struct t_avptype *)a->type.next)->type_name, &ad.avp_basetype, &type) );
     1436        } else {
     1437                /* The type was not specified, try to infer it from provided data */
     1438                if (       !FD_IS_LIST_EMPTY(&a->grouped_optional)
     1439                        || !FD_IS_LIST_EMPTY(&a->grouped_required)
     1440                        || !FD_IS_LIST_EMPTY(&a->grouped_fixed) ) {
     1441                        /* The AVP has rules, it is a grouped AVP */
     1442                        CHECK_PARAMS( FD_IS_LIST_EMPTY(&a->enums) );
     1443                        ad.avp_basetype = AVP_TYPE_GROUPED;
     1444                } else {
     1445                        /* It should be an enumerated AVP... */
     1446                        if (FD_IS_LIST_EMPTY(&a->enums)) {
     1447                                TRACE_DEBUG(INFO, "[dict_legacy_xml] Error: Missing type information for AVP '%s'", ad.avp_name);
     1448                                return EINVAL;
     1449                        } else {
     1450                                /* We create a new type to hold the enumerated values -- fD specifics */
     1451                                char typename[256];
     1452                                struct dict_type_data   tdata;
     1453                               
     1454enumerated:
     1455                                snprintf(typename, sizeof(typename), "Enumerated*(%s)", ad.avp_name);
     1456                                memset(&tdata, 0, sizeof(tdata));
     1457                                tdata.type_base = AVP_TYPE_UNSIGNED32;
     1458                                tdata.type_name = &typename[0];
     1459                                CHECK_FCT( fd_dict_new ( fD_dict, DICT_TYPE, &tdata, fd_appl, &type ) );
     1460                                if (nb_added)
     1461                                        *nb_added += 1;
     1462                               
     1463                                ad.avp_basetype = AVP_TYPE_UNSIGNED32;
     1464                        }
     1465                }
     1466        }
     1467       
     1468        /* At this point, ad.avp_basetype is defined and type might also be */
     1469       
     1470        /* Create or search in the dictionary */
     1471        ret = fd_dict_new ( fD_dict, DICT_AVP, &ad, type, &prev );
     1472        if (fd_a)
     1473                *fd_a = prev;
     1474        if (ret == EEXIST) {
     1475                /* Conflict with existing entry */
     1476                CHECK_FCT( fd_dict_getval(prev, &ad) );
     1477                TRACE_DEBUG(INFO, "[dict_legacy_xml] Warning: Conflicting entry.");
     1478                TRACE_DEBUG(INFO, "[dict_legacy_xml]   New entry (ignored): %u - '%s'", a->code, (char *)a->name);
     1479                TRACE_DEBUG(INFO, "[dict_legacy_xml]   Old entry          : %u - '%s'", ad.avp_code, ad.avp_name);
     1480                goto inside;
     1481        } else {
     1482                /* other errors are stoppers */
     1483                CHECK_FCT(ret);
     1484        }
     1485       
     1486        /* Update count */
     1487        if (nb_added)
     1488                *nb_added += 1;
     1489       
     1490inside:
     1491        /* Now, the inner elements, if any */
     1492       
     1493        /* In case of enumeration, define the enum values */
     1494        ASSERT( FD_IS_LIST_EMPTY(&a->enums) || (type && (ad.avp_basetype == AVP_TYPE_UNSIGNED32)) ); /* u32 type must be defined for enumerators */
     1495        for (li = a->enums.next; li != &a->enums; li = li->next) {
     1496                struct t_enum * e = (struct t_enum *)li;
     1497                struct dict_enumval_data ed;
     1498               
     1499                memset(&ed, 0, sizeof(ed));
     1500                ed.enum_name = (char *)e->name;
     1501                ed.enum_value.u32 = e->code;
     1502               
     1503                CHECK_FCT( fd_dict_new ( fD_dict, DICT_ENUMVAL, &ed, type, NULL ) );
     1504                if (nb_added)
     1505                        *nb_added += 1;
     1506        }
     1507       
     1508        /* In case of grouped AVP, check the type is really grouped */
     1509        if ( !FD_IS_LIST_EMPTY(&a->grouped_optional)
     1510          || !FD_IS_LIST_EMPTY(&a->grouped_required)
     1511          || !FD_IS_LIST_EMPTY(&a->grouped_fixed) ) {
     1512                CHECK_PARAMS( ad.avp_basetype == AVP_TYPE_GROUPED );
     1513                CHECK_FCT( rules_to_fD(fD_dict, prev, &a->grouped_fixed, &a->grouped_required, &a->grouped_optional, nb_added) );
     1514        }
     1515       
     1516        /* done! */
     1517        return 0;
     1518}
     1519
     1520/* Find or create a command. */
     1521static int cmd_to_fD(struct t_cmd * c, struct dictionary * fD_dict, struct dict_object * fd_appl, struct dict_object ** fd_req, int * nb_added)
     1522{
     1523        int ret;
     1524        struct dict_object * req = NULL, *ans = NULL;
     1525        struct dict_cmd_data cd;
     1526        char cmdname[512];
     1527
     1528        TRACE_ENTRY("%p %p %p %p %p", c, fD_dict, fd_appl, fd_req, nb_added);
     1529       
     1530        CHECK_PARAMS(c && fD_dict);
     1531       
     1532        /* Prepare the request data in fD's format */
     1533        memset(&cd, 0, sizeof(cd));
     1534        cd.cmd_code = c->code;
     1535        snprintf(cmdname, sizeof(cmdname), "%s-Request", (char *)c->name);
     1536        cd.cmd_name = &cmdname[0];
     1537        cd.cmd_flag_mask = c->fmask | CMD_FLAG_REQUEST;
     1538        cd.cmd_flag_val  = c->flags | CMD_FLAG_REQUEST;
     1539       
     1540        /* Create or search in the dictionary */
     1541        ret = fd_dict_new ( fD_dict, DICT_COMMAND, &cd, fd_appl, &req );
     1542        if (fd_req)
     1543                *fd_req = req;
     1544        if (ret == EEXIST) {
     1545                struct dict_cmd_data prevcd;
     1546                /* Conflict with existing entry */
     1547                CHECK_FCT( fd_dict_getval(req, &prevcd) );
     1548                TRACE_DEBUG(INFO, "[dict_legacy_xml] Warning: Conflicting entry.");
     1549                TRACE_DEBUG(INFO, "[dict_legacy_xml]   New entry (ignored): %u - '%s'", cd.cmd_code, cd.cmd_name);
     1550                TRACE_DEBUG(INFO, "[dict_legacy_xml]   Old entry          : %u - '%s'", prevcd.cmd_code, prevcd.cmd_name);
     1551                goto answer;
     1552        } else {
     1553                /* other errors are stoppers */
     1554                CHECK_FCT(ret);
     1555        }
     1556       
     1557        /* Update count */
     1558        if (nb_added)
     1559                *nb_added += 1;
     1560       
     1561answer:
     1562        /* update data for the answer */
     1563        snprintf(cmdname, sizeof(cmdname), "%s-Answer", (char *)c->name);
     1564        cd.cmd_flag_val &= ~CMD_FLAG_REQUEST;
     1565       
     1566        ret = fd_dict_new ( fD_dict, DICT_COMMAND, &cd, fd_appl, &ans );
     1567        if (ret == EEXIST) {
     1568                struct dict_cmd_data prevcd;
     1569                /* Conflict with existing entry */
     1570                CHECK_FCT( fd_dict_getval(ans, &prevcd) );
     1571                TRACE_DEBUG(INFO, "[dict_legacy_xml] Warning: Conflicting entry.");
     1572                TRACE_DEBUG(INFO, "[dict_legacy_xml]   New entry (ignored): %u - '%s'", cd.cmd_code, cd.cmd_name);
     1573                TRACE_DEBUG(INFO, "[dict_legacy_xml]   Old entry          : %u - '%s'", prevcd.cmd_code, prevcd.cmd_name);
     1574                goto rules;
     1575        } else {
     1576                /* other errors are stoppers */
     1577                CHECK_FCT(ret);
     1578        }
     1579       
     1580        /* Update count */
     1581        if (nb_added)
     1582                *nb_added += 1;
     1583       
     1584rules:
     1585        /* Now process the rules inside the command */
     1586        CHECK_FCT( rules_to_fD(fD_dict, req, &c->reqrules_fixed, &c->reqrules_required, &c->reqrules_optional, nb_added) );
     1587        CHECK_FCT( rules_to_fD(fD_dict, ans, &c->ansrules_fixed, &c->ansrules_required, &c->ansrules_optional, nb_added) );
     1588       
     1589        /* Done */
     1590        return 0;
     1591}
     1592
     1593/* Find or create an application (and dependent objects) */
     1594static int appl_to_fD(struct t_appl * a, struct dictionary * fD_dict, struct dict_object ** fd_a, int * nb_added)
     1595{
     1596        int ret;
     1597        struct dict_object * prev = NULL;
     1598        struct dict_application_data ad;
     1599        struct fd_list * li;
     1600
     1601        TRACE_ENTRY("%p %p %p %p", a, fD_dict, fd_a, nb_added);
     1602       
     1603        CHECK_PARAMS(a && fD_dict);
     1604       
     1605        if (a->id) { /* skip app 0 */
     1606       
     1607                /* Prepare the data in fD's format */
     1608                memset(&ad, 0, sizeof(ad));
     1609                ad.application_id   = a->id;
     1610                ad.application_name = (char *)a->name;
     1611
     1612                /* Create or search in the dictionary */
     1613                ret = fd_dict_new ( fD_dict,
     1614                                        DICT_APPLICATION,
     1615                                        &ad,
     1616                                        NULL /* we don't have a parent vendor in XML files, so currently everything links to no vendor */,
     1617                                        &prev );
     1618                if (fd_a)
     1619                        *fd_a = prev;
     1620                if (ret == EEXIST) {
     1621                        /* Conflict with existing entry */
     1622                        CHECK_FCT( fd_dict_getval(prev, &ad) );
     1623                        TRACE_DEBUG(INFO, "[dict_legacy_xml] Warning: Conflicting entry.");
     1624                        TRACE_DEBUG(INFO, "[dict_legacy_xml]   New entry (ignored): %u - '%s'", a->id, (char *)a->name);
     1625                        TRACE_DEBUG(INFO, "[dict_legacy_xml]   Old entry          : %u - '%s'", ad.application_id, ad.application_name);
     1626                        goto inside;
     1627                } else {
     1628                        /* other errors are stoppers */
     1629                        CHECK_FCT(ret);
     1630                }
     1631
     1632                /* Update count */
     1633                if (nb_added)
     1634                        *nb_added += 1;
     1635        }
     1636       
     1637inside:
     1638        /* Now, the inner elements */
     1639       
     1640        /* First, define all the types */
     1641        for (li = a->types.next; li != &a->types; li = li->next) {
     1642                CHECK_FCT( typdefn_to_fD((struct t_typedefn *)li, fD_dict, prev, NULL, nb_added) );
     1643        }
     1644       
     1645        /* Then, AVPs, enums, and grouped AVP rules */
     1646        for (li = a->avps.next; li != &a->avps; li = li->next) {
     1647                CHECK_FCT( avp_to_fD((struct t_avp *)li, fD_dict, prev, NULL, nb_added) );
     1648        }
     1649       
     1650        /* Finally, the commands and rules */
     1651        for (li = a->commands.next; li != &a->commands; li = li->next) {
     1652                CHECK_FCT( cmd_to_fD((struct t_cmd *)li, fD_dict, prev, NULL, nb_added) );
     1653        }
     1654       
     1655        /* done! */
     1656        return 0;
     1657}
     1658
     1659
     1660static int dict_to_fD(struct dictionary * fD_dict, struct t_dictionary * xmldict, int * nb_added)
     1661{
     1662        struct fd_list * li;
     1663       
     1664        TRACE_ENTRY("%p %p %p", fD_dict, xmldict, nb_added);
     1665       
     1666        CHECK_PARAMS(fD_dict && xmldict && nb_added);
     1667       
     1668        *nb_added = 0;
     1669       
     1670        /* Create all the vendors */
     1671        for (li = xmldict->vendors.next; li != &xmldict->vendors; li = li->next) {
     1672                CHECK_FCT( vend_to_fD((struct t_vend *)li, fD_dict, NULL, nb_added) );
     1673        }
     1674       
     1675        /* Now, process each application */
     1676        CHECK_FCT( appl_to_fD(&xmldict->base_and_applications, fD_dict, NULL, nb_added) );
     1677        for (li = xmldict->base_and_applications.chain.next; li != &xmldict->base_and_applications.chain; li = li->next) {
     1678                CHECK_FCT( appl_to_fD((struct t_appl *) li, fD_dict, NULL, nb_added) );
     1679        }
     1680       
     1681        /* Complete! */
     1682        return 0;
    12201683}
    12211684
     
    12471710        fd_list_init( &data.dict.vendors, NULL );
    12481711        fd_list_init( &data.dict.base_and_applications.chain, NULL );
    1249         data.dict.base_and_applications.name = (uint8_t *)"Diameter Base Protocol";
     1712        data.dict.base_and_applications.name = (uint8_t *)"[Diameter Base Protocol]";
    12501713        fd_list_init( &data.dict.base_and_applications.commands, NULL );
    12511714        fd_list_init( &data.dict.base_and_applications.types, NULL );
     
    12611724        }
    12621725       
    1263         TRACE_DEBUG(FULL, "XML Parsed successfully");
     1726        TRACE_DEBUG(FULL, "XML file parsing complete.");
    12641727        if (TRACE_BOOL(ANNOYING)) {
    12651728                dump_dict(&data.dict);
     
    12671730       
    12681731        /* Now, convert all the objects from the temporary tree into the freeDiameter dictionary */
    1269         ret = 0;
    1270         CHECK_FCT_DO( dict_to_fD(&data.dict, &ret), { del_dict_contents(&data.dict); return -1; } );
     1732        CHECK_FCT_DO( dict_to_fD(fd_g_config->cnf_dict, &data.dict, &ret), { del_dict_contents(&data.dict); return -1; } );
     1733       
     1734        TRACE_DEBUG(FULL, "Conversion to freeDiameter internal format complete.");
     1735        if (TRACE_BOOL(ANNOYING)) {
     1736                fd_dict_dump(fd_g_config->cnf_dict);
     1737        }
    12711738       
    12721739        /* Done */
Note: See TracChangeset for help on using the changeset viewer.