gio/tests/gio-du.c: Avoid Using Unintialized Variable
[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   const 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 }
56
57 static void
58 report_progress (gboolean reporting,
59                  guint64  disk_usage,
60                  guint64  num_dirs,
61                  guint64  num_files,
62                  gpointer user_data)
63 {
64   const gchar *filename = user_data;
65
66   if (!reporting)
67     g_printerr ("%s: warning: does not support progress reporting\n", filename);
68
69   print_result (filename, disk_usage, num_dirs, num_files, NULL, '\r');
70 }
71
72 int
73 main (int argc, char **argv)
74 {
75   GFileMeasureProgressCallback progress = NULL;
76   GFileMeasureFlags flags = 0;
77   gint i;
78
79   setlocale (LC_ALL, "");
80
81   for (i = 1; argv[i] && argv[i][0] == '-'; i++)
82     {
83       if (g_str_equal (argv[i], "--"))
84         break;
85
86       if (g_str_equal (argv[i], "--help"))
87         {
88           g_print ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
89           return 0;
90         }
91       else if (g_str_equal (argv[i], "-x"))
92         flags |= G_FILE_MEASURE_NO_XDEV;
93       else if (g_str_equal (argv[i], "-h"))
94         option_format_size++;
95       else if (g_str_equal (argv[i], "--apparent-size"))
96         flags |= G_FILE_MEASURE_APPARENT_SIZE;
97       else if (g_str_equal (argv[i], "--any-error"))
98         flags |= G_FILE_MEASURE_REPORT_ANY_ERROR;
99       else if (g_str_equal (argv[i], "--async"))
100         option_use_async = TRUE;
101       else if (g_str_equal (argv[i], "--progress"))
102         progress = report_progress;
103       else
104         {
105           g_printerr ("unrecognised flag %s\n", argv[i]);
106         }
107     }
108
109   if (!argv[i])
110     {
111       g_printerr ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
112       return 1;
113     }
114
115   while (argv[i])
116     {
117       GFile *file = g_file_new_for_commandline_arg (argv[i]);
118
119       if (option_use_async)
120         {
121           g_file_measure_disk_usage_async (file, flags, G_PRIORITY_DEFAULT, NULL,
122                                            progress, argv[1], async_ready_func, argv[i]);
123           outstanding_asyncs++;
124         }
125       else
126         {
127           GError *error = NULL;
128           guint64 disk_usage;
129           guint64 num_dirs;
130           guint64 num_files;
131
132           g_file_measure_disk_usage (file, flags, NULL, progress, argv[1],
133                                      &disk_usage, &num_dirs, &num_files, &error);
134           print_result (argv[i], disk_usage, num_dirs, num_files, error, '\n');
135         }
136
137       g_object_unref (file);
138
139       i++;
140     }
141
142   while (outstanding_asyncs)
143     g_main_context_iteration (NULL, TRUE);
144
145   return 0;
146 }