Changeset 603:4df4119a51b1 in freeDiameter for extensions/dict_legacy_xml
- Timestamp:
- Nov 25, 2010, 4:30:49 PM (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
extensions/dict_legacy_xml/dict_lxml_xml.c
r600 r603 189 189 uint32_t code; 190 190 uint8_t * name; 191 uint 32_tflags;192 uint 32_tfmask;191 uint8_t flags; 192 uint8_t fmask; 193 193 struct fd_list reqrules_fixed; /* list of t_rule */ 194 194 struct fd_list reqrules_required; /* list of t_rule */ … … 411 411 uint32_t code; 412 412 uint8_t * name; 413 uint 32_tflags;414 uint 32_tfmask;413 uint8_t flags; 414 uint8_t fmask; 415 415 uint32_t vendor; 416 416 struct fd_list type; /* list of t_avptype -- there must be at max 1 item in the list */ … … 1196 1196 } 1197 1197 1198 /* The SAX parser sends a warning, error, fatalerror 1198 /* The SAX parser sends a warning, error, fatalerror -- do we need these ? 1199 1199 static void SAXwarning (void * ctx, const char * msg, ...) 1200 1200 { … … 1211 1211 */ 1212 1212 1213 1214 1215 1213 1216 /*********************************************/ 1214 1217 /* 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 */ 1221 static int vend_to_fD(struct t_vend * v, struct dictionary * fD_dict, struct dict_object ** fd_v, int * nb_added) 1217 1222 { 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 */ 1261 static 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. */ 1311 static 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 */ 1355 static 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 */ 1397 static 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) */ 1410 static 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 1454 enumerated: 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 1490 inside: 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. */ 1521 static 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 1561 answer: 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 1584 rules: 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) */ 1594 static 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 1637 inside: 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 1660 static 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; 1220 1683 } 1221 1684 … … 1247 1710 fd_list_init( &data.dict.vendors, NULL ); 1248 1711 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]"; 1250 1713 fd_list_init( &data.dict.base_and_applications.commands, NULL ); 1251 1714 fd_list_init( &data.dict.base_and_applications.types, NULL ); … … 1261 1724 } 1262 1725 1263 TRACE_DEBUG(FULL, "XML Parsed successfully");1726 TRACE_DEBUG(FULL, "XML file parsing complete."); 1264 1727 if (TRACE_BOOL(ANNOYING)) { 1265 1728 dump_dict(&data.dict); … … 1267 1730 1268 1731 /* 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 } 1271 1738 1272 1739 /* Done */
Note: See TracChangeset
for help on using the changeset viewer.