aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-ops.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-ops.c')
-rw-r--r--mail/mail-ops.c60
1 files changed, 50 insertions, 10 deletions
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index 5d3345fa8b..5de88d9633 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -2278,31 +2278,64 @@ mail_store_set_offline (CamelStore *store, gboolean offline,
struct _execute_shell_command_msg {
struct _mail_msg msg;
- char *command;
+ GPtrArray *argv;
};
-static char *execute_shell_command_desc (struct _mail_msg *mm, int done)
+static char *
+execute_shell_command_desc (struct _mail_msg *mm, int done)
{
struct _execute_shell_command_msg *m = (struct _execute_shell_command_msg *) mm;
char *msg;
- msg = g_strdup_printf (_("Executing shell command: %s"), m->command);
+ msg = g_strdup_printf (_("Executing shell command: %s"), m->argv->pdata[0]);
return msg;
}
-static void execute_shell_command_do (struct _mail_msg *mm)
+static void
+execute_shell_command_do (struct _mail_msg *mm)
{
struct _execute_shell_command_msg *m = (struct _execute_shell_command_msg *) mm;
+ pid_t result, pid;
+ int status;
+
+ if (!(pid = fork ())) {
+ /* child process */
+ GPtrArray *args;
+ int maxfd, i;
+
+ setsid ();
+
+ maxfd = sysconf (_SC_OPEN_MAX);
+ for (i = 0; i < maxfd; i++)
+ close (i);
+
+ execvp (m->argv->pdata[0], (char **) m->argv->pdata);
+
+ d(printf ("Could not execute %s: %s\n", m->argv->pdata[0], g_strerror (errno)));
+ _exit (255);
+ } else if (pid < 0) {
+ camel_exception_setv (&mm->ex, CAMEL_EXCEPTION_SYSTEM,
+ _("Failed to create create child process '%s': %s"),
+ m->argv->pdata[0], g_strerror (errno));
+ return -1;
+ }
- gnome_execute_shell (NULL, m->command);
+ do {
+ result = waitpid (pid, &status, 0);
+ } while (result != pid);
}
-static void execute_shell_command_free (struct _mail_msg *mm)
+static void
+execute_shell_command_free (struct _mail_msg *mm)
{
struct _execute_shell_command_msg *m = (struct _execute_shell_command_msg *) mm;
+ int i;
- g_free (m->command);
+ for (i = 0; i < m->argv; i++)
+ g_free (m->argv->pdata[i]);
+
+ g_ptr_array_free (m->argv, TRUE);
}
static struct _mail_msg_op execute_shell_command_op = {
@@ -2313,15 +2346,22 @@ static struct _mail_msg_op execute_shell_command_op = {
};
void
-mail_execute_shell_command (CamelFilterDriver *driver, const char *command, void *data)
+mail_execute_shell_command (CamelFilterDriver *driver, int argc, char **argv, void *data)
{
struct _execute_shell_command_msg *m;
+ GPtrArray *args;
+ int i;
- if (command == NULL)
+ if (argc <= 0)
return;
+ args = g_ptr_array_new ();
+ for (i = 0; i < argc; i++)
+ g_ptr_array_add (args, g_strdup (argv[i]));
+ g_ptr_array_add (args, NULL);
+
m = mail_msg_new (&execute_shell_command_op, NULL, sizeof (*m));
- m->command = g_strdup (command);
+ m->argv = args;
e_thread_put (mail_thread_queued, (EMsg *) m);
}