d12277fcc8aad230a62a905efb8fd81c09e886f2
[gpgme.git] / assuan / assuan-util.c
1 /* assuan-util.c - Utility functions for Assuan 
2  * Copyright (C) 2001, 2002, 2003, 2004, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19  * USA. 
20  */
21
22 #include <config.h>
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include <string.h>
26 #include <ctype.h>
27 #include <errno.h>
28
29 #include "assuan-defs.h"
30
31 static void *(*alloc_func)(size_t n) = malloc;
32 static void *(*realloc_func)(void *p, size_t n) = realloc;
33 static void (*free_func)(void*) = free;
34
35 void
36 assuan_set_malloc_hooks ( void *(*new_alloc_func)(size_t n),
37                           void *(*new_realloc_func)(void *p, size_t n),
38                           void (*new_free_func)(void*) )
39 {
40   alloc_func        = new_alloc_func;
41   realloc_func      = new_realloc_func;
42   free_func         = new_free_func;
43 }
44
45 void *
46 _assuan_malloc (size_t n)
47 {
48   return alloc_func (n);
49 }
50
51 void *
52 _assuan_realloc (void *a, size_t n)
53 {
54   return realloc_func (a, n);
55 }
56
57 void *
58 _assuan_calloc (size_t n, size_t m)
59 {
60   void *p;
61   size_t nbytes;
62     
63   nbytes = n * m;
64   if (m && nbytes / m != n) 
65     {
66       errno = ENOMEM;
67       return NULL;
68     }
69
70   p = _assuan_malloc (nbytes);
71   if (p)
72     memset (p, 0, nbytes);
73   return p;
74 }
75
76 void
77 _assuan_free (void *p)
78 {
79   if (p)
80     free_func (p);
81 }
82
83 \f
84 /* Store the error in the context so that the error sending function
85   can take out a descriptive text.  Inside the assuan code, use the
86   macro set_error instead of this function. */
87 int
88 assuan_set_error (assuan_context_t ctx, int err, const char *text)
89 {
90   ctx->err_no = err;
91   ctx->err_str = text;
92   return err;
93 }
94
95 void
96 assuan_set_pointer (assuan_context_t ctx, void *pointer)
97 {
98   if (ctx)
99     ctx->user_pointer = pointer;
100 }
101
102 void *
103 assuan_get_pointer (assuan_context_t ctx)
104 {
105   return ctx? ctx->user_pointer : NULL;
106 }
107
108
109 void
110 assuan_begin_confidential (assuan_context_t ctx)
111 {
112   if (ctx)
113     {
114       ctx->confidential = 1;
115     }
116 }
117
118 void
119 assuan_end_confidential (assuan_context_t ctx)
120 {
121   if (ctx)
122     {
123       ctx->confidential = 0;
124     }
125 }
126
127
128 void 
129 assuan_set_io_monitor (assuan_context_t ctx,
130                        unsigned int (*monitor)(assuan_context_t ctx,
131                                                int direction,
132                                                const char *line,
133                                                size_t linelen))
134 {
135   if (ctx)
136     {
137       ctx->io_monitor = monitor;
138     }
139 }
140
141
142
143
144 /* For context CTX, set the flag FLAG to VALUE.  Values for flags
145    are usually 1 or 0 but certain flags might allow for other values;
146    see the description of the type assuan_flag_t for details. */
147 void
148 assuan_set_flag (assuan_context_t ctx, assuan_flag_t flag, int value)
149 {
150   if (!ctx)
151     return;
152   switch (flag)
153     {
154     case ASSUAN_NO_WAITPID: ctx->flags.no_waitpid = value; break;
155     }
156 }
157
158 /* Return the VALUE of FLAG in context CTX. */ 
159 int
160 assuan_get_flag (assuan_context_t ctx, assuan_flag_t flag)
161 {
162   if (!ctx)
163     return 0;
164   switch (flag)
165     {
166     case ASSUAN_NO_WAITPID: return ctx->flags.no_waitpid;
167     }
168   return 0;
169 }
170
171