Branch data Line data Source code
1 : : #include <gio/gio.h>
2 : : #include <locale.h>
3 : :
4 : : static gboolean option_use_async;
5 : : static gint option_format_size;
6 : :
7 : : static gint outstanding_asyncs;
8 : :
9 : : static void
10 : 0 : print_result (const gchar *filename,
11 : : guint64 disk_usage,
12 : : guint64 num_dirs,
13 : : guint64 num_files,
14 : : GError *error,
15 : : gchar nl)
16 : : {
17 : 0 : if (!error)
18 : : {
19 : 0 : if (option_format_size)
20 : : {
21 : : GFormatSizeFlags format_flags;
22 : : gchar *str;
23 : :
24 : 0 : format_flags = (option_format_size > 1) ? G_FORMAT_SIZE_LONG_FORMAT : G_FORMAT_SIZE_DEFAULT;
25 : 0 : str = g_format_size_full (disk_usage, format_flags);
26 : 0 : g_print ("%s: %s (%"G_GUINT64_FORMAT" dirs, %"G_GUINT64_FORMAT" files)%c",
27 : : filename, str, num_dirs, num_files, nl);
28 : 0 : g_free (str);
29 : : }
30 : : else
31 : 0 : g_print ("%s: %"G_GUINT64_FORMAT" (%"G_GUINT64_FORMAT" dirs, %"G_GUINT64_FORMAT" files)%c",
32 : : filename, disk_usage, num_dirs, num_files, nl);
33 : : }
34 : : else
35 : : {
36 : 0 : g_printerr ("%s: %s\n", filename, error->message);
37 : 0 : g_error_free (error);
38 : : }
39 : 0 : }
40 : :
41 : : static void
42 : 0 : async_ready_func (GObject *source,
43 : : GAsyncResult *result,
44 : : gpointer user_data)
45 : : {
46 : 0 : gchar *filename = user_data;
47 : 0 : GError *error = NULL;
48 : : guint64 disk_usage;
49 : : guint64 num_dirs;
50 : : guint64 num_files;
51 : :
52 : 0 : g_file_measure_disk_usage_finish (G_FILE (source), result, &disk_usage, &num_dirs, &num_files, &error);
53 : 0 : print_result (filename, disk_usage, num_dirs, num_files, error, '\n');
54 : 0 : outstanding_asyncs--;
55 : 0 : g_free (filename);
56 : 0 : }
57 : :
58 : : static void
59 : 0 : report_progress (gboolean reporting,
60 : : guint64 disk_usage,
61 : : guint64 num_dirs,
62 : : guint64 num_files,
63 : : gpointer user_data)
64 : : {
65 : 0 : const gchar *filename = user_data;
66 : :
67 : 0 : if (!reporting)
68 : 0 : g_printerr ("%s: warning: does not support progress reporting\n", filename);
69 : :
70 : 0 : print_result (filename, disk_usage, num_dirs, num_files, NULL, '\r');
71 : 0 : }
72 : :
73 : : int
74 : 0 : main (int argc, char **argv)
75 : : {
76 : 0 : GFileMeasureProgressCallback progress = NULL;
77 : 0 : GFileMeasureFlags flags = 0;
78 : : gint i;
79 : :
80 : : #ifdef G_OS_WIN32
81 : : argv = g_win32_get_command_line ();
82 : : #endif
83 : :
84 : 0 : setlocale (LC_ALL, "");
85 : :
86 : :
87 : :
88 : 0 : for (i = 1; argv[i] && argv[i][0] == '-'; i++)
89 : : {
90 : 0 : if (g_str_equal (argv[i], "--"))
91 : 0 : break;
92 : :
93 : 0 : if (g_str_equal (argv[i], "--help"))
94 : : {
95 : 0 : g_print ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
96 : : #ifdef G_OS_WIN32
97 : : g_strfreev (argv);
98 : : #endif
99 : 0 : return 0;
100 : : }
101 : 0 : else if (g_str_equal (argv[i], "-x"))
102 : 0 : flags |= G_FILE_MEASURE_NO_XDEV;
103 : 0 : else if (g_str_equal (argv[i], "-h"))
104 : 0 : option_format_size++;
105 : 0 : else if (g_str_equal (argv[i], "--apparent-size"))
106 : 0 : flags |= G_FILE_MEASURE_APPARENT_SIZE;
107 : 0 : else if (g_str_equal (argv[i], "--any-error"))
108 : 0 : flags |= G_FILE_MEASURE_REPORT_ANY_ERROR;
109 : 0 : else if (g_str_equal (argv[i], "--async"))
110 : 0 : option_use_async = TRUE;
111 : 0 : else if (g_str_equal (argv[i], "--progress"))
112 : 0 : progress = report_progress;
113 : : else
114 : : {
115 : 0 : g_printerr ("unrecognized flag %s\n", argv[i]);
116 : : }
117 : : }
118 : :
119 : 0 : if (!argv[i])
120 : : {
121 : 0 : g_printerr ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
122 : : #ifdef G_OS_WIN32
123 : : g_strfreev (argv);
124 : : #endif
125 : 0 : return 1;
126 : : }
127 : :
128 : 0 : while (argv[i])
129 : : {
130 : 0 : GFile *file = g_file_new_for_commandline_arg (argv[i]);
131 : :
132 : 0 : if (option_use_async)
133 : : {
134 : 0 : g_file_measure_disk_usage_async (file, flags, G_PRIORITY_DEFAULT, NULL,
135 : 0 : progress, argv[i], async_ready_func, argv[i]);
136 : 0 : outstanding_asyncs++;
137 : : }
138 : : else
139 : : {
140 : 0 : GError *error = NULL;
141 : : guint64 disk_usage;
142 : : guint64 num_dirs;
143 : : guint64 num_files;
144 : :
145 : 0 : g_file_measure_disk_usage (file, flags, NULL, progress, argv[i],
146 : : &disk_usage, &num_dirs, &num_files, &error);
147 : 0 : print_result (argv[i], disk_usage, num_dirs, num_files, error, '\n');
148 : : }
149 : :
150 : 0 : g_object_unref (file);
151 : :
152 : 0 : i++;
153 : : }
154 : :
155 : 0 : while (outstanding_asyncs)
156 : 0 : g_main_context_iteration (NULL, TRUE);
157 : :
158 : : #ifdef G_OS_WIN32
159 : : g_strfreev (argv);
160 : : #endif
161 : :
162 : 0 : return 0;
163 : : }
|