1
1
/* data-mem.c - A memory based data object.
2
Copyright (C) 2002, 2003, 2004 g10 Code GmbH
2
Copyright (C) 2002, 2003, 2004, 2007 g10 Code GmbH
4
4
This file is part of GPGME.
164
166
/* Create a new data buffer and return it in R_DH. */
166
gpgme_data_new (gpgme_data_t *dh)
168
gpgme_data_new (gpgme_data_t *r_dh)
168
gpgme_error_t err = _gpgme_data_new (dh, &mem_cbs);
171
TRACE_BEG (DEBUG_DATA, "gpgme_data_new", r_dh);
173
err = _gpgme_data_new (r_dh, &mem_cbs);
176
return TRACE_ERR (err);
178
return TRACE_SUC1 ("r_dh=%p", *r_dh);
177
183
BUFFER. If COPY is zero, copying is delayed until necessary, and
178
184
the data is taken from the original location when needed. */
180
gpgme_data_new_from_mem (gpgme_data_t *dh, const char *buffer,
186
gpgme_data_new_from_mem (gpgme_data_t *r_dh, const char *buffer,
181
187
size_t size, int copy)
183
gpgme_error_t err = _gpgme_data_new (dh, &mem_cbs);
190
TRACE_BEG4 (DEBUG_DATA, "gpgme_data_new_from_mem", r_dh,
191
"buffer=%p, size=%u, copy=%i (%s)", buffer, size,
192
copy, copy ? "yes" : "no");
194
err = _gpgme_data_new (r_dh, &mem_cbs);
196
return TRACE_ERR (err);
189
200
char *bufcpy = malloc (size);
191
_gpgme_data_release (*dh);
203
int saved_errno = errno;
204
_gpgme_data_release (*r_dh);
205
return TRACE_ERR (gpg_error_from_errno (saved_errno));
192
207
memcpy (bufcpy, buffer, size);
193
(*dh)->data.mem.buffer = bufcpy;
208
(*r_dh)->data.mem.buffer = bufcpy;
196
(*dh)->data.mem.orig_buffer = buffer;
211
(*r_dh)->data.mem.orig_buffer = buffer;
198
(*dh)->data.mem.size = size;
199
(*dh)->data.mem.length = size;
213
(*r_dh)->data.mem.size = size;
214
(*r_dh)->data.mem.length = size;
215
return TRACE_SUC1 ("dh=%p", *r_dh);
210
225
char *str = NULL;
227
TRACE_BEG1 (DEBUG_DATA, "gpgme_data_release_and_get_mem", dh,
212
230
if (!dh || dh->cbs != &mem_cbs)
232
gpgme_data_release (dh);
233
TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
215
237
str = dh->data.mem.buffer;
216
238
if (!str && dh->data.mem.orig_buffer)
218
240
str = malloc (dh->data.mem.length);
243
int saved_errno = errno;
244
gpgme_data_release (dh);
245
TRACE_ERR (gpg_error_from_errno (saved_errno));
221
248
memcpy (str, dh->data.mem.orig_buffer, dh->data.mem.length);
251
/* Prevent mem_release from releasing the buffer memory. We must
252
not fail from this point. */
253
dh->data.mem.buffer = NULL;
225
256
*r_len = dh->data.mem.length;
258
gpgme_data_release (dh);
262
TRACE_SUC2 ("buffer=%p, len=%u", str, *r_len);
266
TRACE_SUC1 ("buffer=%p", str);