* server.c (option_handler): Allow to use -2 for "send all certs
[gnupg.git] / assuan / assuan-pipe-server.c
index 3dd0ab0..5c5d124 100644 (file)
 
 #include "assuan-defs.h"
 
+static void
+deinit_pipe_server (ASSUAN_CONTEXT ctx)
+{
+  /* nothing to do for this simple server */
+}
+
+static int
+accept_connection (ASSUAN_CONTEXT ctx)
+{
+  /* This is a NOP for a pipe server */
+  return 0;
+}
+
+static int
+finish_connection (ASSUAN_CONTEXT ctx)
+{
+  /* This is a NOP for a pipe server */
+  return 0;
+}
 
+
+/* Create a new context.  Note that the handlers are set up for a pipe
+   server/client - this wau we don't need extra dummy functions */
 int
-assuan_init_pipe_server (ASSUAN_CONTEXT *r_ctx, int filedes[2])
+_assuan_new_context (ASSUAN_CONTEXT *r_ctx)
 {
   ASSUAN_CONTEXT ctx;
   int rc;
@@ -38,8 +60,15 @@ assuan_init_pipe_server (ASSUAN_CONTEXT *r_ctx, int filedes[2])
   ctx->input_fd = -1;
   ctx->output_fd = -1;
 
-  ctx->inbound.fd = filedes[0];
-  ctx->outbound.fd = filedes[0];
+  ctx->inbound.fd = -1;
+  ctx->outbound.fd = -1;
+
+  ctx->listen_fd = -1;
+  ctx->client_pid = (pid_t)-1;
+  /* use the pipe server handler as a default */
+  ctx->deinit_handler = deinit_pipe_server;
+  ctx->accept_handler = accept_connection;
+  ctx->finish_handler = finish_connection;
 
   rc = _assuan_register_std_commands (ctx);
   if (rc)
@@ -49,19 +78,47 @@ assuan_init_pipe_server (ASSUAN_CONTEXT *r_ctx, int filedes[2])
   return rc;
 }
 
-void
-assuan_deinit_pipe_server (ASSUAN_CONTEXT ctx)
-{
-  xfree (ctx);
-}
-
-
-
-
 
 
+int
+assuan_init_pipe_server (ASSUAN_CONTEXT *r_ctx, int filedes[2])
+{
+  int rc;
 
+  rc = _assuan_new_context (r_ctx);
+  if (!rc)
+    {
+      ASSUAN_CONTEXT ctx = *r_ctx;
 
+      ctx->is_server = 1;
+      ctx->inbound.fd = filedes[0];
+      ctx->outbound.fd = filedes[1];
+      ctx->pipe_mode = 1;
+    }
+  return rc;
+}
 
 
+void
+_assuan_release_context (ASSUAN_CONTEXT ctx)
+{
+  if (ctx)
+    {
+      xfree (ctx->hello_line);
+      xfree (ctx->okay_line);
+      xfree (ctx);
+    }
+}
 
+void
+assuan_deinit_server (ASSUAN_CONTEXT ctx)
+{
+  if (ctx)
+    {
+      /* We use this function pointer to avoid linking other server
+         when not needed but still allow for a generic deinit function */
+      ctx->deinit_handler (ctx);
+      ctx->deinit_handler = NULL;
+      _assuan_release_context (ctx);
+    }
+}