summaryrefslogtreecommitdiff
path: root/src/assuan-connect.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2002-01-21 12:03:14 +0000
committerWerner Koch <wk@gnupg.org>2002-01-21 12:03:14 +0000
commitc314434f6511c21444b085e56f3797c8ebbbe0b2 (patch)
tree1120d3ee0e7121f5ccf224b4391795a51c72bf8d /src/assuan-connect.c
parentdbcd18310d6147658d669bdaa5580f06833306a6 (diff)
downloadlibassuan-c314434f6511c21444b085e56f3797c8ebbbe0b2.tar.gz
* assuan-connect.c: Move all except assuan_get_pid to...
* assuan-pipe-connect.c: this. (assuan_pipe_disconnect): Removed. (do_finish, do_deinit): New (assuan_pipe_connect): and set them into the context. * assuan-socket-connect.c: New. * assuan-util.c (_assuan_log_sanitized_string): New. * assuan-pipe-server.c (assuan_init_pipe_server): Factored most code out to ... (_assuan_new_context): new func. (_assuan_release_context): New * assuan-connect.c (assuan_pipe_connect): Use the new functions.
Diffstat (limited to 'src/assuan-connect.c')
-rw-r--r--src/assuan-connect.c210
1 files changed, 9 insertions, 201 deletions
diff --git a/src/assuan-connect.c b/src/assuan-connect.c
index 53b742f..49d4aac 100644
--- a/src/assuan-connect.c
+++ b/src/assuan-connect.c
@@ -33,208 +33,18 @@
#include "assuan-defs.h"
-#ifdef _POSIX_OPEN_MAX
-#define MAX_OPEN_FDS _POSIX_OPEN_MAX
-#else
-#define MAX_OPEN_FDS 20
-#endif
-
-#ifdef HAVE_JNLIB_LOGGING
-#include "../jnlib/logging.h"
-#define LOGERROR1(a,b) log_error ((a), (b))
-#else
-#define LOGERROR1(a,b) fprintf (stderr, (a), (b))
-#endif
-
-
-
-static int
-writen ( int fd, const char *buffer, size_t length )
+/* Disconnect and release the context CTX. */
+void
+assuan_disconnect (ASSUAN_CONTEXT ctx)
{
- while (length)
+ if (ctx)
{
- int nwritten = write (fd, buffer, length);
-
- if (nwritten < 0)
- {
- if (errno == EINTR)
- continue;
- return -1; /* write error */
- }
- length -= nwritten;
- buffer += nwritten;
+ assuan_write_line (ctx, "BYE");
+ ctx->finish_handler (ctx);
+ ctx->deinit_handler (ctx);
+ ctx->deinit_handler = NULL;
+ _assuan_release_context (ctx);
}
- return 0; /* okay */
-}
-
-
-
-/* Connect to a server over a pipe, creating the assuan context and
- returning it in CTX. The server filename is NAME, the argument
- vector in ARGV. FD_CHILD_LIST is a -1 terminated list of file
- descriptors not to close in the child. */
-AssuanError
-assuan_pipe_connect (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[],
- int *fd_child_list)
-{
- static int fixed_signals = 0;
- AssuanError err;
- int rp[2];
- int wp[2];
- int fd[2];
-
- if (!ctx || !name || !argv || !argv[0])
- return ASSUAN_Invalid_Value;
-
- if (!fixed_signals)
- {
- struct sigaction act;
-
- sigaction (SIGPIPE, NULL, &act);
- if (act.sa_handler == SIG_DFL)
- {
- act.sa_handler = SIG_IGN;
- sigemptyset (&act.sa_mask);
- act.sa_flags = 0;
- sigaction (SIGPIPE, &act, NULL);
- }
- fixed_signals = 1;
- /* FIXME: This is not MT safe */
- }
-
- if (pipe (rp) < 0)
- return ASSUAN_General_Error;
-
- if (pipe (wp) < 0)
- {
- close (rp[0]);
- close (rp[1]);
- return ASSUAN_General_Error;
- }
-
- fd[0] = rp[0]; /* Our inbound is read end of read pipe. */
- fd[1] = wp[1]; /* Our outbound is write end of write pipe. */
-
- err = assuan_init_pipe_server (ctx, fd); /* FIXME: Common code should be factored out. */
- if (err)
- {
- close (rp[0]);
- close (rp[1]);
- close (wp[0]);
- close (wp[1]);
- return err;
- }
- (*ctx)->is_server = 0;
-
- (*ctx)->pid = fork ();
- if ((*ctx)->pid < 0)
- {
- close (rp[0]);
- close (rp[1]);
- close (wp[0]);
- close (wp[1]);
- assuan_deinit_server (*ctx); /* FIXME: Common code should be factored out. */
- return ASSUAN_General_Error;
- }
-
- if ((*ctx)->pid == 0)
- {
- int i, n;
- char errbuf[512];
-#ifdef HAVE_JNLIB_LOGGING
- int log_fd = log_get_fd ();
-#endif
- /* close all files which will not be duped but keep stderr
- and log_stream for now */
- n = sysconf (_SC_OPEN_MAX);
- if (n < 0)
- n = MAX_OPEN_FDS;
- for (i=0; i < n; i++)
- {
- int *fdp = fd_child_list;
-
- if (fdp)
- {
- while (*fdp != -1 && *fdp != i)
- fdp++;
- }
-
- if (!(fdp && *fdp != -1)
- && i != fileno (stderr)
-#ifdef HAVE_JNLIB_LOGGING
- && i != log_fd
-#endif
- && i != rp[1] && i != wp[0])
- close(i);
- }
- errno = 0;
-
- /* Dup handles and to stdin/stdout and exec */
- if (rp[1] != STDOUT_FILENO)
- {
- if (dup2 (rp[1], STDOUT_FILENO) == -1)
- {
- LOGERROR1 ("dup2 failed in child: %s\n", strerror (errno));
- _exit (4);
- }
- close (rp[1]);
- }
- if (wp[0] != STDIN_FILENO)
- {
- if (dup2 (wp[0], STDIN_FILENO) == -1)
- {
- LOGERROR1 ("dup2 failed in child: %s\n", strerror (errno));
- _exit (4);
- }
- close (wp[0]);
- }
-
- execv (name, argv);
- /* oops - use the pipe to tell the parent about it */
- snprintf (errbuf, sizeof(errbuf)-1, "ERR %d can't exec `%s': %.50s\n",
- ASSUAN_Problem_Starting_Server, name, strerror (errno));
- errbuf[sizeof(errbuf)-1] = 0;
- writen (1, errbuf, strlen (errbuf));
- _exit (4);
- }
-
- close (rp[1]);
- close (wp[0]);
-
- /* initial handshake */
- {
- int okay, off;
-
- err = _assuan_read_from_server (*ctx, &okay, &off);
- if (err)
- {
- LOGERROR1 ("can't connect server: %s\n", assuan_strerror (err));
- }
- else if (okay != 1)
- {
- LOGERROR1 ("can't connect server: `%s'\n", (*ctx)->inbound.line);
- err = ASSUAN_Connect_Failed;
- }
- }
-
- if (err)
- {
- if ((*ctx)->pid != -1)
- waitpid ((*ctx)->pid, NULL, 0); /* FIXME Check return value. */
- assuan_deinit_server (*ctx); /* FIXME: Common code should be factored out. */
- }
-
- return err;
-}
-
-void
-assuan_pipe_disconnect (ASSUAN_CONTEXT ctx)
-{
- assuan_write_line (ctx, "BYE");
- close (ctx->inbound.fd);
- close (ctx->outbound.fd);
- waitpid (ctx->pid, NULL, 0); /* FIXME Check return value. */
- assuan_deinit_server (ctx);
}
pid_t
@@ -242,5 +52,3 @@ assuan_get_pid (ASSUAN_CONTEXT ctx)
{
return ctx ? ctx->pid : -1;
}
-
-