Branch data Line data Source code
1 : : /*
2 : : * Copyright 2015 Red Hat, Inc.
3 : : *
4 : : * SPDX-License-Identifier: LGPL-2.1-or-later
5 : : *
6 : : * This library is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU Lesser General Public
8 : : * License as published by the Free Software Foundation; either
9 : : * version 2.1 of the License, or (at your option) any later version.
10 : : *
11 : : * This library is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : : * Lesser General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU Lesser General Public
17 : : * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 : : *
19 : : * Author: Matthias Clasen <mclasen@redhat.com>
20 : : */
21 : :
22 : : #include "config.h"
23 : :
24 : : #include <gio/gio.h>
25 : : #include <gi18n.h>
26 : :
27 : : #include "gio-tool.h"
28 : :
29 : : static char *global_attributes = NULL;
30 : : static gboolean show_hidden = FALSE;
31 : : static gboolean show_long = FALSE;
32 : : static gboolean nofollow_symlinks = FALSE;
33 : : static gboolean print_display_names = FALSE;
34 : : static gboolean print_uris = FALSE;
35 : :
36 : : static const GOptionEntry entries[] = {
37 : : { "attributes", 'a', 0, G_OPTION_ARG_STRING, &global_attributes, N_("The attributes to get"), N_("ATTRIBUTES") },
38 : : { "hidden", 'h', 0, G_OPTION_ARG_NONE, &show_hidden, N_("Show hidden files"), NULL },
39 : : { "long", 'l', 0, G_OPTION_ARG_NONE, &show_long, N_("Use a long listing format"), NULL },
40 : : { "nofollow-symlinks", 'n', 0, G_OPTION_ARG_NONE, &nofollow_symlinks, N_("Don’t follow symbolic links"), NULL},
41 : : { "print-display-names", 'd', 0, G_OPTION_ARG_NONE, &print_display_names, N_("Print display names"), NULL },
42 : : { "print-uris", 'u', 0, G_OPTION_ARG_NONE, &print_uris, N_("Print full URIs"), NULL},
43 : : G_OPTION_ENTRY_NULL
44 : : };
45 : :
46 : : static void
47 : 0 : show_file_listing (GFileInfo *info, GFile *parent)
48 : : {
49 : : const char *name, *type;
50 : 0 : char *uri = NULL;
51 : : goffset size;
52 : : char **attributes;
53 : : int i;
54 : : gboolean first_attr;
55 : : GFile *child;
56 : :
57 : 0 : if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN) &&
58 : 0 : g_file_info_get_is_hidden (info) &&
59 : 0 : !show_hidden)
60 : 0 : return;
61 : :
62 : 0 : if (print_display_names && g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME))
63 : 0 : name = g_file_info_get_display_name (info);
64 : : else
65 : 0 : name = g_file_info_get_name (info);
66 : :
67 : 0 : if (name == NULL)
68 : 0 : name = "";
69 : :
70 : 0 : if (print_uris) {
71 : 0 : child = g_file_get_child (parent, name);
72 : 0 : uri = g_file_get_uri (child);
73 : 0 : g_object_unref (child);
74 : : }
75 : :
76 : 0 : size = g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE) ?
77 : 0 : g_file_info_get_size (info) : 0;
78 : 0 : type = file_type_to_string (g_file_info_get_file_type (info));
79 : 0 : if (show_long)
80 : 0 : g_print ("%s\t%"G_GUINT64_FORMAT"\t(%s)", print_uris? uri: name, (guint64)size, type);
81 : : else
82 : 0 : g_print ("%s", print_uris? uri: name);
83 : :
84 : 0 : if (print_uris)
85 : 0 : g_free (uri);
86 : :
87 : 0 : first_attr = TRUE;
88 : 0 : attributes = g_file_info_list_attributes (info, NULL);
89 : 0 : for (i = 0 ; attributes[i] != NULL; i++)
90 : : {
91 : : char *val_as_string;
92 : :
93 : 0 : if (!show_long ||
94 : 0 : (!print_display_names && strcmp (attributes[i], G_FILE_ATTRIBUTE_STANDARD_NAME) == 0) ||
95 : 0 : (print_display_names && strcmp (attributes[i], G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME) == 0) ||
96 : 0 : strcmp (attributes[i], G_FILE_ATTRIBUTE_STANDARD_SIZE) == 0 ||
97 : 0 : strcmp (attributes[i], G_FILE_ATTRIBUTE_STANDARD_TYPE) == 0 ||
98 : 0 : strcmp (attributes[i], G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN) == 0)
99 : 0 : continue;
100 : :
101 : 0 : if (first_attr)
102 : : {
103 : 0 : g_print ("\t");
104 : 0 : first_attr = FALSE;
105 : : }
106 : : else
107 : 0 : g_print (" ");
108 : 0 : val_as_string = g_file_info_get_attribute_as_string (info, attributes[i]);
109 : 0 : g_print ("%s=%s", attributes[i], val_as_string);
110 : 0 : g_free (val_as_string);
111 : : }
112 : :
113 : 0 : g_strfreev (attributes);
114 : :
115 : 0 : g_print ("\n");
116 : : }
117 : :
118 : : static gboolean
119 : 0 : list (GFile *file)
120 : : {
121 : : GFileEnumerator *enumerator;
122 : : GFileInfo *info;
123 : : GError *error;
124 : : gboolean res;
125 : :
126 : 0 : error = NULL;
127 : 0 : enumerator = g_file_enumerate_children (file,
128 : : global_attributes,
129 : : nofollow_symlinks ? G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS : 0,
130 : : NULL,
131 : : &error);
132 : 0 : if (enumerator == NULL)
133 : : {
134 : 0 : print_file_error (file, error->message);
135 : 0 : g_error_free (error);
136 : 0 : return FALSE;
137 : : }
138 : :
139 : 0 : res = TRUE;
140 : 0 : while ((info = g_file_enumerator_next_file (enumerator, NULL, &error)) != NULL)
141 : : {
142 : 0 : show_file_listing (info, file);
143 : 0 : g_object_unref (info);
144 : : }
145 : :
146 : 0 : if (error)
147 : : {
148 : 0 : print_file_error (file, error->message);
149 : 0 : g_clear_error (&error);
150 : 0 : res = FALSE;
151 : : }
152 : :
153 : 0 : if (!g_file_enumerator_close (enumerator, NULL, &error))
154 : : {
155 : 0 : print_file_error (file, error->message);
156 : 0 : g_clear_error (&error);
157 : 0 : res = FALSE;
158 : : }
159 : :
160 : 0 : g_object_unref (enumerator);
161 : :
162 : 0 : return res;
163 : : }
164 : :
165 : : int
166 : 0 : handle_list (int argc, char *argv[], gboolean do_help)
167 : : {
168 : : GOptionContext *context;
169 : : gchar *param;
170 : 0 : GError *error = NULL;
171 : : gboolean res;
172 : : gint i;
173 : : GFile *file;
174 : :
175 : 0 : g_set_prgname ("gio list");
176 : :
177 : : /* Translators: commandline placeholder */
178 : 0 : param = g_strdup_printf ("[%s…]", _("LOCATION"));
179 : 0 : context = g_option_context_new (param);
180 : 0 : g_free (param);
181 : 0 : g_option_context_set_help_enabled (context, FALSE);
182 : 0 : g_option_context_set_summary (context,
183 : 0 : _("List the contents of the locations."));
184 : 0 : g_option_context_set_description (context,
185 : 0 : _("gio list is similar to the traditional ls utility, but using GIO\n"
186 : : "locations instead of local files: for example, you can use something\n"
187 : : "like smb://server/resource/file.txt as location. File attributes can\n"
188 : : "be specified with their GIO name, e.g. standard::icon"));
189 : 0 : g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
190 : :
191 : 0 : if (do_help)
192 : : {
193 : 0 : show_help (context, NULL);
194 : 0 : g_option_context_free (context);
195 : 0 : return 0;
196 : : }
197 : :
198 : 0 : if (!g_option_context_parse (context, &argc, &argv, &error))
199 : : {
200 : 0 : show_help (context, error->message);
201 : 0 : g_error_free (error);
202 : 0 : g_option_context_free (context);
203 : 0 : return 1;
204 : : }
205 : :
206 : 0 : g_option_context_free (context);
207 : :
208 : 0 : if (global_attributes != NULL)
209 : 0 : show_long = TRUE;
210 : :
211 : 0 : global_attributes = g_strconcat (!print_display_names ? G_FILE_ATTRIBUTE_STANDARD_NAME "," : "",
212 : 0 : print_display_names ? G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME "," : "",
213 : : G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_STANDARD_SIZE "," G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN,
214 : 0 : global_attributes != NULL ? "," : "",
215 : : global_attributes,
216 : : NULL);
217 : :
218 : 0 : res = TRUE;
219 : 0 : if (argc > 1)
220 : : {
221 : 0 : for (i = 1; i < argc; i++)
222 : : {
223 : 0 : file = g_file_new_for_commandline_arg (argv[i]);
224 : 0 : res &= list (file);
225 : 0 : g_object_unref (file);
226 : : }
227 : : }
228 : : else
229 : : {
230 : : char *cwd;
231 : :
232 : 0 : cwd = g_get_current_dir ();
233 : 0 : file = g_file_new_for_path (cwd);
234 : 0 : res = list (file);
235 : 0 : g_object_unref (file);
236 : 0 : g_free (cwd);
237 : : }
238 : :
239 : 0 : g_free (global_attributes);
240 : :
241 : 0 : return res ? 0 : 2;
242 : : }
|