summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Brinkmann <mb@g10code.com>2009-11-27 19:12:01 +0000
committerMarcus Brinkmann <mb@g10code.com>2009-11-27 19:12:01 +0000
commit4b6374bc374428ac71c43e1158ff75a027a1eb72 (patch)
tree124bd553fc3481405fd1e573b978fb2a1f362d19
parentb41cc03c891deac4bb35af3c88f8b635ebfb632c (diff)
downloadlibassuan-4b6374bc374428ac71c43e1158ff75a027a1eb72.tar.gz
2009-11-27 Marcus Brinkmann <marcus@g10code.de>
* assuan.h (assuan_set_assuan_log_stream): Add prototype. * libassuan.def, libassuan.vers: Add back assuan_set_assuan_log_stream. * assuan-logging.c (assuan_set_assuan_log_stream): Add back. * context.c (assuan_get_pointer): Don't output debug info here. (assuan_get_peercred, assuan_get_pid): But do here. * system.c: Improve debug output. * assuan-defs.h (struct assuan_context_s): Rename pipe_mode to max_accepts. * assuan-listen.c (assuan_accept): Rework max accepts logic. * assuan-socket-server.c (assuan_init_socket_server), assuan-socket-connect.c (assuan_socket_connect), assuan-pipe-server.c (assuan_init_pipe_server), assuan-pipe-connect.c (socketpair_connect): Add debug output, set max_accepts instead of pipe_mode.
-rw-r--r--src/ChangeLog18
-rw-r--r--src/assuan-defs.h4
-rw-r--r--src/assuan-listen.c17
-rw-r--r--src/assuan-logging.c12
-rw-r--r--src/assuan-pipe-connect.c9
-rw-r--r--src/assuan-pipe-server.c15
-rw-r--r--src/assuan-socket-connect.c3
-rw-r--r--src/assuan-socket-server.c15
-rw-r--r--src/assuan.h3
-rw-r--r--src/context.c8
-rw-r--r--src/libassuan.def59
-rw-r--r--src/libassuan.vers1
-rw-r--r--src/system.c42
13 files changed, 143 insertions, 63 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 83c91db..d95b1cf 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,21 @@
+2009-11-27 Marcus Brinkmann <marcus@g10code.de>
+
+ * assuan.h (assuan_set_assuan_log_stream): Add prototype.
+ * libassuan.def, libassuan.vers: Add back
+ assuan_set_assuan_log_stream.
+ * assuan-logging.c (assuan_set_assuan_log_stream): Add back.
+ * context.c (assuan_get_pointer): Don't output debug info here.
+ (assuan_get_peercred, assuan_get_pid): But do here.
+ * system.c: Improve debug output.
+ * assuan-defs.h (struct assuan_context_s): Rename pipe_mode to
+ max_accepts.
+ * assuan-listen.c (assuan_accept): Rework max accepts logic.
+ * assuan-socket-server.c (assuan_init_socket_server),
+ assuan-socket-connect.c (assuan_socket_connect),
+ assuan-pipe-server.c (assuan_init_pipe_server),
+ assuan-pipe-connect.c (socketpair_connect): Add debug output, set
+ max_accepts instead of pipe_mode.
+
2009-11-25 Marcus Brinkmann <marcus@g10code.de>
* assuan.h (assuan_init_pipe_server): Change type of filedes to
diff --git a/src/assuan-defs.h b/src/assuan-defs.h
index e4883a9..c3b53f0 100644
--- a/src/assuan-defs.h
+++ b/src/assuan-defs.h
@@ -164,8 +164,8 @@ struct assuan_context_s
} data;
} outbound;
- int pipe_mode; /* We are in pipe mode, i.e. we can handle just one
- connection and must terminate then. */
+ int max_accepts; /* If we can not handle more than one connection,
+ set this to 1, otherwise to -1. */
pid_t pid; /* The pid of the peer. */
assuan_fd_t listen_fd; /* The fd we are listening on (used by
socket servers) */
diff --git a/src/assuan-listen.c b/src/assuan-listen.c
index 5261c0f..c37c3a5 100644
--- a/src/assuan-listen.c
+++ b/src/assuan-listen.c
@@ -78,12 +78,16 @@ assuan_accept (assuan_context_t ctx)
if (!ctx)
return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE);
- if (ctx->pipe_mode > 1)
- return -1; /* second invocation for pipemode -> terminate */
- if (! ctx->pipe_mode)
+ if (ctx->max_accepts != -1)
{
+ if (ctx->max_accepts-- == 0)
+ return -1; /* second invocation for pipemode -> terminate */
+ }
+ if (ctx->accept_handler)
+ {
+ /* FIXME: This should be superfluous, if everything else is
+ correct. */
ctx->finish_handler (ctx);
-
rc = ctx->accept_handler (ctx);
if (rc)
return rc;
@@ -111,10 +115,7 @@ assuan_accept (assuan_context_t ctx)
rc = assuan_write_line (ctx, "OK Pleased to meet you");
if (rc)
return rc;
-
- if (ctx->pipe_mode)
- ctx->pipe_mode = 2;
-
+
return 0;
}
diff --git a/src/assuan-logging.c b/src/assuan-logging.c
index 0e57579..fa2e3c2 100644
--- a/src/assuan-logging.c
+++ b/src/assuan-logging.c
@@ -45,6 +45,16 @@ static char prefix_buffer[80];
static int full_logging;
+static FILE *_assuan_log;
+
+void
+assuan_set_assuan_log_stream (FILE *fp)
+{
+ _assuan_log = fp;
+ full_logging = !!getenv ("ASSUAN_FULL_LOGGING");
+}
+
+
/* Set the per context log stream. Also enable the default log stream
if it has not been set. */
void
@@ -96,7 +106,7 @@ _assuan_log_handler (assuan_context_t ctx, void *hook, unsigned int cat,
if (msg == NULL)
return 1;
- fp = ctx->log_fp;
+ fp = ctx->log_fp ? ctx->log_fp : _assuan_log;
if (!fp)
return 0;
diff --git a/src/assuan-pipe-connect.c b/src/assuan-pipe-connect.c
index 74f85f2..c1dfe94 100644
--- a/src/assuan-pipe-connect.c
+++ b/src/assuan-pipe-connect.c
@@ -196,7 +196,8 @@ pipe_connect (assuan_context_t ctx,
ctx->engine.sendfd = NULL;
ctx->engine.receivefd = NULL;
ctx->finish_handler = _assuan_client_finish;
- ctx->pipe_mode = 1;
+ ctx->max_accepts = 1;
+ ctx->accept_handler = NULL;
ctx->inbound.fd = rp[0]; /* Our inbound is read end of read pipe. */
ctx->outbound.fd = wp[1]; /* Our outbound is write end of write pipe. */
ctx->pid = pid;
@@ -341,7 +342,7 @@ socketpair_connect (assuan_context_t ctx,
ctx->engine.release = _assuan_client_release;
ctx->finish_handler = _assuan_client_finish;
- ctx->pipe_mode = 1;
+ ctx->max_accepts = 1;
ctx->inbound.fd = fds[0];
ctx->outbound.fd = fds[0];
_assuan_init_uds_io (ctx);
@@ -390,8 +391,8 @@ assuan_pipe_connect (assuan_context_t ctx,
void (*atfork) (void *opaque, int reserved),
void *atforkvalue, unsigned int flags)
{
- TRACE2 (ctx, ASSUAN_LOG_CTX, "assuan_pipe_connect_ext", ctx,
- "name=%s,flags=0x%x", name ? name : "(null)", flags);
+ TRACE2 (ctx, ASSUAN_LOG_CTX, "assuan_pipe_connect", ctx,
+ "name=%s, flags=0x%x", name ? name : "(null)", flags);
if (flags & ASSUAN_PIPE_CONNECT_FDPASSING)
{
diff --git a/src/assuan-pipe-server.c b/src/assuan-pipe-server.c
index cb15de4..6b15f4e 100644
--- a/src/assuan-pipe-server.c
+++ b/src/assuan-pipe-server.c
@@ -32,7 +32,7 @@
#endif
#include "assuan-defs.h"
-
+#include "debug.h"
/* Returns true if atoi(S) denotes a valid socket. */
#ifndef HAVE_W32_SYSTEM
@@ -59,10 +59,12 @@ assuan_init_pipe_server (assuan_context_t ctx, assuan_fd_t filedes[2])
assuan_fd_t infd = ASSUAN_INVALID_FD;
assuan_fd_t outfd = ASSUAN_INVALID_FD;
int is_usd = 0;
+ TRACE_BEG2 (ctx, ASSUAN_LOG_CTX, "assuan_init_pipe_server", ctx,
+ "fd[0]=0x%x, fd[1]=0x%x", filedes[0], filedes[1]);
rc = _assuan_register_std_commands (ctx);
if (rc)
- return rc;
+ return TRACE_ERR (rc);
#ifdef HAVE_W32_SYSTEM
infd = filedes[0];
@@ -87,7 +89,10 @@ assuan_init_pipe_server (assuan_context_t ctx, assuan_fd_t filedes[2])
outfd = filedes[1];
}
else
- return _assuan_error (ctx, GPG_ERR_ASS_SERVER_START);
+ {
+ rc = _assuan_error (ctx, GPG_ERR_ASS_SERVER_START);
+ return TRACE_ERR (rc);
+ }
#endif
ctx->is_server = 1;
@@ -96,7 +101,7 @@ assuan_init_pipe_server (assuan_context_t ctx, assuan_fd_t filedes[2])
ctx->engine.writefnc = _assuan_simple_write;
ctx->engine.sendfd = NULL;
ctx->engine.receivefd = NULL;
- ctx->pipe_mode = 1;
+ ctx->max_accepts = 1;
s = getenv ("_assuan_pipe_connect_pid");
if (s && (ul=strtoul (s, NULL, 10)) && ul)
@@ -111,5 +116,5 @@ assuan_init_pipe_server (assuan_context_t ctx, assuan_fd_t filedes[2])
if (is_usd)
_assuan_init_uds_io (ctx);
- return 0;
+ return TRACE_SUC();
}
diff --git a/src/assuan-socket-connect.c b/src/assuan-socket-connect.c
index 7ec8799..666f9ca 100644
--- a/src/assuan-socket-connect.c
+++ b/src/assuan-socket-connect.c
@@ -67,6 +67,8 @@ assuan_socket_connect (assuan_context_t ctx, const char *name,
size_t len;
const char *s;
+ TRACE2 (ctx, ASSUAN_LOG_CTX, "assuan_socket_connect", ctx,
+ "name=%s, flags=0x%x", name ? name : "(null)", flags);
if (!ctx || !name)
return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE);
@@ -115,6 +117,7 @@ assuan_socket_connect (assuan_context_t ctx, const char *name,
ctx->finish_handler = _assuan_client_finish;
ctx->inbound.fd = fd;
ctx->outbound.fd = fd;
+ ctx->max_accepts = -1;
if (flags & ASSUAN_SOCKET_CONNECT_FDPASSING)
_assuan_init_uds_io (ctx);
diff --git a/src/assuan-socket-server.c b/src/assuan-socket-server.c
index a4431fa..84b980e 100644
--- a/src/assuan-socket-server.c
+++ b/src/assuan-socket-server.c
@@ -38,7 +38,7 @@
# include <sys/un.h>
#endif
-
+#include "debug.h"
#include "assuan-defs.h"
static gpg_error_t
@@ -116,10 +116,12 @@ assuan_init_socket_server (assuan_context_t ctx, assuan_fd_t fd,
unsigned int flags)
{
gpg_error_t rc;
-
+ TRACE_BEG2 (ctx, ASSUAN_LOG_CTX, "assuan_init_socket_server", ctx,
+ "fd=0x%x, flags=0x%x", fd, flags);
+
rc = _assuan_register_std_commands (ctx);
if (rc)
- return rc;
+ return TRACE_ERR (rc);
ctx->engine.release = _assuan_server_release;
ctx->engine.readfnc = _assuan_simple_read;
@@ -128,7 +130,10 @@ assuan_init_socket_server (assuan_context_t ctx, assuan_fd_t fd,
ctx->engine.receivefd = NULL;
ctx->is_server = 1;
if (flags & ASSUAN_SOCKET_SERVER_ACCEPTED)
- ctx->pipe_mode = 1; /* We want a second accept to indicate EOF. */
+ /* We want a second accept to indicate EOF. */
+ ctx->max_accepts = 1;
+ else
+ ctx->max_accepts = -1;
ctx->input_fd = ASSUAN_INVALID_FD;
ctx->output_fd = ASSUAN_INVALID_FD;
@@ -156,7 +161,7 @@ assuan_init_socket_server (assuan_context_t ctx, assuan_fd_t fd,
rc = _assuan_register_std_commands (ctx);
if (rc)
_assuan_reset (ctx);
- return rc;
+ return TRACE_ERR (rc);
}
diff --git a/src/assuan.h b/src/assuan.h
index 0fb1795..bb5c60f 100644
--- a/src/assuan.h
+++ b/src/assuan.h
@@ -298,6 +298,9 @@ void assuan_set_assuan_log_prefix (const char *text);
string, i.e. "" */
const char *assuan_get_assuan_log_prefix (void);
+/* Global default log stream. */
+void assuan_set_assuan_log_stream (FILE *fp);
+
/* Set the per context log stream for the default log handler. */
void assuan_set_log_stream (assuan_context_t ctx, FILE *fp);
diff --git a/src/context.c b/src/context.c
index 42ec439..2be3a31 100644
--- a/src/context.c
+++ b/src/context.c
@@ -42,8 +42,11 @@ assuan_set_pointer (assuan_context_t ctx, void *user_pointer)
void *
assuan_get_pointer (assuan_context_t ctx)
{
+#if 0
+ /* This is called often. */
TRACE1 (ctx, ASSUAN_LOG_CTX, "assuan_get_pointer", ctx,
"ctx->user_pointer=%p", ctx ? ctx->user_pointer : NULL);
+#endif
if (! ctx)
return NULL;
@@ -177,6 +180,9 @@ assuan_set_error (assuan_context_t ctx, gpg_error_t err, const char *text)
pid_t
assuan_get_pid (assuan_context_t ctx)
{
+ TRACE1 (ctx, ASSUAN_LOG_CTX, "assuan_get_pid", ctx,
+ "pid=%i", ctx ? ctx->pid : -1);
+
return (ctx && ctx->pid) ? ctx->pid : ASSUAN_INVALID_PID;
}
@@ -186,6 +192,8 @@ assuan_get_pid (assuan_context_t ctx)
gpg_error_t
assuan_get_peercred (assuan_context_t ctx, assuan_peercred_t *peercred)
{
+ TRACE (ctx, ASSUAN_LOG_CTX, "assuan_get_peercred", ctx);
+
if (!ctx)
return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE);
if (!ctx->peercred_valid)
diff --git a/src/libassuan.def b/src/libassuan.def
index 510d081..7896acb 100644
--- a/src/libassuan.def
+++ b/src/libassuan.def
@@ -64,35 +64,36 @@ EXPORTS
assuan_send_data @43
assuan_sendfd @44
assuan_set_assuan_log_prefix @45
- assuan_set_error @46
- assuan_set_flag @47
- assuan_set_gpg_err_source @48
- assuan_set_hello_line @49
- assuan_set_io_monitor @50
- assuan_set_log_cb @51
- assuan_set_log_stream @52
- assuan_set_malloc_hooks @53
- assuan_set_okay_line @54
- assuan_set_pointer @55
- assuan_set_system_hooks @56
- assuan_sock_bind @57
- assuan_sock_check_nonce @58
- assuan_sock_close @59
- assuan_sock_connect @60
- assuan_sock_deinit @61
- assuan_sock_get_nonce @62
- assuan_sock_init @63
- assuan_sock_new @64
- assuan_socket_connect @65
- assuan_transact @66
- assuan_write_line @67
- assuan_write_status @68
- __assuan_close @69
- __assuan_pipe @70
- __assuan_socketpair @71
- __assuan_spawn @72
- __assuan_usleep @73
- assuan_fdopen @74
+ assuan_set_assuan_log_stream @46
+ assuan_set_error @47
+ assuan_set_flag @48
+ assuan_set_gpg_err_source @49
+ assuan_set_hello_line @50
+ assuan_set_io_monitor @51
+ assuan_set_log_cb @52
+ assuan_set_log_stream @53
+ assuan_set_malloc_hooks @54
+ assuan_set_okay_line @55
+ assuan_set_pointer @56
+ assuan_set_system_hooks @57
+ assuan_sock_bind @58
+ assuan_sock_check_nonce @59
+ assuan_sock_close @60
+ assuan_sock_connect @61
+ assuan_sock_deinit @62
+ assuan_sock_get_nonce @63
+ assuan_sock_init @64
+ assuan_sock_new @65
+ assuan_socket_connect @66
+ assuan_transact @67
+ assuan_write_line @68
+ assuan_write_status @69
+ __assuan_close @70
+ __assuan_pipe @71
+ __assuan_socketpair @72
+ __assuan_spawn @73
+ __assuan_usleep @74
+ assuan_fdopen @75
; END
diff --git a/src/libassuan.vers b/src/libassuan.vers
index 587127e..f7b8559 100644
--- a/src/libassuan.vers
+++ b/src/libassuan.vers
@@ -70,6 +70,7 @@ LIBASSUAN_1.0 {
assuan_send_data;
assuan_sendfd;
assuan_set_assuan_log_prefix;
+ assuan_set_assuan_log_stream;
assuan_set_error;
assuan_set_flag;
assuan_set_gpg_err_source;
diff --git a/src/system.c b/src/system.c
index 852ec11..afbe8a7 100644
--- a/src/system.c
+++ b/src/system.c
@@ -192,9 +192,6 @@ __assuan_pipe (assuan_context_t ctx, assuan_fd_t fd[2], int inherit_idx)
HANDLE wh;
HANDLE th;
SECURITY_ATTRIBUTES sec_attr;
- TRACE_BEG2 (ctx, ASSUAN_LOG_SYSIO, "__assuan_pipe", ctx,
- "inherit_idx=%i (Assuan uses it for %s)",
- inherit_idx, inherit_idx ? "reading" : "writing");
memset (&sec_attr, 0, sizeof (sec_attr));
sec_attr.nLength = sizeof (sec_attr);
@@ -202,20 +199,22 @@ __assuan_pipe (assuan_context_t ctx, assuan_fd_t fd[2], int inherit_idx)
if (! CreatePipe (&rh, &wh, &sec_attr, 0))
{
- TRACE_LOG1 ("CreatePipe failed: %s", _assuan_w32_strerror (ctx, -1));
+ TRACE1 (ctx, ASSUAN_LOG_SYSIO, "__assuan_pipe", ctx,
+ "CreatePipe failed: %s", _assuan_w32_strerror (ctx, -1));
errno = EIO;
- return TRACE_SYSRES (-1);
+ return -1;
}
if (! DuplicateHandle (GetCurrentProcess(), (inherit_idx == 0) ? rh : wh,
GetCurrentProcess(), &th, 0,
TRUE, DUPLICATE_SAME_ACCESS ))
{
- TRACE_LOG1 ("DuplicateHandle failed: %s", _assuan_w32_strerror (ctx, -1));
+ TRACE1 (ctx, ASSUAN_LOG_SYSIO, "__assuan_pipe", ctx,
+ "DuplicateHandle failed: %s", _assuan_w32_strerror (ctx, -1));
CloseHandle (rh);
CloseHandle (wh);
errno = EIO;
- return TRACE_SYSRES (-1);
+ return -1;
}
if (inherit_idx == 0)
{
@@ -231,7 +230,7 @@ __assuan_pipe (assuan_context_t ctx, assuan_fd_t fd[2], int inherit_idx)
fd[0] = rh;
fd[1] = wh;
- return TRACE_SUC ();
+ return 0;
#else
return pipe (fd);
#endif
@@ -242,7 +241,16 @@ __assuan_pipe (assuan_context_t ctx, assuan_fd_t fd[2], int inherit_idx)
int
_assuan_pipe (assuan_context_t ctx, assuan_fd_t fd[2], int inherit_idx)
{
- return (ctx->system.pipe) (ctx, fd, inherit_idx);
+ int err;
+ TRACE_BEG2 (ctx, ASSUAN_LOG_SYSIO, "_assuan_pipe", ctx,
+ "inherit_idx=%i (Assuan uses it for %s)",
+ inherit_idx, inherit_idx ? "reading" : "writing");
+
+ err = (ctx->system.pipe) (ctx, fd, inherit_idx);
+ if (err)
+ return TRACE_SYSRES (err);
+
+ return TRACE_SUC2 ("read=0x%x, write=0x%x", fd[0], fd[1]);
}
@@ -341,7 +349,15 @@ __assuan_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size)
ssize_t
_assuan_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size)
{
+#if 0
+ ssize_t res;
+ TRACE_BEG3 (ctx, ASSUAN_LOG_SYSIO, "_assuan_read", ctx,
+ "fd=0x%x, buffer=%p, size=%i", fd, buffer, size);
+ res = (ctx->system.read) (ctx, fd, buffer, size);
+ return TRACE_SYSRES (res);
+#else
return (ctx->system.read) (ctx, fd, buffer, size);
+#endif
}
@@ -390,7 +406,15 @@ ssize_t
_assuan_write (assuan_context_t ctx, assuan_fd_t fd, const void *buffer,
size_t size)
{
+#if 0
+ ssize_t res;
+ TRACE_BEG3 (ctx, ASSUAN_LOG_SYSIO, "_assuan_write", ctx,
+ "fd=0x%x, buffer=%p, size=%i", fd, buffer, size);
+ res = (ctx->system.write) (ctx, fd, buffer, size);
+ return TRACE_SYSRES (res);
+#else
return (ctx->system.write) (ctx, fd, buffer, size);
+#endif
}