4 static gboolean option_use_async;
5 static gint option_format_size;
7 static gint outstanding_asyncs;
16 extern void __wgetmainargs(int *argc,
20 _startupinfo *startupinfo);
25 print_result (const gchar *filename,
34 if (option_format_size)
36 GFormatSizeFlags format_flags;
39 format_flags = (option_format_size > 1) ? G_FORMAT_SIZE_LONG_FORMAT : G_FORMAT_SIZE_DEFAULT;
40 str = g_format_size_full (disk_usage, format_flags);
41 g_print ("%s: %s (%"G_GUINT64_FORMAT" dirs, %"G_GUINT64_FORMAT" files)%c",
42 filename, str, num_dirs, num_files, nl);
46 g_print ("%s: %"G_GUINT64_FORMAT" (%"G_GUINT64_FORMAT" dirs, %"G_GUINT64_FORMAT" files)%c",
47 filename, disk_usage, num_dirs, num_files, nl);
51 g_printerr ("%s: %s\n", filename, error->message);
57 async_ready_func (GObject *source,
61 gchar *filename = user_data;
67 g_file_measure_disk_usage_finish (G_FILE (source), result, &disk_usage, &num_dirs, &num_files, &error);
68 print_result (filename, disk_usage, num_dirs, num_files, error, '\n');
74 report_progress (gboolean reporting,
80 const gchar *filename = user_data;
83 g_printerr ("%s: warning: does not support progress reporting\n", filename);
85 print_result (filename, disk_usage, num_dirs, num_files, NULL, '\r');
89 main (int argc, char **argv)
91 GFileMeasureProgressCallback progress = NULL;
92 GFileMeasureFlags flags = 0;
96 wchar_t **wargv, **wenvp;
97 _startupinfo si = { 0 };
99 __wgetmainargs (&wargc, &wargv, &wenvp, 0, &si);
102 setlocale (LC_ALL, "");
106 for (i = 1; argv[i] && argv[i][0] == '-'; i++)
108 if (g_str_equal (argv[i], "--"))
111 if (g_str_equal (argv[i], "--help"))
113 g_print ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
116 else if (g_str_equal (argv[i], "-x"))
117 flags |= G_FILE_MEASURE_NO_XDEV;
118 else if (g_str_equal (argv[i], "-h"))
119 option_format_size++;
120 else if (g_str_equal (argv[i], "--apparent-size"))
121 flags |= G_FILE_MEASURE_APPARENT_SIZE;
122 else if (g_str_equal (argv[i], "--any-error"))
123 flags |= G_FILE_MEASURE_REPORT_ANY_ERROR;
124 else if (g_str_equal (argv[i], "--async"))
125 option_use_async = TRUE;
126 else if (g_str_equal (argv[i], "--progress"))
127 progress = report_progress;
130 g_printerr ("unrecognised flag %s\n", argv[i]);
136 g_printerr ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
143 gchar *argv_utf8 = g_utf16_to_utf8 (wargv[i], -1, NULL, NULL, NULL);
147 gchar *argv_utf8 = g_strdup (argv[i]);
149 GFile *file = g_file_new_for_commandline_arg (argv_utf8);
151 if (option_use_async)
153 g_file_measure_disk_usage_async (file, flags, G_PRIORITY_DEFAULT, NULL,
154 progress, argv_utf8, async_ready_func, argv_utf8);
155 outstanding_asyncs++;
159 GError *error = NULL;
164 g_file_measure_disk_usage (file, flags, NULL, progress, argv_utf8,
165 &disk_usage, &num_dirs, &num_files, &error);
166 print_result (argv_utf8, disk_usage, num_dirs, num_files, error, '\n');
170 g_object_unref (file);
175 while (outstanding_asyncs)
176 g_main_context_iteration (NULL, TRUE);