aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog15
-rw-r--r--camel/camel-filter-driver.c2
-rw-r--r--camel/camel-filter-search.c2
-rw-r--r--camel/camel-folder.c2
-rw-r--r--camel/camel-gpg-context.c2
-rw-r--r--camel/camel-process.c2
-rw-r--r--camel/camel-stream-process.c163
7 files changed, 104 insertions, 84 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 08b35349e6..91bc565225 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,18 @@
+2003-12-01 Jeffrey Stedfast <fejj@ximian.com>
+
+ * camel-stream-process.c (do_exec_command): Same.
+
+ * camel-process.c (camel_process_fork): Same.
+
+ * camel-filter-search.c (run_command): Same as below.
+
+ * camel-filter-driver.c (pipe_to_system): Same as below.
+
+ * camel-gpg-context.c (gpg_ctx_op_start): Use fcntl() to set
+ FD_CLOEXEC on each fd rather than close()ing it. Apparently
+ Linux's older pthread implementations use sockets and so this
+ fouls threading up. GO LINUX! GO!
+
2003-12-01 Radek Doulik <rodo@ximian.com>
* camel-store.c (add_special_info): set SUBSCRIBED and NOINFERIORS
diff --git a/camel/camel-filter-driver.c b/camel/camel-filter-driver.c
index bd3478e64e..789ec90cba 100644
--- a/camel/camel-filter-driver.c
+++ b/camel/camel-filter-driver.c
@@ -695,7 +695,7 @@ pipe_to_system (struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFil
if (maxfd > 0) {
for (fd = 0; fd < maxfd; fd++) {
if (fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != STDERR_FILENO)
- close (fd);
+ fcntl (fd, F_SETFD, FD_CLOEXEC);
}
}
diff --git a/camel/camel-filter-search.c b/camel/camel-filter-search.c
index 5897239164..c90bda41a3 100644
--- a/camel/camel-filter-search.c
+++ b/camel/camel-filter-search.c
@@ -533,7 +533,7 @@ run_command (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessa
if (maxfd > 0) {
for (fd = 0; fd < maxfd; fd++) {
if (fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != STDERR_FILENO)
- close (fd);
+ fcntl (fd, F_SETFD, FD_CLOEXEC);
}
}
diff --git a/camel/camel-folder.c b/camel/camel-folder.c
index d8fe518f71..f02b982d15 100644
--- a/camel/camel-folder.c
+++ b/camel/camel-folder.c
@@ -1650,7 +1650,7 @@ folder_changed (CamelObject *obj, gpointer event_data)
if ((folder->folder_flags & CAMEL_FOLDER_FILTER_RECENT)
&& changed->uid_recent->len > 0)
driver = camel_session_get_filter_driver(session, "incoming", NULL);
-
+
CAMEL_FOLDER_LOCK(folder, change_lock);
if (driver) {
diff --git a/camel/camel-gpg-context.c b/camel/camel-gpg-context.c
index 87cf1b8647..ee9bc4f5d3 100644
--- a/camel/camel-gpg-context.c
+++ b/camel/camel-gpg-context.c
@@ -589,7 +589,7 @@ gpg_ctx_op_start (struct _GpgCtx *gpg)
(i != STDERR_FILENO) &&
(i != fds[7]) && /* status fd */
(i != fds[8])) /* passwd fd */
- close (i);
+ fcntl (i, F_SETFD, FD_CLOEXEC);
}
}
diff --git a/camel/camel-process.c b/camel/camel-process.c
index 01c1e3be3d..9e2d9657dd 100644
--- a/camel/camel-process.c
+++ b/camel/camel-process.c
@@ -81,7 +81,7 @@ camel_process_fork (const char *path, char **argv, int *infd, int *outfd, int *e
if ((maxfd = sysconf (_SC_OPEN_MAX)) > 0) {
for (i = 0; i < maxfd; i++) {
if (i != STDIN_FILENO && i != STDOUT_FILENO && i != STDERR_FILENO)
- close (i);
+ fcntl (i, F_SETFD, FD_CLOEXEC);
}
}
diff --git a/camel/camel-stream-process.c b/camel/camel-stream-process.c
index 2038d29efc..6a48ae40d0 100644
--- a/camel/camel-stream-process.c
+++ b/camel/camel-stream-process.c
@@ -59,16 +59,16 @@ camel_stream_process_finalise (CamelObject *object)
{
/* Ensure we clean up after ourselves -- kill
the child process and reap it. */
- stream_close(CAMEL_STREAM (object));
+ stream_close (CAMEL_STREAM (object));
}
static void
camel_stream_process_class_init (CamelStreamProcessClass *camel_stream_process_class)
{
- CamelStreamClass *camel_stream_class = (CamelStreamClass *)camel_stream_process_class;
-
- parent_class = camel_type_get_global_classfuncs( CAMEL_OBJECT_TYPE );
-
+ CamelStreamClass *camel_stream_class = (CamelStreamClass *) camel_stream_process_class;
+
+ parent_class = camel_type_get_global_classfuncs (CAMEL_OBJECT_TYPE);
+
/* virtual method definition */
camel_stream_class->read = stream_read;
camel_stream_class->write = stream_write;
@@ -80,7 +80,7 @@ static void
camel_stream_process_init (gpointer object, gpointer klass)
{
CamelStreamProcess *stream = CAMEL_STREAM_PROCESS (object);
-
+
stream->sockfd = -1;
stream->childpid = 0;
}
@@ -89,21 +89,20 @@ camel_stream_process_init (gpointer object, gpointer klass)
CamelType
camel_stream_process_get_type (void)
{
- static CamelType camel_stream_process_type = CAMEL_INVALID_TYPE;
-
- if (camel_stream_process_type == CAMEL_INVALID_TYPE) {
- camel_stream_process_type =
- camel_type_register( camel_stream_get_type(),
+ static CamelType type = CAMEL_INVALID_TYPE;
+
+ if (type == CAMEL_INVALID_TYPE) {
+ type = camel_type_register (camel_stream_get_type (),
"CamelStreamProcess",
- sizeof( CamelStreamProcess ),
- sizeof( CamelStreamProcessClass ),
+ sizeof (CamelStreamProcess),
+ sizeof (CamelStreamProcessClass),
(CamelObjectClassInitFunc) camel_stream_process_class_init,
NULL,
(CamelObjectInitFunc) camel_stream_process_init,
(CamelObjectFinalizeFunc) camel_stream_process_finalise);
}
-
- return camel_stream_process_type;
+
+ return type;
}
/**
@@ -114,9 +113,9 @@ camel_stream_process_get_type (void)
* Return value: the stream
**/
CamelStream *
-camel_stream_process_new(void)
+camel_stream_process_new (void)
{
- return (CamelStream *)camel_object_new(camel_stream_process_get_type ());
+ return (CamelStream *) camel_object_new (camel_stream_process_get_type ());
}
@@ -124,16 +123,16 @@ static ssize_t
stream_read (CamelStream *stream, char *buffer, size_t n)
{
CamelStreamProcess *stream_process = CAMEL_STREAM_PROCESS (stream);
-
- return camel_read(stream_process->sockfd, buffer, n);
+
+ return camel_read (stream_process->sockfd, buffer, n);
}
static ssize_t
stream_write (CamelStream *stream, const char *buffer, size_t n)
{
CamelStreamProcess *stream_process = CAMEL_STREAM_PROCESS (stream);
-
- return camel_write(stream_process->sockfd, buffer, n);
+
+ return camel_write (stream_process->sockfd, buffer, n);
}
static int
@@ -146,123 +145,129 @@ static int
stream_close (CamelStream *object)
{
CamelStreamProcess *stream = CAMEL_STREAM_PROCESS (object);
+
if (camel_verbose_debug)
- fprintf(stderr, "Process stream close. sockfd %d, childpid %d\n",
- stream->sockfd, stream->childpid);
-
+ fprintf (stderr, "Process stream close. sockfd %d, childpid %d\n",
+ stream->sockfd, stream->childpid);
+
if (stream->sockfd != -1) {
- close(stream->sockfd);
+ close (stream->sockfd);
stream->sockfd = -1;
}
+
if (stream->childpid) {
int ret, i;
- for (i=0; i<4; i++) {
- ret = waitpid(stream->childpid, NULL, WNOHANG);
+ for (i = 0; i < 4; i++) {
+ ret = waitpid (stream->childpid, NULL, WNOHANG);
if (camel_verbose_debug)
- fprintf(stderr, "waitpid() for pid %d returned %d (errno %d)\n",
- stream->childpid, ret, ret==-1?errno:0);
+ fprintf (stderr, "waitpid() for pid %d returned %d (errno %d)\n",
+ stream->childpid, ret, ret == -1 ? errno : 0);
if (ret == stream->childpid || errno == ECHILD)
break;
- switch(i) {
+ switch (i) {
case 0:
if (camel_verbose_debug)
- fprintf(stderr, "Sending SIGTERM to pid %d\n",
- stream->childpid);
- kill(stream->childpid, SIGTERM);
+ fprintf (stderr, "Sending SIGTERM to pid %d\n",
+ stream->childpid);
+ kill (stream->childpid, SIGTERM);
break;
case 2:
if (camel_verbose_debug)
- fprintf(stderr, "Sending SIGKILL to pid %d\n",
- stream->childpid);
- kill(stream->childpid, SIGKILL);
+ fprintf (stderr, "Sending SIGKILL to pid %d\n",
+ stream->childpid);
+ kill (stream->childpid, SIGKILL);
break;
case 1:
case 3:
- sleep(1);
+ sleep (1);
break;
}
}
+
stream->childpid = 0;
}
+
return 0;
}
-static void do_exec_command(int fd, const char *command, char **env)
+static void
+do_exec_command (int fd, const char *command, char **env)
{
int i, maxopen;
-
+
/* Not a lot we can do if there's an error other than bail. */
- if (dup2(fd, 0) == -1)
- exit(1);
- if (dup2(fd, 1) == -1)
- exit(1);
+ if (dup2 (fd, 0) == -1)
+ exit (1);
+ if (dup2 (fd, 1) == -1)
+ exit (1);
/* What to do with stderr? Possibly put it through a separate pipe
and bring up a dialog box with its output if anything does get
spewed to it? It'd help the user understand what was going wrong
with their command, but it's hard to do cleanly. For now we just
leave it as it is. Perhaps we should close it and reopen /dev/null? */
-
- maxopen = sysconf(_SC_OPEN_MAX);
- for (i=3; i < maxopen; i++)
- close(i);
-
- setsid();
+
+ maxopen = sysconf (_SC_OPEN_MAX);
+ for (i = 3; i < maxopen; i++)
+ fcntl (i, F_SETFD, FD_CLOEXEC);
+
+ setsid ();
#ifdef TIOCNOTTY
/* Detach from the controlling tty if we have one. Otherwise,
SSH might do something stupid like trying to use it instead
of running $SSH_ASKPASS. Doh. */
- fd = open("/dev/tty", O_RDONLY);
- if (fd != -1) {
- ioctl(fd, TIOCNOTTY, NULL);
- close(fd);
+ if ((fd = open ("/dev/tty", O_RDONLY)) != -1) {
+ ioctl (fd, TIOCNOTTY, NULL);
+ close (fd);
}
#endif /* TIOCNOTTY */
-
+
/* Set up child's environment. We _add_ to it, don't use execle,
because otherwise we'd destroy stuff like SSH_AUTH_SOCK etc. */
- for (; env && *env; env++) {
- char *eq = strchr(*env, '=');
+ for ( ; env && *env; env++) {
+ char *eq = strchr (*env, '=');
+
if (!eq) {
- unsetenv(*env);
+ unsetenv (*env);
continue;
}
- *eq = 0;
- eq++;
- setenv(*env, eq, 1);
+
+ *eq++ = '\0';
+
+ setenv (*env, eq, 1);
}
-
- execl("/bin/sh", "/bin/sh", "-c", command, NULL);
-
+
+ execl ("/bin/sh", "/bin/sh", "-c", command, NULL);
+
if (camel_verbose_debug)
- fprintf(stderr, "exec failed %d\n", errno);
- exit(1);
+ fprintf (stderr, "exec failed %d\n", errno);
+
+ exit (1);
}
int
-camel_stream_process_connect(CamelStreamProcess *stream, const char *command, const char **env)
+camel_stream_process_connect (CamelStreamProcess *stream, const char *command, const char **env)
{
int sockfds[2];
-
- if (stream->sockfd != -1 || stream->childpid) {
- stream_close(CAMEL_STREAM (stream));
- }
- if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfds))
+ if (stream->sockfd != -1 || stream->childpid)
+ stream_close (CAMEL_STREAM (stream));
+
+ if (socketpair (AF_UNIX, SOCK_STREAM, 0, sockfds))
return -1;
-
- stream->childpid = fork();
+
+ stream->childpid = fork ();
if (!stream->childpid) {
- do_exec_command(sockfds[1], command, (char **)env);
+ do_exec_command (sockfds[1], command, (char **)env);
} else if (stream->childpid == -1) {
- close(sockfds[0]);
- close(sockfds[1]);
+ close (sockfds[0]);
+ close (sockfds[1]);
stream->sockfd = -1;
return -1;
}
-
- close(sockfds[1]);
+
+ close (sockfds[1]);
stream->sockfd = sockfds[0];
-
+
return 0;
}