Obsolete option --no-sig-create-check.
[gnupg.git] / util / assuan-util.c
1 /* assuan-util.c - Utility functions for Assuan 
2  * Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
3  * Copyright (C) 2005 Free Software Foundation, Inc.
4  *
5  * This file is part of Assuan.
6  *
7  * Assuan is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as
9  * published by the Free Software Foundation; either version 2.1 of
10  * the License, or (at your option) any later version.
11  *
12  * Assuan is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 /* Please note that this is a stripped down and modified version of
22    the orginal Assuan code from libassuan. */
23
24 #include <config.h>
25 #include <stdlib.h>
26 #include <stdio.h>
27 #include <string.h>
28 #include <ctype.h>
29
30 #include "assuan-defs.h"
31
32
33 \f
34 /* Store the error in the context so that the error sending function
35   can take out a descriptive text.  Inside the assuan code, use the
36   macro set_error instead of this function. */
37 int
38 assuan_set_error (assuan_context_t ctx, int err, const char *text)
39 {
40   ctx->err_no = err;
41   ctx->err_str = text;
42   return err;
43 }
44
45 void
46 assuan_set_pointer (assuan_context_t ctx, void *pointer)
47 {
48   if (ctx)
49     ctx->user_pointer = pointer;
50 }
51
52 void *
53 assuan_get_pointer (assuan_context_t ctx)
54 {
55   return ctx? ctx->user_pointer : NULL;
56 }
57
58
59 void
60 assuan_set_log_stream (assuan_context_t ctx, FILE *fp)
61 {
62   if (ctx)
63     {
64       if (ctx->log_fp)
65         fflush (ctx->log_fp);
66       ctx->log_fp = fp;
67       _assuan_set_default_log_stream (fp);
68     }
69 }
70
71
72 void
73 assuan_begin_confidential (assuan_context_t ctx)
74 {
75   if (ctx)
76     {
77       ctx->confidential = 1;
78     }
79 }
80
81 void
82 assuan_end_confidential (assuan_context_t ctx)
83 {
84   if (ctx)
85     {
86       ctx->confidential = 0;
87     }
88 }
89
90 /* Dump a possibly binary string (used for debugging).  Distinguish
91    ascii text from binary and print it accordingly.  */
92 void
93 _assuan_log_print_buffer (FILE *fp, const void *buffer, size_t length)
94 {
95   const unsigned char *s;
96   int n;
97
98   for (n=length,s=buffer; n; n--, s++)
99     if  ((!isascii (*s) || iscntrl (*s) || !isprint (*s)) && !(*s >= 0x80))
100       break;
101
102   s = buffer;
103   if (!n && *s != '[')
104     fwrite (buffer, length, 1, fp);
105   else
106     {
107       putc ('[', fp);
108       for (n=0; n < length; n++, s++)
109           fprintf (fp, " %02x", *s);
110       putc (' ', fp);
111       putc (']', fp);
112     }
113 }
114
115 /* Log a user-supplied string.  Escapes non-printable before
116    printing.  */
117 void
118 _assuan_log_sanitized_string (const char *string)
119 {
120   const unsigned char *s = string;
121   FILE *fp = assuan_get_assuan_log_stream ();
122
123   if (! *s)
124     return;
125
126   for (; *s; s++)
127     {
128       int c = 0;
129
130       switch (*s)
131         {
132         case '\r':
133           c = 'r';
134           break;
135
136         case '\n':
137           c = 'n';
138           break;
139
140         case '\f':
141           c = 'f';
142           break;
143
144         case '\v':
145           c = 'v';
146           break;
147
148         case '\b':
149           c = 'b';
150           break;
151
152         default:
153           if ((isascii (*s) && isprint (*s)) || (*s >= 0x80))
154             putc (*s, fp);
155           else
156             {
157               putc ('\\', fp);
158               fprintf (fp, "x%02x", *s);
159             }
160         }
161
162       if (c)
163         {
164           putc ('\\', fp);
165           putc (c, fp);
166         }
167     }
168 }
169