66
77#include <net/if.h>
88
9+ static void getData (FFstrbuf * buffer , const char * ifName , bool isDefaultRoute , FFstrbuf * path , FFlist * result )
10+ {
11+ ffStrbufSetF (path , "/sys/class/net/%s/operstate" , ifName );
12+ if (!ffReadFileBuffer (path -> chars , buffer ) || !ffStrbufEqualS (buffer , "up" ))
13+ return ;
14+
15+ FFNetIOResult * counters = (FFNetIOResult * ) ffListAdd (result );
16+ ffStrbufInitS (& counters -> name , ifName );
17+ counters -> defaultRoute = isDefaultRoute ;
18+
19+ ffStrbufSetF (path , "/sys/class/net/%s/statistics/" , ifName );
20+ uint32_t statLen = path -> length ;
21+
22+ ffStrbufAppendS (path , "rx_bytes" );
23+ if (ffReadFileBuffer (path -> chars , buffer ))
24+ counters -> rxBytes = ffStrbufToUInt (buffer , 0 );
25+ ffStrbufSubstrBefore (path , statLen );
26+
27+ ffStrbufAppendS (path , "tx_bytes" );
28+ if (ffReadFileBuffer (path -> chars , buffer ))
29+ counters -> txBytes = ffStrbufToUInt (buffer , 0 );
30+ ffStrbufSubstrBefore (path , statLen );
31+
32+ ffStrbufAppendS (path , "rx_packets" );
33+ if (ffReadFileBuffer (path -> chars , buffer ))
34+ counters -> rxPackets = ffStrbufToUInt (buffer , 0 );
35+ ffStrbufSubstrBefore (path , statLen );
36+
37+ ffStrbufAppendS (path , "tx_packets" );
38+ if (ffReadFileBuffer (path -> chars , buffer ))
39+ counters -> txPackets = ffStrbufToUInt (buffer , 0 );
40+ ffStrbufSubstrBefore (path , statLen );
41+
42+ ffStrbufAppendS (path , "rx_errors" );
43+ if (ffReadFileBuffer (path -> chars , buffer ))
44+ counters -> rxErrors = ffStrbufToUInt (buffer , 0 );
45+ ffStrbufSubstrBefore (path , statLen );
46+
47+ ffStrbufAppendS (path , "tx_errors" );
48+ if (ffReadFileBuffer (path -> chars , buffer ))
49+ counters -> txErrors = ffStrbufToUInt (buffer , 0 );
50+ ffStrbufSubstrBefore (path , statLen );
51+
52+ ffStrbufAppendS (path , "rx_dropped" );
53+ if (ffReadFileBuffer (path -> chars , buffer ))
54+ counters -> rxDrops = ffStrbufToUInt (buffer , 0 );
55+ ffStrbufSubstrBefore (path , statLen );
56+
57+ ffStrbufAppendS (path , "tx_dropped" );
58+ if (ffReadFileBuffer (path -> chars , buffer ))
59+ counters -> txDrops = ffStrbufToUInt (buffer , 0 );
60+ ffStrbufSubstrBefore (path , statLen );
61+ }
62+
963const char * ffNetIOGetIoCounters (FFlist * result , FFNetIOOptions * options )
1064{
1165 FF_AUTO_CLOSE_DIR DIR * dirp = opendir ("/sys/class/net" );
@@ -14,71 +68,29 @@ const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options)
1468 FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateA (64 );
1569 FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate ();
1670
17- const char * defaultRouteIface = ffNetifGetDefaultRoute ();
71+ const char * defaultRouteIfName = ffNetifGetDefaultRouteIfName ();
1872
19- struct dirent * entry ;
20- while ((entry = readdir (dirp )) != NULL )
73+ if (options -> defaultRouteOnly )
74+ {
75+ if (options -> namePrefix .length && strncmp (defaultRouteIfName , options -> namePrefix .chars , options -> namePrefix .length ) != 0 )
76+ return NULL ;
77+
78+ getData (& buffer , defaultRouteIfName , true, & path , result );
79+ }
80+ else
2181 {
22- if (entry -> d_name [0 ] == '.' )
23- continue ;
24-
25- bool isDefaultRoute = ffStrEquals (entry -> d_name , defaultRouteIface );
26- if (options -> defaultRouteOnly && !isDefaultRoute )
27- continue ;
28-
29- if (options -> namePrefix .length && strncmp (entry -> d_name , options -> namePrefix .chars , options -> namePrefix .length ) != 0 )
30- continue ;
31-
32- ffStrbufSetF (& path , "/sys/class/net/%s/operstate" , entry -> d_name );
33- if (!ffReadFileBuffer (path .chars , & buffer ) || !ffStrbufEqualS (& buffer , "up" ))
34- continue ;
35-
36- FFNetIOResult * counters = (FFNetIOResult * ) ffListAdd (result );
37- ffStrbufInitS (& counters -> name , entry -> d_name );
38- counters -> defaultRoute = isDefaultRoute ;
39-
40- ffStrbufSetF (& path , "/sys/class/net/%s/statistics/" , entry -> d_name );
41- uint32_t statLen = path .length ;
42-
43- ffStrbufAppendS (& path , "rx_bytes" );
44- if (ffReadFileBuffer (path .chars , & buffer ))
45- counters -> rxBytes = ffStrbufToUInt (& buffer , 0 );
46- ffStrbufSubstrBefore (& path , statLen );
47-
48- ffStrbufAppendS (& path , "tx_bytes" );
49- if (ffReadFileBuffer (path .chars , & buffer ))
50- counters -> txBytes = ffStrbufToUInt (& buffer , 0 );
51- ffStrbufSubstrBefore (& path , statLen );
52-
53- ffStrbufAppendS (& path , "rx_packets" );
54- if (ffReadFileBuffer (path .chars , & buffer ))
55- counters -> rxPackets = ffStrbufToUInt (& buffer , 0 );
56- ffStrbufSubstrBefore (& path , statLen );
57-
58- ffStrbufAppendS (& path , "tx_packets" );
59- if (ffReadFileBuffer (path .chars , & buffer ))
60- counters -> txPackets = ffStrbufToUInt (& buffer , 0 );
61- ffStrbufSubstrBefore (& path , statLen );
62-
63- ffStrbufAppendS (& path , "rx_errors" );
64- if (ffReadFileBuffer (path .chars , & buffer ))
65- counters -> rxErrors = ffStrbufToUInt (& buffer , 0 );
66- ffStrbufSubstrBefore (& path , statLen );
67-
68- ffStrbufAppendS (& path , "tx_errors" );
69- if (ffReadFileBuffer (path .chars , & buffer ))
70- counters -> txErrors = ffStrbufToUInt (& buffer , 0 );
71- ffStrbufSubstrBefore (& path , statLen );
72-
73- ffStrbufAppendS (& path , "rx_dropped" );
74- if (ffReadFileBuffer (path .chars , & buffer ))
75- counters -> rxDrops = ffStrbufToUInt (& buffer , 0 );
76- ffStrbufSubstrBefore (& path , statLen );
77-
78- ffStrbufAppendS (& path , "tx_dropped" );
79- if (ffReadFileBuffer (path .chars , & buffer ))
80- counters -> txDrops = ffStrbufToUInt (& buffer , 0 );
81- ffStrbufSubstrBefore (& path , statLen );
82+ struct dirent * entry ;
83+ while ((entry = readdir (dirp )) != NULL )
84+ {
85+ const char * ifName = entry -> d_name ;
86+ if (ifName [0 ] == '.' )
87+ continue ;
88+
89+ if (options -> namePrefix .length && strncmp (ifName , options -> namePrefix .chars , options -> namePrefix .length ) != 0 )
90+ continue ;
91+
92+ getData (& buffer , ifName , ffStrEquals (ifName , defaultRouteIfName ), & path , result );
93+ }
8294 }
8395
8496 return NULL ;
0 commit comments