[kdbus] KDBUS_ITEM_PAYLOAD_OFF items are (once again) relative to msg header
[platform/upstream/glib.git] / gio / tests / gio-du.c
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 #ifdef G_OS_WIN32
10 typedef struct {
11   int newmode;
12 } _startupinfo;
13
14 #ifndef _MSC_VER
15
16 extern void __wgetmainargs(int *argc,
17                            wchar_t ***wargv,
18                            wchar_t ***wenviron,
19                            int expand_wildcards,
20                            _startupinfo *startupinfo);
21 #endif
22 #endif
23
24 static void
25 print_result (const gchar *filename,
26               guint64      disk_usage,
27               guint64      num_dirs,
28               guint64      num_files,
29               GError      *error,
30               gchar        nl)
31 {
32   if (!error)
33     {
34       if (option_format_size)
35         {
36           GFormatSizeFlags format_flags;
37           gchar *str;
38
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);
43           g_free (str);
44         }
45       else
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);
48     }
49   else
50     {
51       g_printerr ("%s: %s\n", filename, error->message);
52       g_error_free (error);
53     }
54 }
55
56 static void
57 async_ready_func (GObject      *source,
58                   GAsyncResult *result,
59                   gpointer      user_data)
60 {
61   gchar *filename = user_data;
62   GError *error = NULL;
63   guint64 disk_usage;
64   guint64 num_dirs;
65   guint64 num_files;
66
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');
69   outstanding_asyncs--;
70   g_free (filename);
71 }
72
73 static void
74 report_progress (gboolean reporting,
75                  guint64  disk_usage,
76                  guint64  num_dirs,
77                  guint64  num_files,
78                  gpointer user_data)
79 {
80   const gchar *filename = user_data;
81
82   if (!reporting)
83     g_printerr ("%s: warning: does not support progress reporting\n", filename);
84
85   print_result (filename, disk_usage, num_dirs, num_files, NULL, '\r');
86 }
87
88 int
89 main (int argc, char **argv)
90 {
91   GFileMeasureProgressCallback progress = NULL;
92   GFileMeasureFlags flags = 0;
93   gint i;
94 #ifdef G_OS_WIN32
95   int wargc;
96   wchar_t **wargv, **wenvp;
97   _startupinfo si = { 0 };
98
99   __wgetmainargs (&wargc, &wargv, &wenvp, 0, &si);
100 #endif
101
102   setlocale (LC_ALL, "");
103
104
105
106   for (i = 1; argv[i] && argv[i][0] == '-'; i++)
107     {
108       if (g_str_equal (argv[i], "--"))
109         break;
110
111       if (g_str_equal (argv[i], "--help"))
112         {
113           g_print ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
114           return 0;
115         }
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;
128       else
129         {
130           g_printerr ("unrecognised flag %s\n", argv[i]);
131         }
132     }
133
134   if (!argv[i])
135     {
136       g_printerr ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
137       return 1;
138     }
139
140 #ifdef G_OS_WIN32
141   while (wargv[i])
142   {
143     gchar *argv_utf8 = g_utf16_to_utf8 (wargv[i], -1, NULL, NULL, NULL);
144 #else
145   while (argv[i])
146   {
147     gchar *argv_utf8 = g_strdup (argv[i]);
148 #endif
149     GFile *file = g_file_new_for_commandline_arg (argv_utf8);
150
151     if (option_use_async)
152     {
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++;
156     }
157     else
158     {
159       GError *error = NULL;
160       guint64 disk_usage;
161       guint64 num_dirs;
162       guint64 num_files;
163
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');
167       g_free (argv_utf8);
168     }
169
170     g_object_unref (file);
171
172     i++;
173   }
174
175   while (outstanding_asyncs)
176     g_main_context_iteration (NULL, TRUE);
177
178   return 0;
179 }