@@ -9,22 +9,28 @@ const char* ffDetectSwap(FFSwapResult* swap)
9
9
{
10
10
// Ref: #620
11
11
char buf [PROC_FILE_BUFFSIZ ];
12
- ssize_t nRead = ffReadFileData ("/proc/meminfo " , ARRAY_SIZE (buf ) - 1 , buf );
13
- if (nRead < 0 )
14
- return "ffReadFileData(\"/proc/meminfo \", ARRAY_SIZE(buf)-1, buf)" ;
12
+ ssize_t nRead = ffReadFileData ("/proc/swaps " , ARRAY_SIZE (buf ) - 1 , buf );
13
+ if (nRead <= 0 )
14
+ return "ffReadFileData(\"/proc/swaps \", ARRAY_SIZE(buf)-1, buf) failed " ;
15
15
buf [nRead ] = '\0' ;
16
16
17
- uint64_t swapTotal = 0 , swapFree = 0 ;
17
+ // Skip header
18
+ char * line = memchr (buf , '\n' , (size_t ) nRead );
18
19
19
- char * token = NULL ;
20
- if ((token = strstr (buf , "SwapTotal:" )) != NULL )
21
- swapTotal = strtoul (token + strlen ("SwapTotal:" ), NULL , 10 );
20
+ while (line && * ++ line )
21
+ {
22
+ uint64_t total , used ;
23
+ if (sscanf (line , "%*[^\t]%" SCNu64 "%" SCNu64 , & total , & used ) != 2 )
24
+ return "Invalid /proc/swaps format found" ;
22
25
23
- if (( token = strstr ( buf , "SwapFree:" )) != NULL )
24
- swapFree = strtoul ( token + strlen ( "SwapFree:" ), NULL , 10 ) ;
26
+ swap -> bytesTotal += total ;
27
+ swap -> bytesUsed += used ;
25
28
26
- swap -> bytesTotal = swapTotal * 1024lu ;
27
- swap -> bytesUsed = (swapTotal - swapFree ) * 1024lu ;
29
+ line = memchr (line , '\n' , (size_t ) (nRead - (line - buf )));
30
+ }
31
+
32
+ swap -> bytesTotal *= 1024u ;
33
+ swap -> bytesUsed *= 1024u ;
28
34
29
35
return NULL ;
30
36
}
0 commit comments