- r = get_status_field("/proc/meminfo", "\nSwapFree:", &swapfree);
- if (r < 0) {
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING,
- "Failed to retrieve SwapFree from /proc/meminfo: %s", strerror(-r));
- return false;
+ (void) fscanf(f, "%*s %*s %*s %*s %*s\n");
+
+ for (i = 1;; i++) {
+ _cleanup_free_ char *dev = NULL, *d = NULL, *type = NULL;
+ size_t size_field, used_field;
+ int k;
+
+ k = fscanf(f,
+ "%ms " /* device/file */
+ "%ms " /* type of swap */
+ "%zd " /* swap size */
+ "%zd " /* used */
+ "%*i\n", /* priority */
+ &dev, &type, &size_field, &used_field);
+ if (k != 4) {
+ if (k == EOF)
+ break;
+
+ log_warning("Failed to parse /proc/swaps:%u", i);
+ continue;
+ }
+
+ d = cunescape(dev);
+ if (!d)
+ return -ENOMEM;
+
+ if (!streq(type, "partition") && !streq(type, "file")) {
+ log_debug("Partition %s has type %s, ignoring.", d, type);
+ continue;
+ }
+
+ *size = size_field;
+ *used = used_field;
+ return 0;