Set DISPLAY environment variable if --display option
[pinentry-qt.git] / assuan-listen.c
1 /* assuan-listen.c - Wait for a connection (server) 
2  *      Copyright (C) 2001 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * 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 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <string.h>
27 #ifndef HAVE_W32_SYSTEM
28 # include <unistd.h>
29 #endif
30 #ifdef HAVE_W32CE_SYSTEM
31 #  define close CloseHandle
32 #endif
33
34 #include "assuan-defs.h"
35
36 AssuanError
37 assuan_set_hello_line (ASSUAN_CONTEXT ctx, const char *line)
38 {
39   if (!ctx)
40     return ASSUAN_Invalid_Value;
41   if (!line)
42     {
43       xfree (ctx->hello_line);
44       ctx->hello_line = NULL;
45     }
46   else
47     {
48       char *buf = xtrymalloc (3+strlen(line)+1);
49       if (!buf)
50         return ASSUAN_Out_Of_Core;
51       strcpy (buf, "OK ");
52       strcpy (buf+3, line);
53       xfree (ctx->hello_line);
54       ctx->hello_line = buf;
55     }
56   return 0;
57 }
58
59
60 /**
61  * assuan_accept:
62  * @ctx: context
63  * 
64  * Cancel any existing connectiion and wait for a connection from a
65  * client.  The initial handshake is performed which may include an
66  * initial authentication or encryption negotiation.
67  * 
68  * Return value: 0 on success or an error if the connection could for
69  * some reason not be established.
70  **/
71 AssuanError
72 assuan_accept (ASSUAN_CONTEXT ctx)
73 {
74   int rc;
75
76   if (!ctx)
77     return ASSUAN_Invalid_Value;
78
79   if (ctx->pipe_mode > 1)
80     return -1; /* second invocation for pipemode -> terminate */
81   ctx->finish_handler (ctx);
82
83   rc = ctx->accept_handler (ctx);
84   if (rc)
85     return rc;
86
87   /* send the hello */
88   rc = assuan_write_line (ctx, ctx->hello_line? ctx->hello_line
89                                               : "OK Your orders please");
90   if (rc)
91     return rc;
92   
93   if (ctx->pipe_mode)
94     ctx->pipe_mode = 2;
95   
96   return 0;
97 }
98
99
100
101 int
102 assuan_get_input_fd (ASSUAN_CONTEXT ctx)
103 {
104   return ctx? ctx->input_fd : -1;
105 }
106
107
108 int
109 assuan_get_output_fd (ASSUAN_CONTEXT ctx)
110 {
111   return ctx? ctx->output_fd : -1;
112 }
113
114
115 /* Close the fd descriptor set by the command INPUT FD=n.  We handle
116    this fd inside assuan so that we can do some initial checks */
117 AssuanError
118 assuan_close_input_fd (ASSUAN_CONTEXT ctx)
119 {
120   if (!ctx || ctx->input_fd == -1)
121     return ASSUAN_Invalid_Value;
122   close (ctx->input_fd);
123   ctx->input_fd = -1;
124   return 0;
125 }
126
127 /* Close the fd descriptor set by the command OUTPUT FD=n.  We handle
128    this fd inside assuan so that we can do some initial checks */
129 AssuanError
130 assuan_close_output_fd (ASSUAN_CONTEXT ctx)
131 {
132   if (!ctx || ctx->output_fd == -1)
133     return ASSUAN_Invalid_Value;
134
135   close (ctx->output_fd);
136   ctx->output_fd = -1;
137   return 0;
138 }
139