Add entry about AC_CONFIG_MACRO_DIR.
[gpgme.git] / assuan / assuan-pipe-server.c
1 /* assuan-pipe-server.c - Assuan server working over a pipe 
2  *      Copyright (C) 2001, 2002 Free Software Foundation, Inc.
3  *
4  * This file is part of Assuan.
5  *
6  * Assuan is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Assuan is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 
19  */
20
21 #include <config.h>
22 #include <stdlib.h>
23 #include <stdio.h>
24 #include <unistd.h>
25
26 #include "assuan-defs.h"
27
28 static void
29 deinit_pipe_server (ASSUAN_CONTEXT ctx)
30 {
31   /* nothing to do for this simple server */
32 }
33
34 static int
35 accept_connection (ASSUAN_CONTEXT ctx)
36 {
37   /* This is a NOP for a pipe server */
38   return 0;
39 }
40
41 static int
42 finish_connection (ASSUAN_CONTEXT ctx)
43 {
44   /* This is a NOP for a pipe server */
45   return 0;
46 }
47
48 /* Create a new context.  Note that the handlers are set up for a pipe
49    server/client - this way we don't need extra dummy functions */
50 int
51 _assuan_new_context (ASSUAN_CONTEXT *r_ctx)
52 {
53   static struct assuan_io io = { _assuan_simple_read,
54                                  _assuan_simple_write,
55                                  0, 0 };
56
57   ASSUAN_CONTEXT ctx;
58   int rc;
59
60   *r_ctx = NULL;
61   ctx = xtrycalloc (1, sizeof *ctx);
62   if (!ctx)
63     return ASSUAN_Out_Of_Core;
64   ctx->input_fd = -1;
65   ctx->output_fd = -1;
66
67   ctx->inbound.fd = -1;
68   ctx->outbound.fd = -1;
69   ctx->io = &io;
70
71   ctx->listen_fd = -1;
72   ctx->client_pid = (pid_t)-1;
73   /* Use the pipe server handler as a default.  */
74   ctx->deinit_handler = deinit_pipe_server;
75   ctx->accept_handler = accept_connection;
76   ctx->finish_handler = finish_connection;
77
78   rc = _assuan_register_std_commands (ctx);
79   if (rc)
80     xfree (ctx);
81   else
82     *r_ctx = ctx;
83   return rc;
84 }
85
86
87
88 int
89 assuan_init_pipe_server (ASSUAN_CONTEXT *r_ctx, int filedes[2])
90 {
91   int rc;
92
93   rc = _assuan_new_context (r_ctx);
94   if (!rc)
95     {
96       ASSUAN_CONTEXT ctx = *r_ctx;
97
98       ctx->is_server = 1;
99       ctx->inbound.fd = filedes[0];
100       ctx->outbound.fd = filedes[1];
101       ctx->pipe_mode = 1;
102     }
103   return rc;
104 }
105
106
107 void
108 _assuan_release_context (ASSUAN_CONTEXT ctx)
109 {
110   if (ctx)
111     {
112       xfree (ctx->hello_line);
113       xfree (ctx->okay_line);
114       xfree (ctx);
115     }
116 }
117
118 void
119 assuan_deinit_server (ASSUAN_CONTEXT ctx)
120 {
121   if (ctx)
122     {
123       /* We use this function pointer to avoid linking other server
124          when not needed but still allow for a generic deinit function.  */
125       ctx->deinit_handler (ctx);
126       ctx->deinit_handler = NULL;
127       _assuan_release_context (ctx);
128     }
129 }