aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gpgme/ChangeLog16
-rw-r--r--gpgme/engine-gpgsm.c85
-rw-r--r--gpgme/posix-io.c17
3 files changed, 84 insertions, 34 deletions
diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog
index bf9796d2..c3144523 100644
--- a/gpgme/ChangeLog
+++ b/gpgme/ChangeLog
@@ -1,3 +1,19 @@
+2001-12-13 Marcus Brinkmann <[email protected]>
+
+ * engine-gpgsm.c (close_notify_handler): New function.
+ (_gpgme_gpgsm_new): Manage the file descriptors a
+ bit differently. Do not set close-on-exec flags.
+ (_gpgme_gpgsm_op_decrypt): Do not set message_fd
+ to -1, this is done by the close handler.
+ (_gpgme_gpgsm_op_encrypt): Likewise.
+ (_gpgme_gpgsm_op_import): Likewise (also for output_fd).
+ (_gpgme_gpgsm_op_keylist): Likewise (also for input_fd and output_fd).
+ (_gpgme_gpgsm_op_sign): Likewise.
+ (_gpgme_gpgsm_op_verify): Likewise, but for output_fd.
+
+ * posix-io.c (_gpgme_io_pipe): Set the close-on-exec flag for the
+ non-inherited file descriptor index of the pipe.
+
2001-12-13 Werner Koch <[email protected]>
* engine-gpgsm.c (_gpgme_gpgsm_set_colon_line_handler): New.
diff --git a/gpgme/engine-gpgsm.c b/gpgme/engine-gpgsm.c
index 38ce87d8..776ef0b0 100644
--- a/gpgme/engine-gpgsm.c
+++ b/gpgme/engine-gpgsm.c
@@ -107,59 +107,91 @@ _gpgme_gpgsm_check_version (void)
? 0 : mk_error (Invalid_Engine);
}
+static void
+close_notify_handler (int fd, void *opaque)
+{
+ GpgsmObject gpgsm = opaque;
+
+ assert (fd != -1);
+ if (gpgsm->input_fd == fd)
+ gpgsm->input_fd = -1;
+ else if (gpgsm->output_fd == fd)
+ gpgsm->output_fd = -1;
+ else if (gpgsm->message_fd == fd)
+ gpgsm->message_fd = -1;
+}
+
GpgmeError
_gpgme_gpgsm_new (GpgsmObject *r_gpgsm)
{
GpgmeError err = 0;
GpgsmObject gpgsm;
char *argv[] = { "gpgsm", "--server", NULL };
- int ip[2] = { -1, -1 };
- int op[2] = { -1, -1 };
- int mp[2] = { -1, -1 };
+ int fds[2];
*r_gpgsm = NULL;
gpgsm = xtrycalloc (1, sizeof *gpgsm);
if (!gpgsm)
{
err = mk_error (Out_Of_Core);
- goto leave;
+ return err;
}
- if (_gpgme_io_pipe (ip, 0) < 0)
+ gpgsm->input_fd = -1;
+ gpgsm->input_fd_server = -1;
+ gpgsm->output_fd = -1;
+ gpgsm->output_fd_server = -1;
+ gpgsm->message_fd = -1;
+ gpgsm->message_fd_server = -1;
+
+ if (_gpgme_io_pipe (fds, 0) < 0)
{
err = mk_error (General_Error);
goto leave;
}
- gpgsm->input_fd = ip[1];
- fcntl (ip[1], F_SETFD, FD_CLOEXEC); /* FIXME */
- gpgsm->input_fd_server = ip[0];
- if (_gpgme_io_pipe (op, 1) < 0)
+ gpgsm->input_fd = fds[1];
+ gpgsm->input_fd_server = fds[0];
+
+ if (_gpgme_io_pipe (fds, 1) < 0)
{
err = mk_error (General_Error);
goto leave;
}
- gpgsm->output_fd = op[0];
- fcntl (op[0], F_SETFD, FD_CLOEXEC); /* FIXME */
- gpgsm->output_fd_server = op[1];
- if (_gpgme_io_pipe (mp, 0) < 0)
+ gpgsm->output_fd = fds[0];
+ gpgsm->output_fd_server = fds[1];
+
+ if (_gpgme_io_pipe (fds, 0) < 0)
{
err = mk_error (General_Error);
goto leave;
}
- gpgsm->message_fd = mp[1];
- fcntl (mp[1], F_SETFD, FD_CLOEXEC); /* FIXME */
- gpgsm->message_fd_server = mp[0];
+ gpgsm->message_fd = fds[1];
+ gpgsm->message_fd_server = fds[0];
err = assuan_pipe_connect (&gpgsm->assuan_ctx,
_gpgme_get_gpgsm_path (), argv);
+ if (!err &&
+ (_gpgme_io_set_close_notify (gpgsm->input_fd,
+ close_notify_handler, gpgsm)
+ || _gpgme_io_set_close_notify (gpgsm->output_fd,
+ close_notify_handler, gpgsm)
+ || _gpgme_io_set_close_notify (gpgsm->message_fd,
+ close_notify_handler, gpgsm)))
+ {
+ err = mk_error (General_Error);
+ goto leave;
+ }
+
leave:
- if (ip[0] != -1)
- _gpgme_io_close (ip[0]);
- if (op[1] != -1)
- _gpgme_io_close (op[1]);
- if (mp[0] != -1)
- _gpgme_io_close (mp[0]);
+ /* Close the server ends of the pipes. Our ends are closed in
+ _gpgme_gpgsm_release. */
+ if (gpgsm->input_fd_server != -1)
+ _gpgme_io_close (gpgsm->input_fd_server);
+ if (gpgsm->output_fd_server != -1)
+ _gpgme_io_close (gpgsm->output_fd_server);
+ if (gpgsm->message_fd_server != -1)
+ _gpgme_io_close (gpgsm->message_fd_server);
if (err)
_gpgme_gpgsm_release (gpgsm);
@@ -256,7 +288,6 @@ _gpgme_gpgsm_op_decrypt (GpgsmObject gpgsm, GpgmeData ciph, GpgmeData plain)
if (err)
return mk_error (General_Error); /* FIXME */
_gpgme_io_close (gpgsm->message_fd);
- gpgsm->message_fd = -1;
return 0;
}
@@ -330,7 +361,6 @@ _gpgme_gpgsm_op_encrypt (GpgsmObject gpgsm, GpgmeRecipients recp,
if (err)
return mk_error (General_Error); /* FIXME */
_gpgme_io_close (gpgsm->message_fd);
- gpgsm->message_fd = -1;
err = gpgsm_set_recipients (gpgsm->assuan_ctx, recp);
if (err)
@@ -371,9 +401,7 @@ _gpgme_gpgsm_op_import (GpgsmObject gpgsm, GpgmeData keydata)
if (err)
return mk_error (General_Error); /* FIXME */
_gpgme_io_close (gpgsm->output_fd);
- gpgsm->output_fd = -1;
_gpgme_io_close (gpgsm->message_fd);
- gpgsm->message_fd = -1;
return 0;
}
@@ -394,11 +422,8 @@ _gpgme_gpgsm_op_keylist (GpgsmObject gpgsm, const char *pattern,
strcpy (&line[9], pattern);
_gpgme_io_close (gpgsm->input_fd);
- gpgsm->input_fd = -1;
_gpgme_io_close (gpgsm->output_fd);
- gpgsm->output_fd = -1;
_gpgme_io_close (gpgsm->message_fd);
- gpgsm->message_fd = -1;
gpgsm->command = line;
return 0;
@@ -429,7 +454,6 @@ _gpgme_gpgsm_op_sign (GpgsmObject gpgsm, GpgmeData in, GpgmeData out,
if (err)
return mk_error (General_Error); /* FIXME */
_gpgme_io_close (gpgsm->message_fd);
- gpgsm->message_fd = -1;
return 0;
}
@@ -463,7 +487,6 @@ _gpgme_gpgsm_op_verify (GpgsmObject gpgsm, GpgmeData sig, GpgmeData text)
if (err)
return mk_error (General_Error); /* FIXME */
_gpgme_io_close (gpgsm->output_fd);
- gpgsm->output_fd = -1;
return 0;
}
diff --git a/gpgme/posix-io.c b/gpgme/posix-io.c
index 2043854e..eaa8950c 100644
--- a/gpgme/posix-io.c
+++ b/gpgme/posix-io.c
@@ -75,10 +75,21 @@ _gpgme_io_write ( int fd, const void *buffer, size_t count )
}
int
-_gpgme_io_pipe ( int filedes[2], int inherit_idx )
+_gpgme_io_pipe (int filedes[2], int inherit_idx)
{
- /* we don't need inherit_idx in this implementation */
- return pipe ( filedes );
+ int err;
+
+ err = pipe (filedes);
+ if (err < 0)
+ return err;
+ /* FIXME: Should get the old flags first. */
+ err = fcntl (filedes[1 - inherit_idx], F_SETFD, FD_CLOEXEC);
+ if (err < 0)
+ {
+ close (filedes[0]);
+ close (filedes[1]);
+ }
+ return err;
}
int