(root)/
glib-2.79.0/
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  }