* configure.ac: Add --disable-endian-check for building fat binaries
[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
18  * License along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20  * USA. 
21  */
22
23 /* Please note that this is a stripped down and modified version of
24    the orginal Assuan code from libassuan. */
25
26 #include <config.h>
27 #include <stdlib.h>
28 #include <stdio.h>
29 #include <string.h>
30 #include <ctype.h>
31
32 #include "assuan-defs.h"
33
34
35 \f
36 /* Store the error in the context so that the error sending function
37   can take out a descriptive text.  Inside the assuan code, use the
38   macro set_error instead of this function. */
39 int
40 assuan_set_error (assuan_context_t ctx, int err, const char *text)
41 {
42   ctx->err_no = err;
43   ctx->err_str = text;
44   return err;
45 }
46
47 void
48 assuan_set_pointer (assuan_context_t ctx, void *pointer)
49 {
50   if (ctx)
51     ctx->user_pointer = pointer;
52 }
53
54 void *
55 assuan_get_pointer (assuan_context_t ctx)
56 {
57   return ctx? ctx->user_pointer : NULL;
58 }
59
60
61 void
62 assuan_set_log_stream (assuan_context_t ctx, FILE *fp)
63 {
64   if (ctx)
65     {
66       if (ctx->log_fp)
67         fflush (ctx->log_fp);
68       ctx->log_fp = fp;
69       _assuan_set_default_log_stream (fp);
70     }
71 }
72
73
74 void
75 assuan_begin_confidential (assuan_context_t ctx)
76 {
77   if (ctx)
78     {
79       ctx->confidential = 1;
80     }
81 }
82
83 void
84 assuan_end_confidential (assuan_context_t ctx)
85 {
86   if (ctx)
87     {
88       ctx->confidential = 0;
89     }
90 }
91
92 /* Dump a possibly binary string (used for debugging).  Distinguish
93    ascii text from binary and print it accordingly.  */
94 void
95 _assuan_log_print_buffer (FILE *fp, const void *buffer, size_t length)
96 {
97   const unsigned char *s;
98   int n;
99
100   for (n=length,s=buffer; n; n--, s++)
101     if  ((!isascii (*s) || iscntrl (*s) || !isprint (*s)) && !(*s >= 0x80))
102       break;
103
104   s = buffer;
105   if (!n && *s != '[')
106     fwrite (buffer, length, 1, fp);
107   else
108     {
109       putc ('[', fp);
110       for (n=0; n < length; n++, s++)
111           fprintf (fp, " %02x", *s);
112       putc (' ', fp);
113       putc (']', fp);
114     }
115 }
116
117 /* Log a user supplied string.  Escapes non-printable before
118    printing.  */
119 void
120 _assuan_log_sanitized_string (const char *string)
121 {
122   const unsigned char *s = string;
123   FILE *fp = assuan_get_assuan_log_stream ();
124
125   if (! *s)
126     return;
127
128   for (; *s; s++)
129     {
130       int c = 0;
131
132       switch (*s)
133         {
134         case '\r':
135           c = 'r';
136           break;
137
138         case '\n':
139           c = 'n';
140           break;
141
142         case '\f':
143           c = 'f';
144           break;
145
146         case '\v':
147           c = 'v';
148           break;
149
150         case '\b':
151           c = 'b';
152           break;
153
154         default:
155           if ((isascii (*s) && isprint (*s)) || (*s >= 0x80))
156             putc (*s, fp);
157           else
158             {
159               putc ('\\', fp);
160               fprintf (fp, "x%02x", *s);
161             }
162         }
163
164       if (c)
165         {
166           putc ('\\', fp);
167           putc (c, fp);
168         }
169     }
170 }
171