|
Packit |
ae235b |
#include <gio/gio.h>
|
|
Packit |
ae235b |
#include <locale.h>
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static gboolean option_use_async;
|
|
Packit |
ae235b |
static gint option_format_size;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static gint outstanding_asyncs;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
print_result (const gchar *filename,
|
|
Packit |
ae235b |
guint64 disk_usage,
|
|
Packit |
ae235b |
guint64 num_dirs,
|
|
Packit |
ae235b |
guint64 num_files,
|
|
Packit |
ae235b |
GError *error,
|
|
Packit |
ae235b |
gchar nl)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
if (!error)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
if (option_format_size)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GFormatSizeFlags format_flags;
|
|
Packit |
ae235b |
gchar *str;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
format_flags = (option_format_size > 1) ? G_FORMAT_SIZE_LONG_FORMAT : G_FORMAT_SIZE_DEFAULT;
|
|
Packit |
ae235b |
str = g_format_size_full (disk_usage, format_flags);
|
|
Packit |
ae235b |
g_print ("%s: %s (%"G_GUINT64_FORMAT" dirs, %"G_GUINT64_FORMAT" files)%c",
|
|
Packit |
ae235b |
filename, str, num_dirs, num_files, nl);
|
|
Packit |
ae235b |
g_free (str);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
else
|
|
Packit |
ae235b |
g_print ("%s: %"G_GUINT64_FORMAT" (%"G_GUINT64_FORMAT" dirs, %"G_GUINT64_FORMAT" files)%c",
|
|
Packit |
ae235b |
filename, disk_usage, num_dirs, num_files, nl);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
else
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
g_printerr ("%s: %s\n", filename, error->message);
|
|
Packit |
ae235b |
g_error_free (error);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
async_ready_func (GObject *source,
|
|
Packit |
ae235b |
GAsyncResult *result,
|
|
Packit |
ae235b |
gpointer user_data)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
gchar *filename = user_data;
|
|
Packit |
ae235b |
GError *error = NULL;
|
|
Packit |
ae235b |
guint64 disk_usage;
|
|
Packit |
ae235b |
guint64 num_dirs;
|
|
Packit |
ae235b |
guint64 num_files;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_file_measure_disk_usage_finish (G_FILE (source), result, &disk_usage, &num_dirs, &num_files, &error);
|
|
Packit |
ae235b |
print_result (filename, disk_usage, num_dirs, num_files, error, '\n');
|
|
Packit |
ae235b |
outstanding_asyncs--;
|
|
Packit |
ae235b |
g_free (filename);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
report_progress (gboolean reporting,
|
|
Packit |
ae235b |
guint64 disk_usage,
|
|
Packit |
ae235b |
guint64 num_dirs,
|
|
Packit |
ae235b |
guint64 num_files,
|
|
Packit |
ae235b |
gpointer user_data)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
const gchar *filename = user_data;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
if (!reporting)
|
|
Packit |
ae235b |
g_printerr ("%s: warning: does not support progress reporting\n", filename);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
print_result (filename, disk_usage, num_dirs, num_files, NULL, '\r');
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
int
|
|
Packit |
ae235b |
main (int argc, char **argv)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GFileMeasureProgressCallback progress = NULL;
|
|
Packit |
ae235b |
GFileMeasureFlags flags = 0;
|
|
Packit |
ae235b |
gint i;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
#ifdef G_OS_WIN32
|
|
Packit |
ae235b |
argv = g_win32_get_command_line ();
|
|
Packit |
ae235b |
argc = g_strv_length (argv);
|
|
Packit |
ae235b |
#endif
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
setlocale (LC_ALL, "");
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
for (i = 1; argv[i] && argv[i][0] == '-'; i++)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
if (g_str_equal (argv[i], "--"))
|
|
Packit |
ae235b |
break;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
if (g_str_equal (argv[i], "--help"))
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
g_print ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
|
|
Packit |
ae235b |
#ifdef G_OS_WIN32
|
|
Packit |
ae235b |
g_strfreev (argv);
|
|
Packit |
ae235b |
#endif
|
|
Packit |
ae235b |
return 0;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
else if (g_str_equal (argv[i], "-x"))
|
|
Packit |
ae235b |
flags |= G_FILE_MEASURE_NO_XDEV;
|
|
Packit |
ae235b |
else if (g_str_equal (argv[i], "-h"))
|
|
Packit |
ae235b |
option_format_size++;
|
|
Packit |
ae235b |
else if (g_str_equal (argv[i], "--apparent-size"))
|
|
Packit |
ae235b |
flags |= G_FILE_MEASURE_APPARENT_SIZE;
|
|
Packit |
ae235b |
else if (g_str_equal (argv[i], "--any-error"))
|
|
Packit |
ae235b |
flags |= G_FILE_MEASURE_REPORT_ANY_ERROR;
|
|
Packit |
ae235b |
else if (g_str_equal (argv[i], "--async"))
|
|
Packit |
ae235b |
option_use_async = TRUE;
|
|
Packit |
ae235b |
else if (g_str_equal (argv[i], "--progress"))
|
|
Packit |
ae235b |
progress = report_progress;
|
|
Packit |
ae235b |
else
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
g_printerr ("unrecognised flag %s\n", argv[i]);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
if (!argv[i])
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
g_printerr ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
|
|
Packit |
ae235b |
#ifdef G_OS_WIN32
|
|
Packit |
ae235b |
g_strfreev (argv);
|
|
Packit |
ae235b |
#endif
|
|
Packit |
ae235b |
return 1;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
while (argv[i])
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GFile *file = g_file_new_for_commandline_arg (argv[i]);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
if (option_use_async)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
g_file_measure_disk_usage_async (file, flags, G_PRIORITY_DEFAULT, NULL,
|
|
Packit |
ae235b |
progress, argv[i], async_ready_func, argv[i]);
|
|
Packit |
ae235b |
outstanding_asyncs++;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
else
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GError *error = NULL;
|
|
Packit |
ae235b |
guint64 disk_usage;
|
|
Packit |
ae235b |
guint64 num_dirs;
|
|
Packit |
ae235b |
guint64 num_files;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_file_measure_disk_usage (file, flags, NULL, progress, argv[i],
|
|
Packit |
ae235b |
&disk_usage, &num_dirs, &num_files, &error);
|
|
Packit |
ae235b |
print_result (argv[i], disk_usage, num_dirs, num_files, error, '\n');
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_object_unref (file);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
i++;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
while (outstanding_asyncs)
|
|
Packit |
ae235b |
g_main_context_iteration (NULL, TRUE);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
#ifdef G_OS_WIN32
|
|
Packit |
ae235b |
g_strfreev (argv);
|
|
Packit |
ae235b |
#endif
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
return 0;
|
|
Packit |
ae235b |
}
|