/*
* This file is part of Cockpit.
*
* Copyright (C) 2014 Red Hat, Inc.
*
* Cockpit is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* Cockpit is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Cockpit; If not, see .
*/
#include "config.h"
#include "cockpitmountsamples.h"
#include
#include
#include
#include
#include
#include
#include
void
cockpit_mount_samples (CockpitSamples *samples)
{
gchar *contents = NULL;
GError *error = NULL;
gchar **lines = NULL;
gchar *line;
gchar *esc_dir, *dir;
struct statvfs buf;
gint64 total;
gsize len;
guint n;
if (!g_file_get_contents ("/proc/mounts", &contents, &len, &error))
{
g_message ("error loading contents /proc/mounts: %s", error->message);
g_error_free (error);
goto out;
}
lines = g_strsplit (contents, "\n", -1);
for (n = 0; lines != NULL && lines[n] != NULL; n++)
{
line = lines[n];
if (strlen (line) == 0)
continue;
/* Only look at real devices
*/
if (line[0] != '/')
continue;
while (*line && !isspace (*line))
line++;
while (*line && isspace (*line))
line++;
esc_dir = line;
while (*line && !isspace (*line))
line++;
*line = '\0';
dir = g_strcompress (esc_dir);
if (statvfs (dir, &buf) >= 0)
{
// We explicitly store the fragment size as 64 bits so that
// computations with it don't overflow on 32 bit
// architectures.
gint64 frsize = buf.f_frsize;
total = frsize * buf.f_blocks;
cockpit_samples_sample (samples, "mount.total", dir, total);
cockpit_samples_sample (samples, "mount.used", dir, total - frsize * buf.f_bfree);
}
g_free (dir);
}
out:
g_strfreev (lines);
g_free (contents);
}