@@ -750,6 +750,36 @@ struct tmonitor_ctx {
750
750
int pcap_fd ;
751
751
};
752
752
753
+ static int __base_pr (const char * format , va_list args )
754
+ {
755
+ return vfprintf (stdout , format , args );
756
+ }
757
+
758
+ static tm_print_fn_t __tm_pr = __base_pr ;
759
+
760
+ tm_print_fn_t traffic_monitor_set_print (tm_print_fn_t fn )
761
+ {
762
+ tm_print_fn_t old_print_fn ;
763
+
764
+ old_print_fn = __atomic_exchange_n (& __tm_pr , fn , __ATOMIC_RELAXED );
765
+
766
+ return old_print_fn ;
767
+ }
768
+
769
+ void tm_print (const char * format , ...)
770
+ {
771
+ tm_print_fn_t print_fn ;
772
+ va_list args ;
773
+
774
+ print_fn = __atomic_load_n (& __tm_pr , __ATOMIC_RELAXED );
775
+ if (!print_fn )
776
+ return ;
777
+
778
+ va_start (args , format );
779
+ print_fn (format , args );
780
+ va_end (args );
781
+ }
782
+
753
783
/* Is this packet captured with a Ethernet protocol type? */
754
784
static bool is_ethernet (const u_char * packet )
755
785
{
@@ -767,7 +797,7 @@ static bool is_ethernet(const u_char *packet)
767
797
case 770 : /* ARPHRD_FRAD */
768
798
case 778 : /* ARPHDR_IPGRE */
769
799
case 803 : /* ARPHRD_IEEE80211_RADIOTAP */
770
- printf ("Packet captured: arphdr_type=%d\n" , arphdr_type );
800
+ tm_print ("Packet captured: arphdr_type=%d\n" , arphdr_type );
771
801
return false;
772
802
}
773
803
return true;
@@ -817,19 +847,19 @@ static void show_transport(const u_char *packet, u16 len, u32 ifindex,
817
847
dst_port = ntohs (tcp -> dest );
818
848
transport_str = "TCP" ;
819
849
} else if (proto == IPPROTO_ICMP ) {
820
- printf ("%-7s %-3s IPv4 %s > %s: ICMP, length %d, type %d, code %d\n" ,
821
- ifname , pkt_type_str (pkt_type ), src_addr , dst_addr , len ,
822
- packet [0 ], packet [1 ]);
850
+ tm_print ("%-7s %-3s IPv4 %s > %s: ICMP, length %d, type %d, code %d\n" ,
851
+ ifname , pkt_type_str (pkt_type ), src_addr , dst_addr , len ,
852
+ packet [0 ], packet [1 ]);
823
853
return ;
824
854
} else if (proto == IPPROTO_ICMPV6 ) {
825
- printf ("%-7s %-3s IPv6 %s > %s: ICMPv6, length %d, type %d, code %d\n" ,
826
- ifname , pkt_type_str (pkt_type ), src_addr , dst_addr , len ,
827
- packet [0 ], packet [1 ]);
855
+ tm_print ("%-7s %-3s IPv6 %s > %s: ICMPv6, length %d, type %d, code %d\n" ,
856
+ ifname , pkt_type_str (pkt_type ), src_addr , dst_addr , len ,
857
+ packet [0 ], packet [1 ]);
828
858
return ;
829
859
} else {
830
- printf ("%-7s %-3s %s %s > %s: protocol %d\n" ,
831
- ifname , pkt_type_str (pkt_type ), ipv6 ? "IPv6" : "IPv4" ,
832
- src_addr , dst_addr , proto );
860
+ tm_print ("%-7s %-3s %s %s > %s: protocol %d\n" ,
861
+ ifname , pkt_type_str (pkt_type ), ipv6 ? "IPv6" : "IPv4" ,
862
+ src_addr , dst_addr , proto );
833
863
return ;
834
864
}
835
865
@@ -843,13 +873,13 @@ static void show_transport(const u_char *packet, u16 len, u32 ifindex,
843
873
tcp -> ack ? ", ACK" : "" );
844
874
845
875
if (ipv6 )
846
- printf ("%-7s %-3s IPv6 %s.%d > %s.%d: %s, length %d%s\n" ,
847
- ifname , pkt_type_str (pkt_type ), src_addr , src_port ,
848
- dst_addr , dst_port , transport_str , len , flags );
876
+ tm_print ("%-7s %-3s IPv6 %s.%d > %s.%d: %s, length %d%s\n" ,
877
+ ifname , pkt_type_str (pkt_type ), src_addr , src_port ,
878
+ dst_addr , dst_port , transport_str , len , flags );
849
879
else
850
- printf ("%-7s %-3s IPv4 %s:%d > %s:%d: %s, length %d%s\n" ,
851
- ifname , pkt_type_str (pkt_type ), src_addr , src_port ,
852
- dst_addr , dst_port , transport_str , len , flags );
880
+ tm_print ("%-7s %-3s IPv4 %s:%d > %s:%d: %s, length %d%s\n" ,
881
+ ifname , pkt_type_str (pkt_type ), src_addr , src_port ,
882
+ dst_addr , dst_port , transport_str , len , flags );
853
883
}
854
884
855
885
static void show_ipv6_packet (const u_char * packet , u32 ifindex , u8 pkt_type )
@@ -964,8 +994,8 @@ static void *traffic_monitor_thread(void *arg)
964
994
ifname = _ifname ;
965
995
}
966
996
967
- printf ("%-7s %-3s Unknown network protocol type 0x%x\n" ,
968
- ifname , pkt_type_str (ptype ), proto );
997
+ tm_print ("%-7s %-3s Unknown network protocol type 0x%x\n" ,
998
+ ifname , pkt_type_str (ptype ), proto );
969
999
}
970
1000
}
971
1001
@@ -1165,8 +1195,9 @@ void traffic_monitor_stop(struct tmonitor_ctx *ctx)
1165
1195
write (ctx -> wake_fd , & w , sizeof (w ));
1166
1196
pthread_join (ctx -> thread , NULL );
1167
1197
1168
- printf ("Packet file: %s\n" , strrchr (ctx -> pkt_fname , '/' ) + 1 );
1198
+ tm_print ("Packet file: %s\n" , strrchr (ctx -> pkt_fname , '/' ) + 1 );
1169
1199
1170
1200
traffic_monitor_release (ctx );
1171
1201
}
1202
+
1172
1203
#endif /* TRAFFIC_MONITOR */
0 commit comments