Merged changes from upstream libassuan to allow building a W32 DLL.
[gpgme.git] / assuan / assuan.h
1 /* assuan.c - Definitions for the Assuan IPC library
2  * Copyright (C) 2001, 2002, 2003, 2005 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 #ifndef ASSUAN_H
22 #define ASSUAN_H
23
24 #include <stdio.h>
25 #include <sys/types.h>
26 #include <unistd.h>
27
28
29 /* To use this file with libraries the following macros are often
30    useful:
31
32    #define _ASSUAN_EXT_SYM_PREFIX _foo_
33    
34      This prefixes all external symbols with "_foo_".
35
36    #define _ASSUAN_NO_PTH 
37
38      This avoids inclusion of special GNU Pth hacks.
39
40    #define _ASSUAN_NO_FIXED_SIGNALS 
41
42      This disables changing of certain signal handler; i.e. SIGPIPE.
43
44    #define _ASSUAN_USE_DOUBLE_FORK
45
46      Use a double fork approach when connecting to a server through a pipe.
47  */
48 /**** Begin GPGME specific modifications. ******/
49 #define _ASSUAN_EXT_SYM_PREFIX _gpgme_
50 #define _ASSUAN_NO_PTH 
51 #define _ASSUAN_NO_FIXED_SIGNALS 
52 #define _ASSUAN_USE_DOUBLE_FORK
53
54 #ifdef _ASSUAN_IN_GPGME_BUILD_ASSUAN
55 int _gpgme_io_read (int fd, void *buffer, size_t count);
56 int _gpgme_io_write (int fd, const void *buffer, size_t count);
57 ssize_t _gpgme_ath_waitpid (pid_t pid, int *status, int options);
58 #ifdef HAVE_W32_SYSTEM
59 int _gpgme_ath_accept (int s, void *addr, int *length_ptr);
60 #else /*!HAVE_W32_SYSTEM*/
61 ssize_t _gpgme_ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,
62                            struct timeval *timeout);
63 int _gpgme_ath_accept (int s, struct sockaddr *addr, socklen_t *length_ptr);
64 int _gpgme_ath_connect (int s, struct sockaddr *addr, socklen_t length);
65 int _gpgme_ath_sendmsg (int s, const struct msghdr *msg, int flags);
66 int _gpgme_ath_recvmsg (int s, struct msghdr *msg, int flags);
67 #endif /*!HAVE_W32_SYSTEM*/
68
69 #define read          _gpgme_io_read
70 #define write         _gpgme_io_write
71 #define waitpid       _gpgme_ath_waitpid
72 #define select        _gpgme_ath_select
73 #define accept        _gpgme_ath_accept
74 #define connect       _gpgme_ath_connect
75 #define sendmsg       _gpgme_ath_sendmsg
76 #define recvmsg       _gpgme_ath_recvmsg
77 #endif /*_ASSUAN_IN_GPGME_BUILD_ASSUAN*/
78 /**** End GPGME specific modifications. ******/
79
80
81 #ifdef _ASSUAN_EXT_SYM_PREFIX
82 #define _ASSUAN_PREFIX1(x,y) x ## y
83 #define _ASSUAN_PREFIX2(x,y) _ASSUAN_PREFIX1(x,y)
84 #define _ASSUAN_PREFIX(x) _ASSUAN_PREFIX2(_ASSUAN_EXT_SYM_PREFIX,x)
85 #define assuan_ _ASSUAN_PREFIX(assuan_)
86 #define assuan_register_command _ASSUAN_PREFIX(assuan_register_command)
87 #define assuan_register_bye_notify _ASSUAN_PREFIX(assuan_register_bye_notify)
88 #define assuan_register_reset_notify \
89   _ASSUAN_PREFIX(assuan_register_reset_notify)
90 #define assuan_register_cancel_notify \
91   _ASSUAN_PREFIX(assuan_register_cancel_notify)
92 #define assuan_register_input_notify \
93   _ASSUAN_PREFIX(assuan_register_input_notify)
94 #define assuan_register_output_notify \
95   _ASSUAN_PREFIX(assuan_register_output_notify)
96 #define assuan_register_option_handler \
97   _ASSUAN_PREFIX(assuan_register_option_handler)
98 #define assuan_process _ASSUAN_PREFIX(assuan_process)
99 #define assuan_process_next _ASSUAN_PREFIX(assuan_process_next)
100 #define assuan_get_active_fds _ASSUAN_PREFIX(assuan_get_active_fds)
101 #define assuan_get_data_fp _ASSUAN_PREFIX(assuan_get_data_fp)
102 #define assuan_set_okay_line _ASSUAN_PREFIX(assuan_set_okay_line)
103 #define assuan_write_status _ASSUAN_PREFIX(assuan_write_status)
104 #define assuan_command_parse_fd _ASSUAN_PREFIX(assuan_command_parse_fd)
105 #define assuan_set_hello_line _ASSUAN_PREFIX(assuan_set_hello_line)
106 #define assuan_accept _ASSUAN_PREFIX(assuan_accept)
107 #define assuan_get_input_fd _ASSUAN_PREFIX(assuan_get_input_fd)
108 #define assuan_get_output_fd _ASSUAN_PREFIX(assuan_get_output_fd)
109 #define assuan_close_input_fd _ASSUAN_PREFIX(assuan_close_input_fd)
110 #define assuan_close_output_fd _ASSUAN_PREFIX(assuan_close_output_fd)
111 #define assuan_init_pipe_server _ASSUAN_PREFIX(assuan_init_pipe_server)
112 #define assuan_deinit_server _ASSUAN_PREFIX(assuan_deinit_server)
113 #define assuan_init_socket_server _ASSUAN_PREFIX(assuan_init_socket_server)
114 #define assuan_init_connected_socket_server \
115   _ASSUAN_PREFIX(assuan_init_connected_socket_server)
116 #define assuan_pipe_connect _ASSUAN_PREFIX(assuan_pipe_connect)
117 #define assuan_socket_connect _ASSUAN_PREFIX(assuan_socket_connect)
118 #define assuan_domain_connect _ASSUAN_PREFIX(assuan_domain_connect)
119 #define assuan_init_domain_server _ASSUAN_PREFIX(assuan_init_domain_server)
120 #define assuan_disconnect _ASSUAN_PREFIX(assuan_disconnect)
121 #define assuan_get_pid _ASSUAN_PREFIX(assuan_get_pid)
122 #define assuan_transact _ASSUAN_PREFIX(assuan_transact)
123 #define assuan_inquire _ASSUAN_PREFIX(assuan_inquire)
124 #define assuan_read_line _ASSUAN_PREFIX(assuan_read_line)
125 #define assuan_pending_line _ASSUAN_PREFIX(assuan_pending_line)
126 #define assuan_write_line _ASSUAN_PREFIX(assuan_write_line)
127 #define assuan_send_data _ASSUAN_PREFIX(assuan_send_data)
128 #define assuan_sendfd _ASSUAN_PREFIX(assuan_sendfd)
129 #define assuan_receivefd _ASSUAN_PREFIX(assuan_receivefd)
130 #define assuan_set_malloc_hooks _ASSUAN_PREFIX(assuan_set_malloc_hooks)
131 #define assuan_set_log_stream _ASSUAN_PREFIX(assuan_set_log_stream)
132 #define assuan_set_error _ASSUAN_PREFIX(assuan_set_error)
133 #define assuan_set_pointer _ASSUAN_PREFIX(assuan_set_pointer)
134 #define assuan_get_pointer _ASSUAN_PREFIX(assuan_get_pointer)
135 #define assuan_begin_confidential _ASSUAN_PREFIX(assuan_begin_confidential)
136 #define assuan_end_confidential _ASSUAN_PREFIX(assuan_end_confidential)
137 #define assuan_strerror _ASSUAN_PREFIX(assuan_strerror)
138 #define assuan_set_assuan_log_stream \
139   _ASSUAN_PREFIX(assuan_set_assuan_log_stream)
140 #define assuan_get_assuan_log_stream \
141   _ASSUAN_PREFIX(assuan_get_assuan_log_stream)
142 #define assuan_get_assuan_log_prefix \
143   _ASSUAN_PREFIX(assuan_get_assuan_log_prefix)
144 #define assuan_set_flag _ASSUAN_PREFIX(assuan_set_flag)
145 #define assuan_get_flag _ASSUAN_PREFIX(assuan_get_flag)
146
147 /* And now the internal functions, argh...  */
148 #define _assuan_read_line _ASSUAN_PREFIX(_assuan_read_line)
149 #define _assuan_cookie_write_data _ASSUAN_PREFIX(_assuan_cookie_write_data)
150 #define _assuan_cookie_write_flush _ASSUAN_PREFIX(_assuan_cookie_write_flush)
151 #define _assuan_read_from_server _ASSUAN_PREFIX(_assuan_read_from_server)
152 #define _assuan_domain_init _ASSUAN_PREFIX(_assuan_domain_init)
153 #define _assuan_register_std_commands \
154   _ASSUAN_PREFIX(_assuan_register_std_commands)
155 #define _assuan_simple_read _ASSUAN_PREFIX(_assuan_simple_read)
156 #define _assuan_simple_write _ASSUAN_PREFIX(_assuan_simple_write)
157 #define _assuan_simple_read _ASSUAN_PREFIX(_assuan_simple_read)
158 #define _assuan_simple_write _ASSUAN_PREFIX(_assuan_simple_write)
159 #define _assuan_new_context _ASSUAN_PREFIX(_assuan_new_context)
160 #define _assuan_release_context _ASSUAN_PREFIX(_assuan_release_context)
161 #define _assuan_malloc _ASSUAN_PREFIX(_assuan_malloc)
162 #define _assuan_realloc _ASSUAN_PREFIX(_assuan_realloc)
163 #define _assuan_calloc _ASSUAN_PREFIX(_assuan_calloc)
164 #define _assuan_free _ASSUAN_PREFIX(_assuan_free)
165 #define _assuan_log_print_buffer _ASSUAN_PREFIX(_assuan_log_print_buffer)
166 #define _assuan_log_sanitized_string \
167   _ASSUAN_PREFIX(_assuan_log_sanitized_string)
168 #define _assuan_log_printf _ASSUAN_PREFIX(_assuan_log_printf)
169 #define _assuan_set_default_log_stream \
170   _ASSUAN_PREFIX(_assuan_set_default_log_stream)
171 #define _assuan_w32_strerror _ASSUAN_PREFIX(_assuan_w32_strerror)
172 #define _assuan_write_line _ASSUAN_PREFIX(_assuan_write_line)
173 #define _assuan_close _ASSUAN_PREFIX(_assuan_close)   
174 #define _assuan_sock_new _ASSUAN_PREFIX(_assuan_sock_new)  
175 #define _assuan_sock_bind _ASSUAN_PREFIX(_assuan_sock_bind)
176 #define _assuan_sock_connect _ASSUAN_PREFIX(_assuan_sock_connect)
177
178 #endif /*_ASSUAN_EXT_SYM_PREFIX*/
179
180
181 #ifdef __cplusplus
182 extern "C"
183 {
184 #if 0
185 }
186 #endif
187 #endif
188
189
190 typedef enum
191 {
192   ASSUAN_No_Error = 0,
193   ASSUAN_General_Error = 1,
194   ASSUAN_Out_Of_Core = 2,
195   ASSUAN_Invalid_Value = 3,
196   ASSUAN_Timeout = 4,
197   ASSUAN_Read_Error = 5,
198   ASSUAN_Write_Error = 6,
199   ASSUAN_Problem_Starting_Server = 7,
200   ASSUAN_Not_A_Server = 8,
201   ASSUAN_Not_A_Client = 9,
202   ASSUAN_Nested_Commands = 10,
203   ASSUAN_Invalid_Response = 11,
204   ASSUAN_No_Data_Callback = 12,
205   ASSUAN_No_Inquire_Callback = 13,
206   ASSUAN_Connect_Failed = 14,
207   ASSUAN_Accept_Failed = 15,
208
209   /* Error codes above 99 are meant as status codes */
210   ASSUAN_Not_Implemented = 100,
211   ASSUAN_Server_Fault    = 101,
212   ASSUAN_Invalid_Command = 102,
213   ASSUAN_Unknown_Command = 103,
214   ASSUAN_Syntax_Error    = 104,
215   ASSUAN_Parameter_Error = 105,
216   ASSUAN_Parameter_Conflict = 106,
217   ASSUAN_Line_Too_Long = 107,
218   ASSUAN_Line_Not_Terminated = 108,
219   ASSUAN_No_Input = 109,
220   ASSUAN_No_Output = 110,
221   ASSUAN_Canceled = 111,
222   ASSUAN_Unsupported_Algorithm = 112,
223   ASSUAN_Server_Resource_Problem = 113,
224   ASSUAN_Server_IO_Error = 114,
225   ASSUAN_Server_Bug = 115,
226   ASSUAN_No_Data_Available = 116,
227   ASSUAN_Invalid_Data = 117,
228   ASSUAN_Unexpected_Command = 118,
229   ASSUAN_Too_Much_Data = 119,
230   ASSUAN_Inquire_Unknown = 120,
231   ASSUAN_Inquire_Error = 121,
232   ASSUAN_Invalid_Option = 122,
233   ASSUAN_Invalid_Index = 123,
234   ASSUAN_Unexpected_Status = 124,
235   ASSUAN_Unexpected_Data = 125,
236   ASSUAN_Invalid_Status = 126,
237   ASSUAN_Locale_Problem = 127,
238   ASSUAN_Not_Confirmed = 128,
239
240   /* Warning: Don't use the rror codes, below they are deprecated. */
241   ASSUAN_Bad_Certificate = 201,
242   ASSUAN_Bad_Certificate_Chain = 202,
243   ASSUAN_Missing_Certificate = 203,
244   ASSUAN_Bad_Signature = 204,
245   ASSUAN_No_Agent = 205,
246   ASSUAN_Agent_Error = 206,
247   ASSUAN_No_Public_Key = 207,
248   ASSUAN_No_Secret_Key = 208,
249   ASSUAN_Invalid_Name = 209,
250
251   ASSUAN_Cert_Revoked = 301,
252   ASSUAN_No_CRL_For_Cert = 302,
253   ASSUAN_CRL_Too_Old = 303,
254   ASSUAN_Not_Trusted = 304,
255
256   ASSUAN_Card_Error = 401,
257   ASSUAN_Invalid_Card = 402,
258   ASSUAN_No_PKCS15_App = 403,
259   ASSUAN_Card_Not_Present = 404,
260   ASSUAN_Invalid_Id = 405,
261
262   /* Error codes in the range 1000 to 9999 may be used by applications
263      at their own discretion. */
264   ASSUAN_USER_ERROR_FIRST = 1000,
265   ASSUAN_USER_ERROR_LAST = 9999
266
267 } assuan_error_t;
268
269 typedef assuan_error_t AssuanError; /* Deprecated. */
270
271 /* This is a list of pre-registered ASSUAN commands */
272 /* NOTE, these command IDs are now deprectated and solely exists for
273    compatibility reasons. */
274 typedef enum
275 {
276   ASSUAN_CMD_NOP = 0,
277   ASSUAN_CMD_CANCEL,    /* cancel the current request */
278   ASSUAN_CMD_BYE,
279   ASSUAN_CMD_AUTH,
280   ASSUAN_CMD_RESET,
281   ASSUAN_CMD_OPTION,
282   ASSUAN_CMD_DATA,
283   ASSUAN_CMD_END,
284   ASSUAN_CMD_INPUT,
285   ASSUAN_CMD_OUTPUT,
286
287   ASSUAN_CMD_USER = 256  /* Other commands should be used with this offset*/
288 } AssuanCommand;
289
290
291 /* Definitions of flags for assuan_set_flag(). */
292 typedef enum
293   {
294     /* When using a pipe server, by default Assuan will wait for the
295        forked process to die in assuan_disconnect.  In certain cases
296        this is not desirable.  By setting this flag, the waitpid will
297        be skipped and the caller is responsible to cleanup a forked
298        process. */
299     ASSUAN_NO_WAITPID = 1
300   } 
301 assuan_flag_t;
302
303 #define ASSUAN_LINELENGTH 1002 /* 1000 + [CR,]LF */
304
305 struct assuan_context_s;
306 typedef struct assuan_context_s *assuan_context_t;
307 typedef struct assuan_context_s *ASSUAN_CONTEXT;
308
309 /*-- assuan-handler.c --*/
310 int assuan_register_command (assuan_context_t ctx,
311                              const char *cmd_string,
312                              int (*handler)(assuan_context_t, char *));
313 int assuan_register_bye_notify (assuan_context_t ctx,
314                                 void (*fnc)(assuan_context_t));
315 int assuan_register_reset_notify (assuan_context_t ctx,
316                                   void (*fnc)(assuan_context_t));
317 int assuan_register_cancel_notify (assuan_context_t ctx,
318                                    void (*fnc)(assuan_context_t));
319 int assuan_register_input_notify (assuan_context_t ctx,
320                                   void (*fnc)(assuan_context_t, const char *));
321 int assuan_register_output_notify (assuan_context_t ctx,
322                                   void (*fnc)(assuan_context_t, const char *));
323
324 int assuan_register_option_handler (assuan_context_t ctx,
325                                     int (*fnc)(assuan_context_t,
326                                                const char*, const char*));
327
328 int assuan_process (assuan_context_t ctx);
329 int assuan_process_next (assuan_context_t ctx);
330 int assuan_get_active_fds (assuan_context_t ctx, int what,
331                            int *fdarray, int fdarraysize);
332
333
334 FILE *assuan_get_data_fp (assuan_context_t ctx);
335 assuan_error_t assuan_set_okay_line (assuan_context_t ctx, const char *line);
336 assuan_error_t assuan_write_status (assuan_context_t ctx,
337                                     const char *keyword, const char *text);
338
339 /* Negotiate a file descriptor.  If LINE contains "FD=N", returns N
340    assuming a local file descriptor.  If LINE contains "FD" reads a
341    file descriptor via CTX and stores it in *RDF (the CTX must be
342    capable of passing file descriptors).  */
343 assuan_error_t assuan_command_parse_fd (assuan_context_t ctx, char *line,
344                                      int *rfd);
345
346 /*-- assuan-listen.c --*/
347 assuan_error_t assuan_set_hello_line (assuan_context_t ctx, const char *line);
348 assuan_error_t assuan_accept (assuan_context_t ctx);
349 int assuan_get_input_fd (assuan_context_t ctx);
350 int assuan_get_output_fd (assuan_context_t ctx);
351 assuan_error_t assuan_close_input_fd (assuan_context_t ctx);
352 assuan_error_t assuan_close_output_fd (assuan_context_t ctx);
353
354
355 /*-- assuan-pipe-server.c --*/
356 int assuan_init_pipe_server (assuan_context_t *r_ctx, int filedes[2]);
357 void assuan_deinit_server (assuan_context_t ctx);
358
359 /*-- assuan-socket-server.c --*/
360 int assuan_init_socket_server (assuan_context_t *r_ctx, int listen_fd);
361 int assuan_init_connected_socket_server (assuan_context_t *r_ctx, int fd);
362
363
364 /*-- assuan-pipe-connect.c --*/
365 assuan_error_t assuan_pipe_connect (assuan_context_t *ctx, const char *name,
366                                  char *const argv[], int *fd_child_list);
367 assuan_error_t assuan_pipe_connect2 (assuan_context_t *ctx, const char *name,
368                                      char *const argv[], int *fd_child_list,
369                                      void (*atfork) (void*, int),
370                                      void *atforkvalue);
371 /*-- assuan-socket-connect.c --*/
372 assuan_error_t assuan_socket_connect (assuan_context_t *ctx, const char *name,
373                                       pid_t server_pid);
374
375 /*-- assuan-domain-connect.c --*/
376
377 /* Connect to a Unix domain socket server.  RENDEZVOUSFD is
378    bidirectional file descriptor (normally returned via socketpair)
379    which the client can use to rendezvous with the server.  SERVER s
380    the server's pid.  */
381 assuan_error_t assuan_domain_connect (assuan_context_t *r_ctx,
382                                    int rendezvousfd,
383                                    pid_t server);
384
385 /*-- assuan-domain-server.c --*/
386
387 /* RENDEZVOUSFD is a bidirectional file descriptor (normally returned
388    via socketpair) that the domain server can use to rendezvous with
389    the client.  CLIENT is the client's pid.  */
390 assuan_error_t assuan_init_domain_server (assuan_context_t *r_ctx,
391                                        int rendezvousfd,
392                                        pid_t client);
393
394
395 /*-- assuan-connect.c --*/
396 void assuan_disconnect (assuan_context_t ctx);
397 pid_t assuan_get_pid (assuan_context_t ctx);
398
399 /*-- assuan-client.c --*/
400 assuan_error_t 
401 assuan_transact (assuan_context_t ctx,
402                  const char *command,
403                  assuan_error_t (*data_cb)(void *, const void *, size_t),
404                  void *data_cb_arg,
405                  assuan_error_t (*inquire_cb)(void*, const char *),
406                  void *inquire_cb_arg,
407                  assuan_error_t (*status_cb)(void*, const char *),
408                  void *status_cb_arg);
409
410
411 /*-- assuan-inquire.c --*/
412 assuan_error_t assuan_inquire (assuan_context_t ctx, const char *keyword,
413                                unsigned char **r_buffer, size_t *r_length,
414                                size_t maxlen);
415
416 /*-- assuan-buffer.c --*/
417 assuan_error_t assuan_read_line (assuan_context_t ctx,
418                               char **line, size_t *linelen);
419 int assuan_pending_line (assuan_context_t ctx);
420 assuan_error_t assuan_write_line (assuan_context_t ctx, const char *line );
421 assuan_error_t assuan_send_data (assuan_context_t ctx,
422                               const void *buffer, size_t length);
423
424 /* The file descriptor must be pending before assuan_receivefd is
425    call.  This means that assuan_sendfd should be called *before* the
426    trigger is sent (normally via assuan_send_data ("I sent you a
427    descriptor")).  */
428 assuan_error_t assuan_sendfd (assuan_context_t ctx, int fd);
429 assuan_error_t assuan_receivefd (assuan_context_t ctx, int *fd);
430
431 /*-- assuan-util.c --*/
432 void assuan_set_malloc_hooks ( void *(*new_alloc_func)(size_t n),
433                                void *(*new_realloc_func)(void *p, size_t n),
434                                void (*new_free_func)(void*) );
435 void assuan_set_log_stream (assuan_context_t ctx, FILE *fp);
436 int assuan_set_error (assuan_context_t ctx, int err, const char *text);
437 void assuan_set_pointer (assuan_context_t ctx, void *pointer);
438 void *assuan_get_pointer (assuan_context_t ctx);
439
440 void assuan_begin_confidential (assuan_context_t ctx);
441 void assuan_end_confidential (assuan_context_t ctx);
442
443 /* For context CTX, set the flag FLAG to VALUE.  Values for flags
444    are usually 1 or 0 but certain flags might allow for other values;
445    see the description of the type assuan_flag_t for details. */
446 void assuan_set_flag (assuan_context_t ctx, assuan_flag_t flag, int value);
447
448 /* Return the VALUE of FLAG in context CTX. */ 
449 int  assuan_get_flag (assuan_context_t ctx, assuan_flag_t flag);
450
451
452 /*-- assuan-errors.c (built) --*/
453 const char *assuan_strerror (assuan_error_t err);
454
455 /*-- assuan-logging.c --*/
456
457 /* Set the stream to which assuan should log message not associated
458    with a context.  By default, this is stderr.  The default value
459    will be changed when the first log stream is associated with a
460    context.  Note, that this function is not thread-safe and should
461    in general be used right at startup. */
462 extern void assuan_set_assuan_log_stream (FILE *fp);
463
464 /* Return the stream which is currently being using for global logging.  */
465 extern FILE *assuan_get_assuan_log_stream (void);
466
467 /* Set the prefix to be used at the start of a line emitted by assuan
468    on the log stream.  The default is the empty string.  Note, that
469    this function is not thread-safe and should in general be used
470    right at startup. */
471 void assuan_set_assuan_log_prefix (const char *text);
472
473 /* Return a prefix to be used at the start of a line emitted by assuan
474    on the log stream.  The default implementation returns the empty
475    string, i.e. ""  */
476 const char *assuan_get_assuan_log_prefix (void);
477
478 #ifdef __cplusplus
479 }
480 #endif
481 #endif /* ASSUAN_H */