summaryrefslogtreecommitdiff
path: root/src/nautilus-autorun-software.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nautilus-autorun-software.c')
-rw-r--r--src/nautilus-autorun-software.c523
1 files changed, 275 insertions, 248 deletions
diff --git a/src/nautilus-autorun-software.c b/src/nautilus-autorun-software.c
index cfe528eea..6195a3e74 100644
--- a/src/nautilus-autorun-software.c
+++ b/src/nautilus-autorun-software.c
@@ -1,24 +1,23 @@
-
/* Nautilus
-
- Copyright (C) 2008 Red Hat, Inc.
-
- The Gnome Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: David Zeuthen <davidz@redhat.com>
-*/
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * The Gnome Library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * The Gnome 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with the Gnome Library; see the file COPYING.LIB. If not,
+ * see <http://www.gnu.org/licenses/>.
+ *
+ * Author: David Zeuthen <davidz@redhat.com>
+ */
#include <config.h>
@@ -37,263 +36,291 @@
typedef struct
{
- GtkWidget *dialog;
- GMount *mount;
+ GtkWidget *dialog;
+ GMount *mount;
} AutorunSoftwareDialogData;
-static void autorun_software_dialog_mount_unmounted (GMount *mount, AutorunSoftwareDialogData *data);
+static void autorun_software_dialog_mount_unmounted (GMount *mount,
+ AutorunSoftwareDialogData *data);
static void
autorun_software_dialog_destroy (AutorunSoftwareDialogData *data)
{
- g_signal_handlers_disconnect_by_func (G_OBJECT (data->mount),
- G_CALLBACK (autorun_software_dialog_mount_unmounted),
- data);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (data->mount),
+ G_CALLBACK (autorun_software_dialog_mount_unmounted),
+ data);
- gtk_widget_destroy (GTK_WIDGET (data->dialog));
- g_object_unref (data->mount);
- g_free (data);
+ gtk_widget_destroy (GTK_WIDGET (data->dialog));
+ g_object_unref (data->mount);
+ g_free (data);
}
-static void
-autorun_software_dialog_mount_unmounted (GMount *mount, AutorunSoftwareDialogData *data)
+static void
+autorun_software_dialog_mount_unmounted (GMount *mount,
+ AutorunSoftwareDialogData *data)
{
- autorun_software_dialog_destroy (data);
+ autorun_software_dialog_destroy (data);
}
static gboolean
-_check_file (GFile *mount_root, const char *file_path, gboolean must_be_executable)
+_check_file (GFile *mount_root,
+ const char *file_path,
+ gboolean must_be_executable)
{
- GFile *file;
- GFileInfo *file_info;
- gboolean ret;
-
- ret = FALSE;
-
- file = g_file_get_child (mount_root, file_path);
- file_info = g_file_query_info (file,
- G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE,
- G_FILE_QUERY_INFO_NONE,
- NULL,
- NULL);
- if (file_info != NULL) {
- if (must_be_executable) {
- if (g_file_info_get_attribute_boolean (file_info, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE)) {
- ret = TRUE;
- }
- } else {
- ret = TRUE;
- }
- g_object_unref (file_info);
- }
- g_object_unref (file);
-
- return ret;
+ GFile *file;
+ GFileInfo *file_info;
+ gboolean ret;
+
+ ret = FALSE;
+
+ file = g_file_get_child (mount_root, file_path);
+ file_info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE,
+ G_FILE_QUERY_INFO_NONE,
+ NULL,
+ NULL);
+ if (file_info != NULL)
+ {
+ if (must_be_executable)
+ {
+ if (g_file_info_get_attribute_boolean (file_info, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE))
+ {
+ ret = TRUE;
+ }
+ }
+ else
+ {
+ ret = TRUE;
+ }
+ g_object_unref (file_info);
+ }
+ g_object_unref (file);
+
+ return ret;
}
static void
autorun (GMount *mount)
{
- char *error_string;
- GFile *root;
- GFile *program_to_spawn;
- GFile *program_parameter_file;
- char *path_to_spawn;
- char *cwd_for_program;
- char *program_parameter;
-
- root = g_mount_get_root (mount);
-
- /* Careful here, according to
- *
- * http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
- *
- * the ordering does matter.
- */
-
- program_to_spawn = NULL;
- path_to_spawn = NULL;
- program_parameter_file = NULL;
- program_parameter = NULL;
-
- if (_check_file (root, ".autorun", TRUE)) {
- program_to_spawn = g_file_get_child (root, ".autorun");
- } else if (_check_file (root, "autorun", TRUE)) {
- program_to_spawn = g_file_get_child (root, "autorun");
- } else if (_check_file (root, "autorun.sh", TRUE)) {
- program_to_spawn = g_file_new_for_path ("/bin/sh");
- program_parameter_file = g_file_get_child (root, "autorun.sh");
+ char *error_string;
+ GFile *root;
+ GFile *program_to_spawn;
+ GFile *program_parameter_file;
+ char *path_to_spawn;
+ char *cwd_for_program;
+ char *program_parameter;
+
+ root = g_mount_get_root (mount);
+
+ /* Careful here, according to
+ *
+ * http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
+ *
+ * the ordering does matter.
+ */
+
+ program_to_spawn = NULL;
+ path_to_spawn = NULL;
+ program_parameter_file = NULL;
+ program_parameter = NULL;
+
+ if (_check_file (root, ".autorun", TRUE))
+ {
+ program_to_spawn = g_file_get_child (root, ".autorun");
+ }
+ else if (_check_file (root, "autorun", TRUE))
+ {
+ program_to_spawn = g_file_get_child (root, "autorun");
+ }
+ else if (_check_file (root, "autorun.sh", TRUE))
+ {
+ program_to_spawn = g_file_new_for_path ("/bin/sh");
+ program_parameter_file = g_file_get_child (root, "autorun.sh");
+ }
+
+ if (program_to_spawn != NULL)
+ {
+ path_to_spawn = g_file_get_path (program_to_spawn);
+ }
+ if (program_parameter_file != NULL)
+ {
+ program_parameter = g_file_get_path (program_parameter_file);
+ }
+
+ cwd_for_program = g_file_get_path (root);
+
+ error_string = NULL;
+ if (path_to_spawn != NULL && cwd_for_program != NULL)
+ {
+ if (chdir (cwd_for_program) == 0)
+ {
+ execl (path_to_spawn, path_to_spawn, program_parameter, NULL);
+ error_string = g_strdup_printf (_("Unable to start the program:\n%s"), strerror (errno));
+ goto out;
}
-
- if (program_to_spawn != NULL) {
- path_to_spawn = g_file_get_path (program_to_spawn);
- }
- if (program_parameter_file != NULL) {
- program_parameter = g_file_get_path (program_parameter_file);
- }
-
- cwd_for_program = g_file_get_path (root);
-
- error_string = NULL;
- if (path_to_spawn != NULL && cwd_for_program != NULL) {
- if (chdir (cwd_for_program) == 0) {
- execl (path_to_spawn, path_to_spawn, program_parameter, NULL);
- error_string = g_strdup_printf (_("Unable to start the program:\n%s"), strerror (errno));
- goto out;
- }
- error_string = g_strdup_printf (_("Unable to start the program:\n%s"), strerror (errno));
- goto out;
- }
- error_string = g_strdup_printf (_("Unable to locate the program"));
+ error_string = g_strdup_printf (_("Unable to start the program:\n%s"), strerror (errno));
+ goto out;
+ }
+ error_string = g_strdup_printf (_("Unable to locate the program"));
out:
- if (program_to_spawn != NULL) {
- g_object_unref (program_to_spawn);
- }
- if (program_parameter_file != NULL) {
- g_object_unref (program_parameter_file);
- }
- if (root != NULL) {
- g_object_unref (root);
- }
- g_free (path_to_spawn);
- g_free (cwd_for_program);
- g_free (program_parameter);
-
- if (error_string != NULL) {
- GtkWidget *dialog;
- dialog = gtk_message_dialog_new_with_markup (NULL, /* TODO: parent window? */
- 0,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- _("Oops! There was a problem running this software."));
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", error_string);
- /* This is required because we don't show dialogs in the
- window picker and if the window pops under another window
- there is no way to get it back. */
- gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE);
-
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
- g_free (error_string);
- }
+ if (program_to_spawn != NULL)
+ {
+ g_object_unref (program_to_spawn);
+ }
+ if (program_parameter_file != NULL)
+ {
+ g_object_unref (program_parameter_file);
+ }
+ if (root != NULL)
+ {
+ g_object_unref (root);
+ }
+ g_free (path_to_spawn);
+ g_free (cwd_for_program);
+ g_free (program_parameter);
+
+ if (error_string != NULL)
+ {
+ GtkWidget *dialog;
+ dialog = gtk_message_dialog_new_with_markup (NULL, /* TODO: parent window? */
+ 0,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK,
+ _("Oops! There was a problem running this software."));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", error_string);
+ /* This is required because we don't show dialogs in the
+ * window picker and if the window pops under another window
+ * there is no way to get it back. */
+ gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE);
+
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ g_free (error_string);
+ }
}
static void
present_autorun_for_software_dialog (GMount *mount)
{
- GIcon *icon;
- int icon_size;
- NautilusIconInfo *icon_info;
- GdkPixbuf *pixbuf;
- char *mount_name;
- GtkWidget *dialog;
- AutorunSoftwareDialogData *data;
-
- mount_name = g_mount_get_name (mount);
-
- dialog = gtk_message_dialog_new (NULL, /* TODO: parent window? */
- 0,
- GTK_MESSAGE_OTHER,
- GTK_BUTTONS_CANCEL,
- _("ā€œ%sā€ contains software intended to be automatically started. Would you like to run it?"),
- mount_name);
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
- "%s",
- _("If you don't trust this location or aren't sure, press Cancel."));
-
- /* This is required because we don't show dialogs in the
- window picker and if the window pops under another window
- there is no way to get it back. */
- gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE);
-
- /* TODO: in a star trek future add support for verifying
- * software on media (e.g. if it has a certificate, check it
- * etc.)
- */
-
-
- icon = g_mount_get_icon (mount);
- icon_size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_DIALOG);
- icon_info = nautilus_icon_info_lookup (icon, icon_size,
- gtk_widget_get_scale_factor (GTK_WIDGET (dialog)));
- pixbuf = nautilus_icon_info_get_pixbuf_at_size (icon_info, icon_size);
-
- gtk_window_set_icon (GTK_WINDOW (dialog), pixbuf);
-
- data = g_new0 (AutorunSoftwareDialogData, 1);
- data->dialog = dialog;
- data->mount = g_object_ref (mount);
-
- g_signal_connect (G_OBJECT (mount),
- "unmounted",
- G_CALLBACK (autorun_software_dialog_mount_unmounted),
- data);
-
- gtk_dialog_add_button (GTK_DIALOG (dialog),
- _("_Run"),
- GTK_RESPONSE_OK);
-
- gtk_widget_show_all (dialog);
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
- gtk_widget_destroy (dialog);
- autorun (mount);
- }
-
- g_object_unref (icon_info);
- g_object_unref (pixbuf);
- g_free (mount_name);
+ GIcon *icon;
+ int icon_size;
+ NautilusIconInfo *icon_info;
+ GdkPixbuf *pixbuf;
+ char *mount_name;
+ GtkWidget *dialog;
+ AutorunSoftwareDialogData *data;
+
+ mount_name = g_mount_get_name (mount);
+
+ dialog = gtk_message_dialog_new (NULL, /* TODO: parent window? */
+ 0,
+ GTK_MESSAGE_OTHER,
+ GTK_BUTTONS_CANCEL,
+ _("ā€œ%sā€ contains software intended to be automatically started. Would you like to run it?"),
+ mount_name);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s",
+ _("If you don't trust this location or aren't sure, press Cancel."));
+
+ /* This is required because we don't show dialogs in the
+ * window picker and if the window pops under another window
+ * there is no way to get it back. */
+ gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE);
+
+ /* TODO: in a star trek future add support for verifying
+ * software on media (e.g. if it has a certificate, check it
+ * etc.)
+ */
+
+
+ icon = g_mount_get_icon (mount);
+ icon_size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_DIALOG);
+ icon_info = nautilus_icon_info_lookup (icon, icon_size,
+ gtk_widget_get_scale_factor (GTK_WIDGET (dialog)));
+ pixbuf = nautilus_icon_info_get_pixbuf_at_size (icon_info, icon_size);
+
+ gtk_window_set_icon (GTK_WINDOW (dialog), pixbuf);
+
+ data = g_new0 (AutorunSoftwareDialogData, 1);
+ data->dialog = dialog;
+ data->mount = g_object_ref (mount);
+
+ g_signal_connect (G_OBJECT (mount),
+ "unmounted",
+ G_CALLBACK (autorun_software_dialog_mount_unmounted),
+ data);
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ _("_Run"),
+ GTK_RESPONSE_OK);
+
+ gtk_widget_show_all (dialog);
+
+ if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
+ {
+ gtk_widget_destroy (dialog);
+ autorun (mount);
+ }
+
+ g_object_unref (icon_info);
+ g_object_unref (pixbuf);
+ g_free (mount_name);
}
int
-main (int argc, char *argv[])
+main (int argc,
+ char *argv[])
{
- GVolumeMonitor *monitor;
- GFile *file;
- GMount *mount;
- GError *error;
-
- bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
- textdomain (GETTEXT_PACKAGE);
-
- gtk_init (&argc, &argv);
-
- if (argc != 2) {
- g_print ("Usage: %s mount-uri\n", argv[0]);
- goto out;
- }
-
- /* instantiate monitor so we get the "unmounted" signal properly */
- monitor = g_volume_monitor_get ();
- if (monitor == NULL) {
- g_warning ("Unable to connect to the volume monitor");
- goto out;
- }
-
- file = g_file_new_for_commandline_arg (argv[1]);
- if (file == NULL) {
- g_object_unref (monitor);
- g_warning ("Unable to parse mount URI");
- goto out;
- }
-
- error = NULL;
- mount = g_file_find_enclosing_mount (file, NULL, &error);
- if (mount == NULL) {
- g_warning ("Unable to find device for URI: %s", error->message);
- g_clear_error (&error);
- g_object_unref (file);
- g_object_unref (monitor);
- goto out;
- }
-
- present_autorun_for_software_dialog (mount);
- g_object_unref (file);
- g_object_unref (monitor);
- g_object_unref (mount);
-
-out:
- return 0;
+ GVolumeMonitor *monitor;
+ GFile *file;
+ GMount *mount;
+ GError *error;
+
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+
+ gtk_init (&argc, &argv);
+
+ if (argc != 2)
+ {
+ g_print ("Usage: %s mount-uri\n", argv[0]);
+ goto out;
+ }
+
+ /* instantiate monitor so we get the "unmounted" signal properly */
+ monitor = g_volume_monitor_get ();
+ if (monitor == NULL)
+ {
+ g_warning ("Unable to connect to the volume monitor");
+ goto out;
+ }
+
+ file = g_file_new_for_commandline_arg (argv[1]);
+ if (file == NULL)
+ {
+ g_object_unref (monitor);
+ g_warning ("Unable to parse mount URI");
+ goto out;
+ }
+
+ error = NULL;
+ mount = g_file_find_enclosing_mount (file, NULL, &error);
+ if (mount == NULL)
+ {
+ g_warning ("Unable to find device for URI: %s", error->message);
+ g_clear_error (&error);
+ g_object_unref (file);
+ g_object_unref (monitor);
+ goto out;
+ }
+
+ present_autorun_for_software_dialog (mount);
+ g_object_unref (file);
+ g_object_unref (monitor);
+ g_object_unref (mount);
+
+out:
+ return 0;
}