2002-10-09 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / data-stream.c
1 /* data-stream.c - A memory based data object.
2  *      Copyright (C) 2002 g10 Code GmbH
3  *
4  * This file is part of GPGME.
5  *
6  * GPGME is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GPGME is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * 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 #if HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include <stdio.h>
26 #include <sys/types.h>
27
28 #include "data.h"
29
30 \f
31 static int
32 stream_read (GpgmeData dh, void *buffer, size_t size)
33 {
34   size_t amt = fread (buffer, 1, size, dh->data.stream);
35   if (amt > 0)
36     return amt;
37   return ferror (dh->data.stream) ? -1 : 0;
38 }
39
40
41 static ssize_t
42 stream_write (GpgmeData dh, const void *buffer, size_t size)
43 {
44   size_t amt = fwrite (buffer, 1, size, dh->data.stream);
45   if (amt > 0)
46     return amt;
47   return ferror (dh->data.stream) ? -1 : 0;
48 }
49
50
51 static off_t
52 stream_seek (GpgmeData dh, off_t offset, int whence)
53 {
54   return fseek (dh->data.stream, offset, whence);
55 }
56
57
58 static struct gpgme_data_cbs stream_cbs =
59   {
60     stream_read,
61     stream_write,
62     stream_seek,
63     NULL
64   };
65
66 \f
67 GpgmeError
68 gpgme_data_new_from_stream (GpgmeData *dh, FILE *stream)
69 {
70   GpgmeError err = _gpgme_data_new (dh, &stream_cbs);
71   if (err)
72     return err;
73
74   (*dh)->data.stream = stream;
75   return 0;
76 }