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