Changeset 658:f198d16fa7f4 in freeDiameter for extensions/dict_legacy_xml/dict_lxml_xml.c
- Timestamp:
- Jan 14, 2011, 3:15:23 PM (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
extensions/dict_legacy_xml/dict_lxml_xml.c
r616 r658 933 933 { TRACE_DEBUG(INFO, "Invalid 'type' tag found without 'name' attribute."); goto xml_tree_error; } ); 934 934 935 /* Check there is only 1 type */ 936 if (!FD_IS_LIST_EMPTY(&data->cur_avp->type)) { 937 TRACE_DEBUG(INFO, "Multiple 'type' tags found for AVP."); 938 goto xml_tree_error; 939 } 940 941 /* Add the new type */ 935 942 CHECK_FCT_DO( new_avptype(&data->cur_avp->type, xname), 936 943 { TRACE_DEBUG(INFO, "An error occurred while parsing a type tag. Entry ignored."); goto xml_tree_error; } ) … … 1011 1018 } 1012 1019 data->error_depth += 1; 1020 if (data->cur_app || data->cur_cmd || data->cur_avp) { 1021 TRACE_DEBUG(INFO, "Error encountered while parsing tag of:"); 1022 if (data->cur_app) 1023 fd_log_debug(" Application: '%s'\n", data->cur_app->name); 1024 if (data->cur_cmd) 1025 fd_log_debug(" Command : '%s'\n", data->cur_cmd->name); 1026 if (data->cur_avp) 1027 fd_log_debug(" AVP : '%s'\n", data->cur_avp->name); 1028 } 1013 1029 return; 1014 1030 } … … 1387 1403 1388 1404 /* Now create the new rule */ 1389 CHECK_FCT( fd_dict_new ( fD_dict, DICT_RULE, &rd, parent, NULL ) ); 1405 CHECK_FCT_DO( ret = fd_dict_new ( fD_dict, DICT_RULE, &rd, parent, NULL ), 1406 { TRACE_DEBUG(INFO, "Error creating rule for sub-AVP '%s'", r->avpname); return ret; } ); 1390 1407 if (nb_added) 1391 1408 *nb_added += 1; … … 1398 1415 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) 1399 1416 { 1417 int ret; 1418 1400 1419 TRACE_ENTRY("%p %p %p %p %p %p", fD_dict, parent, fixed, required, optional, nb_added); 1401 1420 1402 1421 /* Process the rules */ 1403 CHECK_FCT( rules_to_fD_onelist(fD_dict, parent, RULE_FIXED_HEAD, fixed, nb_added) ); 1404 CHECK_FCT( rules_to_fD_onelist(fD_dict, parent, RULE_REQUIRED, required, nb_added) ); 1405 CHECK_FCT( rules_to_fD_onelist(fD_dict, parent, RULE_OPTIONAL, optional, nb_added) ); 1422 CHECK_FCT_DO( ret = rules_to_fD_onelist(fD_dict, parent, RULE_FIXED_HEAD, fixed, nb_added), 1423 { TRACE_DEBUG(INFO, "Error processing FIXED rules"); return ret; } ); 1424 CHECK_FCT_DO( ret = rules_to_fD_onelist(fD_dict, parent, RULE_REQUIRED, required, nb_added), 1425 { TRACE_DEBUG(INFO, "Error processing REQUIRED rules"); return ret; } ); 1426 CHECK_FCT_DO( ret = rules_to_fD_onelist(fD_dict, parent, RULE_OPTIONAL, optional, nb_added), 1427 { TRACE_DEBUG(INFO, "Error processing OPTIONAL rules"); return ret; } ); 1406 1428 1407 1429 return 0; … … 1425 1447 ad.avp_vendor = a->vendor; 1426 1448 ad.avp_name = (char *)a->name; 1427 ad.avp_flag_mask = a->fmask ;1449 ad.avp_flag_mask = a->fmask | AVP_FLAG_VENDOR; 1428 1450 ad.avp_flag_val = a->flags; 1429 1451 1430 1452 if (!FD_IS_LIST_EMPTY(&a->type)) { 1431 1453 /* special exception: we use per-AVP enumerated types in fD */ 1432 if (strcasecmp("Enumerated", (char *)((struct t_avptype *)a->type.next)->type_name)) 1454 if (!strcasecmp("Enumerated", (char *)((struct t_avptype *)a->type.next)->type_name)) 1455 goto enumerated; 1456 /* Let's allow "Unsigned32" instead of "Enumerated" also... */ 1457 if ((!FD_IS_LIST_EMPTY(&a->enums)) && (!strcasecmp("Unsigned32", (char *)((struct t_avptype *)a->type.next)->type_name))) 1433 1458 goto enumerated; 1434 1459 … … 1441 1466 || !FD_IS_LIST_EMPTY(&a->grouped_fixed) ) { 1442 1467 /* The AVP has rules, it is a grouped AVP */ 1443 CHECK_PARAMS( FD_IS_LIST_EMPTY(&a->enums) ); 1468 CHECK_PARAMS_DO( FD_IS_LIST_EMPTY(&a->enums), 1469 { TRACE_DEBUG(INFO, "Conflict: The AVP '%s' has both enum values and rules.", ad.avp_name); return EINVAL; } ); 1444 1470 ad.avp_basetype = AVP_TYPE_GROUPED; 1445 1471 } else { 1446 1472 /* It should be an enumerated AVP... */ 1447 1473 if (FD_IS_LIST_EMPTY(&a->enums)) { 1448 TRACE_DEBUG(INFO, " [dict_legacy_xml]Error: Missing type information for AVP '%s'", ad.avp_name);1474 TRACE_DEBUG(INFO, "Error: Missing type information for AVP '%s'", ad.avp_name); 1449 1475 return EINVAL; 1450 1476 } else { … … 1492 1518 /* Now, the inner elements, if any */ 1493 1519 1520 if ( (!FD_IS_LIST_EMPTY(&a->enums)) && (ad.avp_basetype != AVP_TYPE_UNSIGNED32)) { 1521 TRACE_DEBUG(INFO, "AVP '%s' type is not an Unsigned32 but it has enum values (invalid in this extension).", ad.avp_name); 1522 return EINVAL; 1523 } 1524 1494 1525 /* In case of enumeration, define the enum values */ 1495 ASSERT( FD_IS_LIST_EMPTY(&a->enums) || (type && (ad.avp_basetype == AVP_TYPE_UNSIGNED32)) ); /* u32 type must be defined for enumerators */1496 1526 for (li = a->enums.next; li != &a->enums; li = li->next) { 1497 1527 struct t_enum * e = (struct t_enum *)li; … … 1502 1532 ed.enum_value.u32 = e->code; 1503 1533 1504 CHECK_FCT( fd_dict_new ( fD_dict, DICT_ENUMVAL, &ed, type, NULL ) ); 1534 CHECK_FCT_DO( ret = fd_dict_new ( fD_dict, DICT_ENUMVAL, &ed, type, NULL ), 1535 { 1536 TRACE_DEBUG(INFO, "Error defining constant value '%s' for AVP '%s': %s", ed.enum_name, ad.avp_name, strerror(ret)); 1537 return ret; 1538 } ); 1505 1539 if (nb_added) 1506 1540 *nb_added += 1; … … 1511 1545 || !FD_IS_LIST_EMPTY(&a->grouped_required) 1512 1546 || !FD_IS_LIST_EMPTY(&a->grouped_fixed) ) { 1513 CHECK_PARAMS( ad.avp_basetype == AVP_TYPE_GROUPED ); 1514 CHECK_FCT( rules_to_fD(fD_dict, prev, &a->grouped_fixed, &a->grouped_required, &a->grouped_optional, nb_added) ); 1547 CHECK_PARAMS_DO( ad.avp_basetype == AVP_TYPE_GROUPED, 1548 { TRACE_DEBUG(INFO, "Got rules for non-grouped AVP '%s'", ad.avp_name); return EINVAL;} ); 1549 CHECK_FCT_DO( ret = rules_to_fD(fD_dict, prev, &a->grouped_fixed, &a->grouped_required, &a->grouped_optional, nb_added), 1550 { TRACE_DEBUG(INFO, "Error processing rules for AVP '%s': %s", ad.avp_name, strerror(ret)); return ret; } ); 1515 1551 } 1516 1552 … … 1536 1572 snprintf(cmdname, sizeof(cmdname), "%s-Request", (char *)c->name); 1537 1573 cd.cmd_name = &cmdname[0]; 1538 cd.cmd_flag_mask = c->fmask | CMD_FLAG_REQUEST ;1574 cd.cmd_flag_mask = c->fmask | CMD_FLAG_REQUEST | CMD_FLAG_ERROR; 1539 1575 cd.cmd_flag_val = c->flags | CMD_FLAG_REQUEST; 1540 1576 … … 1564 1600 snprintf(cmdname, sizeof(cmdname), "%s-Answer", (char *)c->name); 1565 1601 cd.cmd_flag_val &= ~CMD_FLAG_REQUEST; 1602 cd.cmd_flag_mask &= ~CMD_FLAG_ERROR; 1566 1603 1567 1604 ret = fd_dict_new ( fD_dict, DICT_COMMAND, &cd, fd_appl, &ans ); … … 1585 1622 rules: 1586 1623 /* Now process the rules inside the command */ 1587 CHECK_FCT( rules_to_fD(fD_dict, req, &c->reqrules_fixed, &c->reqrules_required, &c->reqrules_optional, nb_added) ); 1588 CHECK_FCT( rules_to_fD(fD_dict, ans, &c->ansrules_fixed, &c->ansrules_required, &c->ansrules_optional, nb_added) ); 1624 CHECK_FCT_DO( ret = rules_to_fD(fD_dict, req, &c->reqrules_fixed, &c->reqrules_required, &c->reqrules_optional, nb_added), 1625 { 1626 TRACE_DEBUG(INFO, "Error converting data from request rules: %s", strerror(ret)); 1627 return ret; 1628 } ); 1629 CHECK_FCT_DO( ret = rules_to_fD(fD_dict, ans, &c->ansrules_fixed, &c->ansrules_required, &c->ansrules_optional, nb_added), 1630 { 1631 TRACE_DEBUG(INFO, "Error converting data from answer rules: %s", strerror(ret)); 1632 return ret; 1633 } ); 1589 1634 1590 1635 /* Done */ … … 1641 1686 /* First, define all the types */ 1642 1687 for (li = a->types.next; li != &a->types; li = li->next) { 1643 CHECK_FCT( typdefn_to_fD((struct t_typedefn *)li, fD_dict, prev, NULL, nb_added) ); 1688 CHECK_FCT_DO( ret = typdefn_to_fD((struct t_typedefn *)li, fD_dict, prev, NULL, nb_added), 1689 { 1690 TRACE_DEBUG(INFO, "Error converting data from typedefn '%s': %s", ((struct t_typedefn *)li)->name, strerror(ret)); 1691 return ret; 1692 } ); 1644 1693 } 1645 1694 1646 1695 /* Then, AVPs, enums, and grouped AVP rules */ 1647 1696 for (li = a->avps.next; li != &a->avps; li = li->next) { 1648 CHECK_FCT( avp_to_fD((struct t_avp *)li, fD_dict, prev, NULL, nb_added) ); 1697 CHECK_FCT_DO( ret = avp_to_fD((struct t_avp *)li, fD_dict, prev, NULL, nb_added), 1698 { 1699 TRACE_DEBUG(INFO, "Error converting data from AVP '%s': %s", ((struct t_avp *)li)->name, strerror(ret)); 1700 return ret; 1701 } ); 1649 1702 } 1650 1703 1651 1704 /* Finally, the commands and rules */ 1652 1705 for (li = a->commands.next; li != &a->commands; li = li->next) { 1653 CHECK_FCT( cmd_to_fD((struct t_cmd *)li, fD_dict, prev, NULL, nb_added) ); 1706 CHECK_FCT_DO( ret = cmd_to_fD((struct t_cmd *)li, fD_dict, prev, NULL, nb_added), 1707 { 1708 TRACE_DEBUG(INFO, "Error converting data from command '%s': %s", ((struct t_cmd *)li)->name, strerror(ret)); 1709 return ret; 1710 } ); 1654 1711 } 1655 1712 … … 1662 1719 { 1663 1720 struct fd_list * li; 1721 int ret; 1664 1722 1665 1723 TRACE_ENTRY("%p %p %p", fD_dict, xmldict, nb_added); … … 1671 1729 /* Create all the vendors */ 1672 1730 for (li = xmldict->vendors.next; li != &xmldict->vendors; li = li->next) { 1673 CHECK_FCT( vend_to_fD((struct t_vend *)li, fD_dict, NULL, nb_added) ); 1731 CHECK_FCT_DO( ret = vend_to_fD((struct t_vend *)li, fD_dict, NULL, nb_added), 1732 { 1733 TRACE_DEBUG(INFO, "Error converting data from vendor '%s': %s", ((struct t_vend *)li)->name, strerror(ret)); 1734 return ret; 1735 } ); 1674 1736 } 1675 1737 1676 1738 /* Now, process each application */ 1677 CHECK_FCT( appl_to_fD(&xmldict->base_and_applications, fD_dict, NULL, nb_added) ); 1739 CHECK_FCT_DO( ret = appl_to_fD(&xmldict->base_and_applications, fD_dict, NULL, nb_added), 1740 { 1741 TRACE_DEBUG(INFO, "Error converting data from Base application: %s", strerror(ret)); 1742 return ret; 1743 } ); 1678 1744 for (li = xmldict->base_and_applications.chain.next; li != &xmldict->base_and_applications.chain; li = li->next) { 1679 CHECK_FCT( appl_to_fD((struct t_appl *) li, fD_dict, NULL, nb_added) ); 1745 CHECK_FCT_DO( ret = appl_to_fD((struct t_appl *) li, fD_dict, NULL, nb_added), 1746 { 1747 TRACE_DEBUG(INFO, "Error converting data from application '%s': %s", ((struct t_appl *)li)->name, strerror(ret)); 1748 return ret; 1749 } ); 1680 1750 } 1681 1751 … … 1725 1795 } 1726 1796 1727 TRACE_DEBUG(FULL, "XML file parsing complete.");1797 TRACE_DEBUG(FULL, "XML file parsing, 1st pass completed."); 1728 1798 if (TRACE_BOOL(ANNOYING)) { 1729 1799 dump_dict(&data.dict); … … 1731 1801 1732 1802 /* Now, convert all the objects from the temporary tree into the freeDiameter dictionary */ 1733 CHECK_FCT_DO( dict_to_fD(fd_g_config->cnf_dict, &data.dict, &ret), { del_dict_contents(&data.dict); return -1; } ); 1734 1735 TRACE_DEBUG(FULL, "Conversion to freeDiameter internal format complete."); 1803 CHECK_FCT_DO( dict_to_fD(fd_g_config->cnf_dict, &data.dict, &ret), 1804 { 1805 TRACE_DEBUG(INFO, "Error while converting data read from file '%s'", xmlfilename); 1806 del_dict_contents(&data.dict); 1807 return -1; 1808 } ); 1809 1810 TRACE_DEBUG(FULL, "Conversion from '%s' to freeDiameter internal format complete.", xmlfilename); 1736 1811 if (TRACE_BOOL(ANNOYING)) { 1737 1812 fd_dict_dump(fd_g_config->cnf_dict);
Note: See TracChangeset
for help on using the changeset viewer.