2 Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
4 This file is part of GNU Wget.
6 GNU Wget 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.
11 GNU Wget 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.
16 You should have received a copy of the GNU General Public License
17 along with Wget; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20 /* This is a simple implementation of buffering IO-read functions. */
36 #include <openssl/bio.h>
37 #include <openssl/crypto.h>
38 #include <openssl/x509.h>
39 #include <openssl/ssl.h>
40 #include <openssl/err.h>
41 #include <openssl/pem.h>
42 #include "gen_sslfunc.h" /* for ssl_iread */
46 rbuf_initialize (struct rbuf *rbuf, int fd)
50 /* pointing ssl to NULL results in an unchanged behaviour */
53 rbuf->buffer_pos = rbuf->buffer;
54 rbuf->buffer_left = 0;
58 rbuf_initialized_p (struct rbuf *rbuf)
60 return rbuf->fd != -1;
64 rbuf_uninitialize (struct rbuf *rbuf)
70 rbuf_read_bufferful (struct rbuf *rbuf)
74 return ssl_iread (rbuf->ssl, rbuf->buffer, sizeof (rbuf->buffer));
77 return iread (rbuf->fd, rbuf->buffer, sizeof (rbuf->buffer));
80 /* Currently unused -- see RBUF_READCHAR. */
82 /* Function version of RBUF_READCHAR. */
84 rbuf_readchar (struct rbuf *rbuf, char *store)
86 return RBUF_READCHAR (rbuf, store);
90 /* Like rbuf_readchar(), only don't move the buffer position. */
92 rbuf_peek (struct rbuf *rbuf, char *store)
94 if (!rbuf->buffer_left)
97 rbuf->buffer_pos = rbuf->buffer;
98 rbuf->buffer_left = 0;
100 if (rbuf->ssl != NULL) {
101 res = ssl_iread (rbuf->ssl, rbuf->buffer, sizeof (rbuf->buffer));
103 #endif /* HAVE_SSL */
104 res = iread (rbuf->fd, rbuf->buffer, sizeof (rbuf->buffer));
107 #endif /* HAVE_SSL */
110 rbuf->buffer_left = res;
112 *store = *rbuf->buffer_pos;
116 /* Flush RBUF's buffer to WHERE. Flush MAXSIZE bytes at most.
117 Returns the number of bytes actually copied. If the buffer is
118 empty, 0 is returned. */
120 rbuf_flush (struct rbuf *rbuf, char *where, int maxsize)
122 if (!rbuf->buffer_left)
126 int howmuch = MINVAL (rbuf->buffer_left, maxsize);
129 memcpy (where, rbuf->buffer_pos, howmuch);
130 rbuf->buffer_left -= howmuch;
131 rbuf->buffer_pos += howmuch;
136 /* Discard any cached data in RBUF. */
138 rbuf_discard (struct rbuf *rbuf)
140 rbuf->buffer_left = 0;
141 rbuf->buffer_pos = rbuf->buffer;