/* * Copyright 2015 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see . * * Author: Matthias Clasen */ #include "config.h" #include #include #include #include #include #include #include #include "gio-tool.h" void print_error (const gchar *format, ...) { gchar *message; va_list args; va_start (args, format); message = g_strdup_vprintf (format, args); va_end (args); g_printerr ("gio: %s\n", message); g_free (message); } void print_file_error (GFile *file, const gchar *message) { gchar *uri; uri = g_file_get_uri (file); print_error ("%s: %s", uri, message); g_free (uri); } void show_help (GOptionContext *context, const char *message) { char *help; if (message) g_printerr ("gio: %s\n\n", message); help = g_option_context_get_help (context, TRUE, NULL); g_printerr ("%s", help); g_free (help); } const char * file_type_to_string (GFileType type) { switch (type) { case G_FILE_TYPE_UNKNOWN: return "unknown"; case G_FILE_TYPE_REGULAR: return "regular"; case G_FILE_TYPE_DIRECTORY: return "directory"; case G_FILE_TYPE_SYMBOLIC_LINK: return "symlink"; case G_FILE_TYPE_SPECIAL: return "special"; case G_FILE_TYPE_SHORTCUT: return "shortcut"; case G_FILE_TYPE_MOUNTABLE: return "mountable"; default: return "invalid type"; } } const char * attribute_type_to_string (GFileAttributeType type) { switch (type) { case G_FILE_ATTRIBUTE_TYPE_INVALID: return "invalid"; case G_FILE_ATTRIBUTE_TYPE_STRING: return "string"; case G_FILE_ATTRIBUTE_TYPE_BYTE_STRING: return "bytestring"; case G_FILE_ATTRIBUTE_TYPE_BOOLEAN: return "boolean"; case G_FILE_ATTRIBUTE_TYPE_UINT32: return "uint32"; case G_FILE_ATTRIBUTE_TYPE_INT32: return "int32"; case G_FILE_ATTRIBUTE_TYPE_UINT64: return "uint64"; case G_FILE_ATTRIBUTE_TYPE_INT64: return "int64"; case G_FILE_ATTRIBUTE_TYPE_OBJECT: return "object"; default: return "uknown type"; } } GFileAttributeType attribute_type_from_string (const char *str) { if (strcmp (str, "string") == 0) return G_FILE_ATTRIBUTE_TYPE_STRING; if (strcmp (str, "stringv") == 0) return G_FILE_ATTRIBUTE_TYPE_STRINGV; if (strcmp (str, "bytestring") == 0) return G_FILE_ATTRIBUTE_TYPE_BYTE_STRING; if (strcmp (str, "boolean") == 0) return G_FILE_ATTRIBUTE_TYPE_BOOLEAN; if (strcmp (str, "uint32") == 0) return G_FILE_ATTRIBUTE_TYPE_UINT32; if (strcmp (str, "int32") == 0) return G_FILE_ATTRIBUTE_TYPE_INT32; if (strcmp (str, "uint64") == 0) return G_FILE_ATTRIBUTE_TYPE_UINT64; if (strcmp (str, "int64") == 0) return G_FILE_ATTRIBUTE_TYPE_INT64; if (strcmp (str, "object") == 0) return G_FILE_ATTRIBUTE_TYPE_OBJECT; if (strcmp (str, "unset") == 0) return G_FILE_ATTRIBUTE_TYPE_INVALID; return -1; } char * attribute_flags_to_string (GFileAttributeInfoFlags flags) { GString *s; int i; gboolean first; struct { guint32 mask; char *descr; } flag_descr[] = { { G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE, N_("Copy with file") }, { G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED, N_("Keep with file when moved") } }; first = TRUE; s = g_string_new (""); for (i = 0; i < G_N_ELEMENTS (flag_descr); i++) { if (flags & flag_descr[i].mask) { if (!first) g_string_append (s, ", "); g_string_append (s, gettext (flag_descr[i].descr)); first = FALSE; } } return g_string_free (s, FALSE); } gboolean file_is_dir (GFile *file) { GFileInfo *info; gboolean res; info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, 0, NULL, NULL); res = info && g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY; if (info) g_object_unref (info); return res; } static int handle_version (int argc, char *argv[], gboolean do_help) { if (do_help || argc > 1) { if (!do_help) g_printerr ("gio: %s\n\n", _("“version” takes no arguments")); g_printerr ("%s\n", _("Usage:")); g_printerr (" gio version\n"); g_printerr ("\n"); g_printerr ("%s\n", _("Print version information and exit.")); return do_help ? 0 : 2; } g_print ("%d.%d.%d\n", glib_major_version, glib_minor_version, glib_micro_version); return 0; } static void usage (void) { g_printerr ("%s\n", _("Usage:")); g_printerr (" gio %s %s\n", _("COMMAND"), _("[ARGS...]")); g_printerr ("\n"); g_printerr ("%s\n", _("Commands:")); g_printerr (" help %s\n", _("Print help")); g_printerr (" version %s\n", _("Print version")); g_printerr (" cat %s\n", _("Concatenate files to standard output")); g_printerr (" copy %s\n", _("Copy one or more files")); g_printerr (" info %s\n", _("Show information about locations")); g_printerr (" list %s\n", _("List the contents of locations")); g_printerr (" mime %s\n", _("Get or set the handler for a mimetype")); g_printerr (" mkdir %s\n", _("Create directories")); g_printerr (" monitor %s\n", _("Monitor files and directories for changes")); g_printerr (" mount %s\n", _("Mount or unmount the locations")); g_printerr (" move %s\n", _("Move one or more files")); g_printerr (" open %s\n", _("Open files with the default application")); g_printerr (" rename %s\n", _("Rename a file")); g_printerr (" remove %s\n", _("Delete one or more files")); g_printerr (" save %s\n", _("Read from standard input and save")); g_printerr (" set %s\n", _("Set a file attribute")); g_printerr (" trash %s\n", _("Move files or directories to the trash")); g_printerr (" tree %s\n", _("Lists the contents of locations in a tree")); g_printerr ("\n"); g_printerr (_("Use %s to get detailed help.\n"), "“gio help COMMAND”"); exit (1); } int main (int argc, char **argv) { const char *command; gboolean do_help; setlocale (LC_ALL, ""); textdomain (GETTEXT_PACKAGE); bindtextdomain (GETTEXT_PACKAGE, GLIB_LOCALE_DIR); #ifdef HAVE_BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif if (argc < 2) { usage (); return 1; } command = argv[1]; argc -= 1; argv += 1; do_help = FALSE; if (g_str_equal (command, "help")) { if (argc == 1) { usage (); return 0; } else { command = argv[1]; do_help = TRUE; } } else if (g_str_equal (command, "--help")) { usage (); return 0; } else if (g_str_equal (command, "--version")) command = "version"; if (g_str_equal (command, "version")) return handle_version (argc, argv, do_help); else if (g_str_equal (command, "cat")) return handle_cat (argc, argv, do_help); else if (g_str_equal (command, "copy")) return handle_copy (argc, argv, do_help); else if (g_str_equal (command, "info")) return handle_info (argc, argv, do_help); else if (g_str_equal (command, "list")) return handle_list (argc, argv, do_help); else if (g_str_equal (command, "mime")) return handle_mime (argc, argv, do_help); else if (g_str_equal (command, "mkdir")) return handle_mkdir (argc, argv, do_help); else if (g_str_equal (command, "monitor")) return handle_monitor (argc, argv, do_help); else if (g_str_equal (command, "mount")) return handle_mount (argc, argv, do_help); else if (g_str_equal (command, "move")) return handle_move (argc, argv, do_help); else if (g_str_equal (command, "open")) return handle_open (argc, argv, do_help); else if (g_str_equal (command, "rename")) return handle_rename (argc, argv, do_help); else if (g_str_equal (command, "remove")) return handle_remove (argc, argv, do_help); else if (g_str_equal (command, "save")) return handle_save (argc, argv, do_help); else if (g_str_equal (command, "set")) return handle_set (argc, argv, do_help); else if (g_str_equal (command, "trash")) return handle_trash (argc, argv, do_help); else if (g_str_equal (command, "tree")) return handle_tree (argc, argv, do_help); else usage (); return 1; }