Updating branch refs/heads/master
         to 18a314fcfdb8e1bbf9d50f68e21db73279614aaa (commit)
       from 6bc2c0daa7f9e7e113a860e602f8d95b03c9a794 (commit)

commit 18a314fcfdb8e1bbf9d50f68e21db73279614aaa
Author: Landry Breuil <lan...@xfce.org>
Date:   Thu Apr 12 11:11:01 2012 +0200

    Rewrite disk_mount/umount
    
    - use g_spawn_command_line_sync()
    - separate commands instead of running them in a single shell
    - error out early if any of the commands fail
    - better error reporting, showing command return code & stderr
    - add hack to make eject -t work on OpenBSD
    - sanitize string handling
    - show confirmation/error message dialog directly from disk_umount
    - two new strings: "Returned" and "error was"

 panel-plugin/devices.c      |  165 ++++++++++++++++++++++++------------------
 panel-plugin/devices.h      |    6 +-
 panel-plugin/mount-plugin.c |   35 +---------
 3 files changed, 97 insertions(+), 109 deletions(-)

diff --git a/panel-plugin/devices.c b/panel-plugin/devices.c
index 5b89689..7a11692 100644
--- a/panel-plugin/devices.c
+++ b/panel-plugin/devices.c
@@ -29,6 +29,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #include <glib.h>
 #include <stdio.h>
 #include <string.h>
+/* WEXITSTATUS */
+#include <sys/types.h>
+#include <sys/wait.h>
 #ifdef HAVE_GETMNTENT
 #include <mntent.h>
 #include <sys/vfs.h>
@@ -235,50 +238,69 @@ disk_free(t_disk **pdisk)
 void
 disk_mount (t_disk *pdisk, char *on_mount_cmd, char* mount_command, gboolean 
eject, gboolean use_sudo)
 {
-    gchar *tmp=NULL, *cmd, *tmp2 = NULL;
+    gchar *tmp = NULL, *cmd = NULL;
+    gchar *output = NULL, *erroutput = NULL;
+    int exit_status = 0;
     GError *error = NULL;
     gboolean val;
 
-    DBG("disk_mount: eject=%d, use_sudo=%d\n", eject, use_sudo);
-
     if (pdisk != NULL)
     {
+        DBG("disk_mount: dev=%s, mountpoint=%s, mount_command=%s, 
on_mount_cmd=%s, eject=%d, use_sudo=%d", pdisk->device, pdisk->mount_point, 
mount_command, on_mount_cmd, eject, use_sudo);
+        if (eject) {
+#ifdef __OpenBSD__
+/* hack: on OpenBSD, eject(1) -t expects cd0/cd1 (or rcd0c/rcd1c), if passed 
/dev/cdXa it will spit 'No medium found' */
+            tmp = g_strstr_len(pdisk->device, strlen(pdisk->device), 
"/dev/cd");
+            if (tmp) {
+                cmd = g_strconcat ("eject -t cd", tmp + 7, NULL);
+                /* remove chars after cdX */
+                cmd[12] = '\0';
+                tmp = NULL;
+            }
+            else
+                cmd = g_strconcat ("eject -t ", pdisk->device, NULL);
+#else
+            cmd = g_strconcat ("eject -t ", pdisk->device, NULL);
+#endif
+            val = g_spawn_command_line_sync (cmd, &output, &erroutput, 
&exit_status, &error);
+            DBG("cmd: '%s', returned %d, exit_status=%d", cmd, val, 
exit_status);
+            if (val == FALSE || exit_status != 0)
+               goto out;
+            g_free(cmd);
+            cmd = NULL;
+        }
         deviceprintf (&tmp, mount_command, pdisk->device);
-        mountpointprintf (&tmp2, tmp, pdisk->mount_point);
-        /* re-use tmp */
-        g_free(tmp);
-        tmp = NULL;
-        if (use_sudo)
-            tmp = g_strdup ("sudo sh -c '");
-        else
-            tmp = g_strdup ("sh -c '");
-
-        if (eject)
-            cmd = g_strconcat (tmp, " eject -t ", pdisk->device, " && ", tmp2, 
NULL);
-        else
-            cmd = g_strconcat (tmp, tmp2, NULL);
-
-        g_free(tmp);
-        g_free(tmp2);
-        tmp = NULL;
-        tmp2 = NULL;
+        mountpointprintf (&cmd, tmp, pdisk->mount_point);
+        /* cmd contains mount_command device mount_point */
+        if (use_sudo) {
+            g_free(tmp);
+            tmp = g_strdup(cmd);
+            g_free(cmd);
+            cmd = g_strconcat ("sudo ", tmp, NULL);
+        }
+        val = g_spawn_command_line_sync (cmd, &output, &erroutput, 
&exit_status, &error);
+        DBG("cmd: '%s', returned %d, exit_status=%d", cmd, val, exit_status);
+        if (val == FALSE || exit_status != 0)
+           goto out;
 
         if (on_mount_cmd != NULL && strlen(on_mount_cmd)!=0) {
+            g_free(tmp);
+            tmp = NULL;
+            g_free(cmd);
+            cmd = NULL;
             deviceprintf(&tmp, on_mount_cmd, pdisk->device);
-            mountpointprintf(&tmp2, tmp, pdisk->mount_point);
-            cmd = g_strconcat (cmd, " && ", tmp2, " '", NULL);
+            mountpointprintf(&cmd, tmp, pdisk->mount_point);
+            val = g_spawn_command_line_sync (cmd, &output, &erroutput, 
&exit_status, &error);
+            DBG("cmd: '%s', returned %d, exit_status=%d", cmd, val, 
exit_status);
         }
-        else
-            cmd = g_strconcat (cmd, " '", NULL);
-
-        val = xfce_spawn_command_line_on_screen(gdk_screen_get_default(), cmd, 
FALSE, FALSE, &error);
-        DBG("cmd: '%s', returned %d \n", cmd, val);
-        if (val)
-            xfce_dialog_show_error (NULL, error, _("Mount Plugin: Error 
executing command."));
-
+out:
         g_free(cmd);
-        g_free(tmp);
-        g_free(tmp2);
+        if (tmp)
+            g_free(tmp);
+        /* show error message if smth failed */
+        if (val == FALSE || exit_status != 0)
+            xfce_dialog_show_error (NULL, error, "%s %s %d, %s %s", _("Mount 
Plugin: Error executing command."),
+                _("Returned"), WEXITSTATUS(exit_status), _("error was"), 
erroutput);
     }
 }
 
@@ -286,54 +308,55 @@ disk_mount (t_disk *pdisk, char *on_mount_cmd, char* 
mount_command, gboolean eje
 /**
  * Return exit status of the umount command.
  */
-int
-disk_umount (t_disk *pdisk, char* umount_command, gboolean synchronous, 
gboolean eject, gboolean use_sudo)
+void
+disk_umount (t_disk *pdisk, char* umount_command, gboolean 
show_message_dialog, gboolean eject, gboolean use_sudo)
 {
-    int retval = NONE;
-    gchar *tmp = NULL, *tmp2 = NULL;
-    gboolean val;
-    char *cmd;
+    gchar *tmp = NULL, *cmd = NULL;
+    gchar *output = NULL, *erroutput = NULL;
+    int exit_status = 0;
     GError *error = NULL;
-
-    DBG("disk_umount: eject=%d, use_sudo=%d\n", eject, use_sudo);
-
+    gboolean val;
 
     if (pdisk != NULL)
     {
 
+        DBG("disk_umount: dev=%s, mountpoint=%s, umount_command=%s, 
show_message_dialog=%d, eject=%d, use_sudo=%d", pdisk->device, 
pdisk->mount_point, umount_command, show_message_dialog, eject, use_sudo);
         deviceprintf(&tmp, umount_command, pdisk->device);
-        mountpointprintf(&tmp2, tmp, pdisk->mount_point);
-        if (use_sudo)
-            cmd = g_strconcat ("sudo sh -c '", tmp2, NULL);
-        else
-            cmd = g_strconcat ("sh -c '", tmp2, NULL);
-
-        /* re-use tmp */
-        g_free(tmp);
-        tmp = NULL;
-
-        if (eject)
-            tmp = g_strconcat (cmd, " && eject ", pdisk->device, " '", NULL);
-        else
-            tmp = g_strconcat (cmd, " '", NULL);
-
-        val = xfce_spawn_command_line_on_screen(gdk_screen_get_default(), tmp, 
FALSE, FALSE, &error);
-        DBG("cmd: '%s', returned %d \n", tmp, val);
-
-        if  (val) {
-            xfce_dialog_show_error (NULL, error, _("Mount Plugin: Error 
executing command."));
-            retval = ERROR;
+        mountpointprintf(&cmd, tmp, pdisk->mount_point);
+        /* cmd contains umount_command device mount_point */
+        if (use_sudo) {
+            g_free(tmp);
+            tmp = g_strdup(cmd);
+            g_free(cmd);
+            cmd = g_strconcat ("sudo ", tmp, NULL);
+        }
+        val = g_spawn_command_line_sync (cmd, &output, &erroutput, 
&exit_status, &error);
+        DBG("cmd: '%s', returned %d, exit_status=%d", cmd, val, exit_status);
+        if (val == FALSE || exit_status != 0)
+           goto out;
+
+        if (eject) {
+            g_free(cmd);
+            cmd = NULL;
+            cmd = g_strconcat ("eject ", pdisk->device, NULL);
+            val = g_spawn_command_line_sync (cmd, &output, &erroutput, 
&exit_status, &error);
+            DBG("cmd: '%s', returned %d, exit_status=%d", cmd, val, 
exit_status);
         }
 
-        if (disk_check_mounted(pdisk->device))
-            retval = ERROR;
-
-        g_free (cmd);
-        g_free (tmp);
-        g_free (tmp2);
+out:
+        g_free(cmd);
+        if (tmp)
+            g_free(tmp);
+        /* show error message if smth failed */
+        if (val == FALSE || exit_status != 0)
+            xfce_dialog_show_error (NULL, error, "%s %s %d, %s %s", _("Mount 
Plugin: Error executing command."),
+                _("Returned"), WEXITSTATUS(exit_status), _("error was"), 
erroutput);
+
+        if (show_message_dialog && !eject && val == TRUE && exit_status == 0)
+            xfce_dialog_show_info (NULL, NULL, _("The device \"%s\" should be 
removable safely now."), pdisk->device);
+        if (show_message_dialog && disk_check_mounted(pdisk->device))
+            xfce_dialog_show_error (NULL, NULL, _("An error occurred. The 
device \"%s\" should not be removed!"), pdisk->device);
     }
-
-    return retval;
 }
 
 
diff --git a/panel-plugin/devices.h b/panel-plugin/devices.h
index 6bf95ec..5b917b0 100644
--- a/panel-plugin/devices.h
+++ b/panel-plugin/devices.h
@@ -94,7 +94,6 @@ char * get_size_human_readable(float size);
  * @param mount_command    Command to use for mounting the device, still 
containing placeholders like \%d and \%m.
  * @param eject            Whether to inject the device before mounting.
  * @param use_sudo         Whether to use sudo to run the mount command.
- * @return                Exit status of the mount command
  */
 void disk_mount (t_disk *pdisk, char *on_mount_cmd, char* mount_command, 
gboolean eject, gboolean use_sudo);
 
@@ -103,12 +102,11 @@ void disk_mount (t_disk *pdisk, char *on_mount_cmd, char* 
mount_command, gboolea
  * Unmount a t_disk.
  * @param pdisk            Disk to umount
  * @param umount_command    Command to use for unmounting the device, still 
containing placeholders like \%d and \%m.
- * @param synchronous    Whether to execute the command synchronously to the 
program itself thus waiting for the output
+ * @param show_message_dialog Whether to show a dialog upon successful umount 
for device removal
  * @param eject            Whether to eject the device after unmounting.
  * @param use_sudo         Whether to use sudo to run the umount command.
- * @return                 Exit status of the umount command
  */
-int disk_umount (t_disk *pdisk, char* umount_command, gboolean synchronous, 
gboolean eject, gboolean use_sudo);
+void disk_umount (t_disk *pdisk, char* umount_command, gboolean 
show_message_dialog, gboolean eject, gboolean use_sudo);
 
 
 /**
diff --git a/panel-plugin/mount-plugin.c b/panel-plugin/mount-plugin.c
index 05c9ae0..951718b 100644
--- a/panel-plugin/mount-plugin.c
+++ b/panel-plugin/mount-plugin.c
@@ -35,19 +35,10 @@ void format_LVM_name (const char *disk_device, gchar 
**formatted_diskname);
 
 
 static void
-on_message_dialog_response (GtkWidget *widget, gpointer *data)
-{
-    gtk_widget_destroy (widget);
-}
-
-
-static void
 on_activate_disk_display (GtkWidget *widget, t_disk * disk)
 {
     t_mounter * mt;
     gboolean eject;
-    gchar *msg;
-    GtkWidget *my_dlg;
 
     TRACE ("enters on_activate_disk_display");
 
@@ -57,31 +48,7 @@ on_activate_disk_display (GtkWidget *widget, t_disk * disk)
 
     if (disk != NULL) {
         if (disk->mount_info != NULL) { /* disk is mounted */
-            int result = disk_umount (disk, mt->umount_command,
-                                      mt->message_dialog, eject, mt->use_sudo);
-
-            if (mt->message_dialog && (!eject || result!=NONE) ) { /* popup 
dialog */
-
-                    msg = (gchar *) g_malloc (1024*sizeof(gchar));
-                    if (result==NONE)
-                        msg = _("The device \"%s\" should be removable safely "
-                                    "now.");
-                    else
-                        msg = _("An error occurred. The device \"%s\" should 
not be "
-                                    "removed!");
-
-                my_dlg = gtk_message_dialog_new (NULL,
-                        GTK_DIALOG_DESTROY_WITH_PARENT,
-                        GTK_MESSAGE_INFO,
-                        GTK_BUTTONS_OK,
-                        msg,
-                        disk->mount_point);
-
-                 g_signal_connect (my_dlg, "response",
-                        G_CALLBACK (on_message_dialog_response), my_dlg);
-                 gtk_widget_show (my_dlg);
-                    /* gtk_dialog_run (GTK_DIALOG (my_dlg)); */
-            }
+            disk_umount (disk, mt->umount_command, mt->message_dialog, eject, 
mt->use_sudo);
         }
         else { /* disk is not mounted */
             disk_mount (disk, mt->on_mount_cmd, mt->mount_command, eject, 
mt->use_sudo);
_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to