Changeset 804:c5b7d4a2cc77 in freeDiameter for libfdproto/messages.c
- Timestamp:
- Aug 22, 2012, 7:22:46 AM (12 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libfdproto/messages.c
r792 r804 662 662 #define INOBJHDRVAL indent<0 ? 1 : indent, indent<0 ? "-" : "|" 663 663 664 /* Write some debug data in a buffer */ 665 664 666 /* Dump a msg_t object */ 665 static void obj_dump_msg (struct msg * msg, int indent, FILE * fstr)667 static int obj_dump_msg (struct msg * msg, int indent, char **outstr, size_t *offset, size_t *outlen ) 666 668 { 667 669 int ret = 0; 668 670 669 fd_log_debug_fstr(fstr, "%*sMSG: %p\n", INOBJHDRVAL, msg);671 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%*sMSG: %p\n", INOBJHDRVAL, msg) ); 670 672 671 673 if (!CHECK_MSG(msg)) { 672 fd_log_debug_fstr(fstr, INOBJHDR "INVALID!\n", INOBJHDRVAL);673 return ;674 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "INVALID!\n", INOBJHDRVAL) ); 675 return 0; 674 676 } 675 677 676 678 if (!msg->msg_model) { 677 679 678 fd_log_debug_fstr(fstr, INOBJHDR "(no model)\n", INOBJHDRVAL);680 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "(no model)\n", INOBJHDRVAL) ); 679 681 680 682 } else { … … 684 686 ret = fd_dict_gettype(msg->msg_model, &dicttype); 685 687 if (ret || (dicttype != DICT_COMMAND)) { 686 fd_log_debug_fstr(fstr, INOBJHDR "(invalid model: %d %d)\n", INOBJHDRVAL, ret, dicttype);688 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "(invalid model: %d %d)\n", INOBJHDRVAL, ret, dicttype) ); 687 689 goto public; 688 690 } 689 691 ret = fd_dict_getval(msg->msg_model, &dictdata); 690 692 if (ret != 0) { 691 fd_log_debug_fstr(fstr, INOBJHDR "(error getting model data: %s)\n", INOBJHDRVAL, strerror(ret));693 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "(error getting model data: %s)\n", INOBJHDRVAL, strerror(ret)) ); 692 694 goto public; 693 695 } 694 fd_log_debug_fstr(fstr, INOBJHDR "model : v/m:" DUMP_CMDFL_str "/" DUMP_CMDFL_str ", %u \"%s\"\n", INOBJHDRVAL,695 DUMP_CMDFL_val(dictdata.cmd_flag_val), DUMP_CMDFL_val(dictdata.cmd_flag_mask), dictdata.cmd_code, dictdata.cmd_name) ;696 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "model : v/m:" DUMP_CMDFL_str "/" DUMP_CMDFL_str ", %u \"%s\"\n", INOBJHDRVAL, 697 DUMP_CMDFL_val(dictdata.cmd_flag_val), DUMP_CMDFL_val(dictdata.cmd_flag_mask), dictdata.cmd_code, dictdata.cmd_name) ); 696 698 } 697 699 public: 698 fd_log_debug_fstr(fstr, INOBJHDR "public: V:%d L:%d fl:" DUMP_CMDFL_str " CC:%u A:%d hi:%x ei:%x\n", INOBJHDRVAL,700 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "public: V:%d L:%d fl:" DUMP_CMDFL_str " CC:%u A:%d hi:%x ei:%x\n", INOBJHDRVAL, 699 701 msg->msg_public.msg_version, 700 702 msg->msg_public.msg_length, … … 704 706 msg->msg_public.msg_hbhid, 705 707 msg->msg_public.msg_eteid 706 ); 707 fd_log_debug_fstr(fstr, INOBJHDR "intern: rwb:%p rt:%d cb:%p(%p) qry:%p asso:%d sess:%p src:%s(%zd)\n", 708 INOBJHDRVAL, msg->msg_rawbuffer, msg->msg_routable, msg->msg_cb.fct, msg->msg_cb.data, msg->msg_query, msg->msg_associated, msg->msg_sess, msg->msg_src_id?:"(nil)", msg->msg_src_id_len); 708 ) ); 709 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "intern: rwb:%p rt:%d cb:%p(%p) qry:%p asso:%d sess:%p src:%s(%zd)\n", 710 INOBJHDRVAL, msg->msg_rawbuffer, msg->msg_routable, msg->msg_cb.fct, msg->msg_cb.data, msg->msg_query, msg->msg_associated, msg->msg_sess, msg->msg_src_id?:"(nil)", msg->msg_src_id_len) ); 711 return 0; 709 712 } 710 713 711 714 /* Dump an avp object */ 712 static void obj_dump_avp ( struct avp * avp, int indent, FILE * fstr)715 static int obj_dump_avp ( struct avp * avp, int indent, char **outstr, size_t *offset, size_t *outlen ) 713 716 { 714 717 int ret = 0; 715 718 716 719 if (!CHECK_AVP(avp)) { 717 fd_log_debug_fstr(fstr, INOBJHDR "INVALID!\n", INOBJHDRVAL);718 return ;720 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "INVALID!\n", INOBJHDRVAL) ); 721 return 0; 719 722 } 720 723 721 724 if (!avp->avp_model) { 722 725 723 fd_log_debug_fstr(fstr, INOBJHDR "(no model)\n", INOBJHDRVAL);726 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "(no model)\n", INOBJHDRVAL) ); 724 727 725 728 } else { … … 729 732 ret = fd_dict_gettype(avp->avp_model, &dicttype); 730 733 if (ret || (dicttype != DICT_AVP)) { 731 fd_log_debug_fstr(fstr, INOBJHDR "(invalid model: %d %d)\n", INOBJHDRVAL, ret, dicttype);734 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "(invalid model: %d %d)\n", INOBJHDRVAL, ret, dicttype) ); 732 735 goto public; 733 736 } 734 737 ret = fd_dict_getval(avp->avp_model, &dictdata); 735 738 if (ret != 0) { 736 fd_log_debug_fstr(fstr, INOBJHDR "(error getting model data: %s)\n", INOBJHDRVAL, strerror(ret));739 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "(error getting model data: %s)\n", INOBJHDRVAL, strerror(ret)) ); 737 740 goto public; 738 741 } 739 fd_log_debug_fstr(fstr, INOBJHDR "model : v/m:" DUMP_AVPFL_str "/" DUMP_AVPFL_str ", %12s, %u \"%s\"\n", INOBJHDRVAL,742 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "model : v/m:" DUMP_AVPFL_str "/" DUMP_AVPFL_str ", %12s, %u \"%s\"\n", INOBJHDRVAL, 740 743 DUMP_AVPFL_val(dictdata.avp_flag_val), 741 744 DUMP_AVPFL_val(dictdata.avp_flag_mask), 742 745 type_base_name[dictdata.avp_basetype], 743 746 dictdata.avp_code, 744 dictdata.avp_name ) ;747 dictdata.avp_name ) ); 745 748 } 746 749 public: 747 fd_log_debug_fstr(fstr, INOBJHDR "public: C:%u fl:" DUMP_AVPFL_str " L:%d V:%u data:@%p\n", INOBJHDRVAL,750 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "public: C:%u fl:" DUMP_AVPFL_str " L:%d V:%u data:@%p\n", INOBJHDRVAL, 748 751 avp->avp_public.avp_code, 749 752 DUMP_AVPFL_val(avp->avp_public.avp_flags), … … 751 754 avp->avp_public.avp_vendor, 752 755 avp->avp_public.avp_value 753 ) ;756 ) ); 754 757 /* Dump the value if set */ 755 758 if (avp->avp_public.avp_value) { 756 759 if (!avp->avp_model) { 757 fd_log_debug_fstr(fstr, INOBJHDR "(data set but no model: ERROR)\n", INOBJHDRVAL);760 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "(data set but no model: ERROR)\n", INOBJHDRVAL) ); 758 761 } else { 759 fd_dict_dump_avp_value(avp->avp_public.avp_value, avp->avp_model, indent, fstr); 760 } 761 } 762 763 fd_log_debug_fstr(fstr, INOBJHDR "intern: src:%p mf:%d raw:%p(%d)\n", INOBJHDRVAL, avp->avp_source, avp->avp_mustfreeos, avp->avp_rawdata, avp->avp_rawlen); 764 } 765 766 /* Dump a single object content */ 767 static void msg_dump_intern ( int level, msg_or_avp * obj, int indent, FILE * fstr ) 762 CHECK_FCT( fd_dict_dump_avp_value(avp->avp_public.avp_value, avp->avp_model, indent, outstr, offset, outlen) ); 763 } 764 } 765 766 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "intern: src:%p mf:%d raw:%p(%d)\n", INOBJHDRVAL, avp->avp_source, avp->avp_mustfreeos, avp->avp_rawdata, avp->avp_rawlen) ); 767 return 0; 768 } 769 770 /* Dump a single object content into out string, realloc if needed */ 771 static int msg_dump_intern ( int level, msg_or_avp * obj, int indent, char **outstr, size_t *offset, size_t *outlen ) 768 772 { 769 773 /* Log only if we are at least at level */ 770 774 if ( ! TRACE_BOOL(level) ) 771 return ;775 return 0; 772 776 773 777 /* Check the object */ 774 778 if (!VALIDATE_OBJ(obj)) { 775 fd_log_debug_fstr(fstr, ">>> invalid object (%p)!.\n", obj);776 return ;779 CHECK_FCT( dump_add_str(outstr, offset, outlen, ">>> invalid object (%p)!.\n", obj) ); 780 return 0; 777 781 } 778 782 … … 780 784 switch (_C(obj)->type) { 781 785 case MSG_AVP: 782 obj_dump_avp ( _A(obj), indent, fstr);786 CHECK_FCT( obj_dump_avp ( _A(obj), indent, outstr, offset, outlen )); 783 787 break; 784 788 785 789 case MSG_MSG: 786 obj_dump_msg ( _M(obj), indent, fstr);790 CHECK_FCT( obj_dump_msg ( _M(obj), indent, outstr, offset, outlen ) ); 787 791 break; 788 792 … … 790 794 ASSERT(0); 791 795 } 796 return 0; 792 797 } 793 798 … … 797 802 msg_or_avp * ref = msg; 798 803 int indent = 2; 804 char *outstr; 805 size_t offset, outlen; 806 CHECK_FCT_DO( dump_init_str(&outstr, &offset, &outlen), { fd_log_debug_fstr(fstr, "Error initializing string for dumping %p\n", msg); return; } ); 799 807 do { 800 msg_dump_intern ( NONE, ref, indent, fstr ); 808 CHECK_FCT_DO( msg_dump_intern ( NONE, ref, indent, &outstr, &offset, &outlen ), 809 fd_log_debug_fstr(fstr, "Error while dumping %p\n", ref) ); 801 810 802 811 /* Now find the next object */ … … 805 814 /* dump next object */ 806 815 } while (ref); 816 817 /* now really output this in one shot, so it is not interrupted */ 818 fd_log_debug_fstr(fstr, "%s", outstr); 819 820 free(outstr); 807 821 } 808 822 void fd_msg_dump_fstr_one ( struct msg * msg, FILE * fstr ) /* just the header */ 809 823 { 810 msg_dump_intern ( NONE, msg, 2, fstr ); 824 char *outstr; 825 size_t offset, outlen; 826 CHECK_FCT_DO( dump_init_str(&outstr, &offset, &outlen), { fd_log_debug_fstr(fstr, "Error initializing string for dumping %p\n", msg); return; } ); 827 CHECK_FCT_DO( msg_dump_intern ( NONE, msg, 2, &outstr, &offset, &outlen ), 828 fd_log_debug_fstr(fstr, "Error while dumping %p\n", msg) ); 829 /* now really output this in one shot, so it is not interrupted */ 830 fd_log_debug_fstr(fstr, "%s", outstr); 831 832 free(outstr); 811 833 } 812 834 … … 816 838 msg_or_avp * ref = obj; 817 839 int indent = 1; 818 819 TRACE_DEBUG(level, "------ Dumping object %p (w)-------", obj); 840 char *outstr; 841 size_t offset, outlen; 842 CHECK_FCT_DO( dump_init_str(&outstr, &offset, &outlen), 843 { fd_log_debug_fstr(fd_g_debug_fstr, "Error initializing string for dumping %p\n", obj); return; } ); 844 820 845 do { 821 msg_dump_intern ( level, ref, indent, fd_g_debug_fstr ); 846 CHECK_FCT_DO( msg_dump_intern ( level, ref, indent, &outstr, &offset, &outlen ), 847 fd_log_debug_fstr(fd_g_debug_fstr, "Error while dumping %p\n", ref) ); 822 848 823 849 /* Now find the next object */ … … 827 853 } while (ref); 828 854 855 /* now really output this in one shot, so it is not interrupted */ 856 TRACE_DEBUG(level, "------ Dumping object %p (w)-------", obj); 857 fd_log_debug_fstr(fd_g_debug_fstr, "%s", outstr); 829 858 TRACE_DEBUG(level, "------ /end of object %p -------", obj); 859 860 free(outstr); 830 861 } 831 862 … … 833 864 void fd_msg_dump_one ( int level, msg_or_avp * obj ) 834 865 { 866 char *outstr; 867 size_t offset, outlen; 868 CHECK_FCT_DO( dump_init_str(&outstr, &offset, &outlen), 869 { fd_log_debug_fstr(fd_g_debug_fstr, "Error initializing string for dumping %p\n", obj); return; } ); 870 CHECK_FCT_DO( msg_dump_intern ( level, obj, 1, &outstr, &offset, &outlen ), 871 fd_log_debug_fstr(fd_g_debug_fstr, "Error while dumping %p\n", obj) ); 835 872 TRACE_DEBUG(level, "------ Dumping object %p (s)-------", obj); 836 msg_dump_intern ( level, obj, 1, fd_g_debug_fstr);873 fd_log_debug_fstr(fd_g_debug_fstr, "%s", outstr); 837 874 TRACE_DEBUG(level, "------ /end of object %p -------", obj); 875 free(outstr); 838 876 } 839 877 … … 1688 1726 if (mandatory && (avp->avp_public.avp_flags & AVP_FLAG_MANDATORY)) { 1689 1727 TRACE_DEBUG(INFO, "Unsupported mandatory AVP found:"); 1690 msg_dump_intern(INFO, avp, 2, fd_g_debug_fstr);1728 fd_msg_dump_one(INFO, avp); 1691 1729 if (error_info) { 1692 1730 error_info->pei_errcode = "DIAMETER_AVP_UNSUPPORTED";
Note: See TracChangeset
for help on using the changeset viewer.