NeoMutt  2023-05-17-33-gce4425
Teaching an old dog new tricks
DOXYGEN

Read from a socket Connection. More...

+ Collaboration diagram for read():

Functions

static int tls_socket_read (struct Connection *conn, char *buf, size_t count)
 Read data from a TLS socket - Implements Connection::read() -. More...
 
static int ssl_socket_read (struct Connection *conn, char *buf, size_t count)
 Read data from an SSL socket - Implements Connection::read() -. More...
 
int raw_socket_read (struct Connection *conn, char *buf, size_t count)
 Read data from a socket - Implements Connection::read() -. More...
 
static int mutt_sasl_conn_read (struct Connection *conn, char *buf, size_t count)
 Read data from an SASL connection - Implements Connection::read() -. More...
 
static int tunnel_socket_read (struct Connection *conn, char *buf, size_t count)
 Read data from a tunnel socket - Implements Connection::read() -. More...
 
static int zstrm_read (struct Connection *conn, char *buf, size_t len)
 Read compressed data from a socket - Implements Connection::read() -. More...
 

Variables

int(* SaslSockData::read )(struct Connection *conn, char *buf, size_t count)
 Read from a socket Connection - Implements Connection::read() -. More...
 

Detailed Description

Read from a socket Connection.

Parameters
connConnection to a server
bufBuffer to store the data
countNumber of bytes to read
Return values
>0Success, number of bytes read
-1Error, see errno

Function Documentation

◆ tls_socket_read()

static int tls_socket_read ( struct Connection conn,
char *  buf,
size_t  count 
)
static

Read data from a TLS socket - Implements Connection::read() -.

Definition at line 1040 of file gnutls.c.

1041{
1042 struct TlsSockData *data = conn->sockdata;
1043 if (!data)
1044 {
1045 mutt_error(_("Error: no TLS socket open"));
1046 return -1;
1047 }
1048
1049 int rc;
1050 do
1051 {
1052 rc = gnutls_record_recv(data->session, buf, count);
1053 } while ((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED));
1054
1055 if (rc < 0)
1056 {
1057 mutt_error("tls_socket_read (%s)", gnutls_strerror(rc));
1058 return -1;
1059 }
1060
1061 return rc;
1062}
#define mutt_error(...)
Definition: logging2.h:87
#define _(a)
Definition: message.h:28
void * sockdata
Backend-specific socket data.
Definition: connection.h:56
TLS socket data -.
Definition: gnutls.c:78
gnutls_session_t session
Definition: gnutls.c:79
+ Here is the caller graph for this function:

◆ ssl_socket_read()

static int ssl_socket_read ( struct Connection conn,
char *  buf,
size_t  count 
)
static

Read data from an SSL socket - Implements Connection::read() -.

Definition at line 1325 of file openssl.c.

1326{
1327 struct SslSockData *data = sockdata(conn);
1328 int rc;
1329
1330 rc = SSL_read(data->ssl, buf, count);
1331 if ((rc <= 0) || (errno == EINTR))
1332 {
1333 if (errno == EINTR)
1334 {
1335 rc = -1;
1336 }
1337 data->isopen = 0;
1338 ssl_err(data, rc);
1339 }
1340
1341 return rc;
1342}
static struct SslSockData * sockdata(struct Connection *conn)
Get a Connection's socket data.
Definition: openssl.c:1182
static void ssl_err(struct SslSockData *data, int err)
Display an SSL error message.
Definition: openssl.c:234
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ raw_socket_read()

int raw_socket_read ( struct Connection conn,
char *  buf,
size_t  count 
)

Read data from a socket - Implements Connection::read() -.

Definition at line 280 of file raw.c.

281{
282 int rc;
283
285 do
286 {
287 rc = read(conn->fd, buf, count);
288 } while (rc < 0 && (errno == EINTR));
289
290 if (rc < 0)
291 {
292 mutt_error(_("Error talking to %s (%s)"), conn->account.host, strerror(errno));
293 SigInt = false;
294 }
296
297 if (SigInt)
298 {
299 mutt_error(_("Connection to %s has been aborted"), conn->account.host);
300 SigInt = false;
301 rc = -1;
302 }
303
304 return rc;
305}
SIG_ATOMIC_VOLATILE_T SigInt
true after SIGINT is received
Definition: globals.c:59
void mutt_sig_allow_interrupt(bool allow)
Allow/disallow Ctrl-C (SIGINT)
Definition: signal.c:252
char host[128]
Server to login to.
Definition: connaccount.h:54
struct ConnAccount account
Account details: username, password, etc.
Definition: connection.h:50
int fd
Socket file descriptor.
Definition: connection.h:54
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mutt_sasl_conn_read()

static int mutt_sasl_conn_read ( struct Connection conn,
char *  buf,
size_t  count 
)
static

Read data from an SASL connection - Implements Connection::read() -.

Definition at line 465 of file sasl.c.

466{
467 int rc;
468 unsigned int olen;
469
470 struct SaslSockData *sasldata = conn->sockdata;
471
472 /* if we still have data in our read buffer, copy it into buf */
473 if (sasldata->blen > sasldata->bpos)
474 {
475 olen = ((sasldata->blen - sasldata->bpos) > count) ?
476 count :
477 sasldata->blen - sasldata->bpos;
478
479 memcpy(buf, sasldata->buf + sasldata->bpos, olen);
480 sasldata->bpos += olen;
481
482 return olen;
483 }
484
485 conn->sockdata = sasldata->sockdata;
486
487 sasldata->bpos = 0;
488 sasldata->blen = 0;
489
490 /* and decode the result, if necessary */
491 if (*sasldata->ssf != 0)
492 {
493 do
494 {
495 /* call the underlying read function to fill the buffer */
496 rc = sasldata->read(conn, buf, count);
497 if (rc <= 0)
498 goto out;
499
500 rc = sasl_decode(sasldata->saslconn, buf, rc, &sasldata->buf, &sasldata->blen);
501 if (rc != SASL_OK)
502 {
503 mutt_debug(LL_DEBUG1, "SASL decode failed: %s\n", sasl_errstring(rc, NULL, NULL));
504 goto out;
505 }
506 } while (sasldata->blen == 0);
507
508 olen = ((sasldata->blen - sasldata->bpos) > count) ?
509 count :
510 sasldata->blen - sasldata->bpos;
511
512 memcpy(buf, sasldata->buf, olen);
513 sasldata->bpos += olen;
514
515 rc = olen;
516 }
517 else
518 {
519 rc = sasldata->read(conn, buf, count);
520 }
521
522out:
523 conn->sockdata = sasldata;
524
525 return rc;
526}
int(* read)(struct Connection *conn, char *buf, size_t count)
Read from a socket Connection - Implements Connection::read() -.
Definition: sasl.c:82
#define mutt_debug(LEVEL,...)
Definition: logging2.h:84
@ LL_DEBUG1
Log at debug level 1.
Definition: logging2.h:40
SASL authentication API -.
Definition: sasl.c:62
void * sockdata
Underlying socket data.
Definition: sasl.c:72
unsigned int blen
Size of the read buffer.
Definition: sasl.c:69
unsigned int bpos
Current read position.
Definition: sasl.c:70
const sasl_ssf_t * ssf
Definition: sasl.c:64
const char * buf
Buffer for data read from the connection.
Definition: sasl.c:68
sasl_conn_t * saslconn
Definition: sasl.c:63
+ Here is the caller graph for this function:

◆ tunnel_socket_read()

static int tunnel_socket_read ( struct Connection conn,
char *  buf,
size_t  count 
)
static

Read data from a tunnel socket - Implements Connection::read() -.

Definition at line 144 of file tunnel.c.

145{
146 struct TunnelSockData *tunnel = conn->sockdata;
147 int rc;
148
149 do
150 {
151 rc = read(tunnel->fd_read, buf, count);
152 } while (rc < 0 && errno == EINTR);
153
154 if (rc < 0)
155 {
156 mutt_error(_("Tunnel error talking to %s: %s"), conn->account.host, strerror(errno));
157 return -1;
158 }
159
160 return rc;
161}
A network tunnel (pair of sockets)
Definition: tunnel.c:49
int fd_read
File descriptor to read from.
Definition: tunnel.c:51
+ Here is the caller graph for this function:

◆ zstrm_read()

static int zstrm_read ( struct Connection conn,
char *  buf,
size_t  len 
)
static

Read compressed data from a socket - Implements Connection::read() -.

Definition at line 129 of file zstrm.c.

130{
131 struct ZstrmContext *zctx = conn->sockdata;
132 int rc = 0;
133 int zrc = 0;
134
135retry:
136 if (zctx->read.stream_eof)
137 return 0;
138
139 /* when avail_out was 0 on last call, we need to call inflate again, because
140 * more data might be available using the current input, so avoid callling
141 * read on the underlying stream in that case (for it might block) */
142 if ((zctx->read.pos == 0) && !zctx->read.conn_eof)
143 {
144 rc = zctx->next_conn.read(&zctx->next_conn, zctx->read.buf, zctx->read.len);
145 mutt_debug(LL_DEBUG5, "consuming data from next stream: %d bytes\n", rc);
146 if (rc < 0)
147 return rc;
148 else if (rc == 0)
149 zctx->read.conn_eof = true;
150 else
151 zctx->read.pos += rc;
152 }
153
154 zctx->read.z.avail_in = (uInt) zctx->read.pos;
155 zctx->read.z.next_in = (Bytef *) zctx->read.buf;
156 zctx->read.z.avail_out = (uInt) len;
157 zctx->read.z.next_out = (Bytef *) buf;
158
159 zrc = inflate(&zctx->read.z, Z_SYNC_FLUSH);
160 mutt_debug(LL_DEBUG5, "rc=%d, consumed %u/%u bytes, produced %lu/%lu bytes\n",
161 zrc, zctx->read.pos - zctx->read.z.avail_in, zctx->read.pos,
162 len - zctx->read.z.avail_out, len);
163
164 /* shift any remaining input data to the front of the buffer */
165 if ((Bytef *) zctx->read.buf != zctx->read.z.next_in)
166 {
167 memmove(zctx->read.buf, zctx->read.z.next_in, zctx->read.z.avail_in);
168 zctx->read.pos = zctx->read.z.avail_in;
169 }
170
171 switch (zrc)
172 {
173 case Z_OK: /* progress has been made */
174 zrc = len - zctx->read.z.avail_out; /* "returned" bytes */
175 if (zrc == 0)
176 {
177 /* there was progress, so must have been reading input */
178 mutt_debug(LL_DEBUG5, "inflate just consumed\n");
179 goto retry;
180 }
181 break;
182
183 case Z_STREAM_END: /* everything flushed, nothing remaining */
184 mutt_debug(LL_DEBUG5, "inflate returned Z_STREAM_END.\n");
185 zrc = len - zctx->read.z.avail_out; /* "returned" bytes */
186 zctx->read.stream_eof = true;
187 break;
188
189 case Z_BUF_ERROR: /* no progress was possible */
190 if (!zctx->read.conn_eof)
191 {
192 mutt_debug(LL_DEBUG5, "inflate returned Z_BUF_ERROR. retrying.\n");
193 goto retry;
194 }
195 zrc = 0;
196 break;
197
198 default:
199 /* bail on other rcs, such as Z_DATA_ERROR, or Z_MEM_ERROR */
200 mutt_debug(LL_DEBUG5, "inflate returned %d. aborting.\n", zrc);
201 zrc = -1;
202 break;
203 }
204
205 return zrc;
206}
@ LL_DEBUG5
Log at debug level 5.
Definition: logging2.h:44
int(* read)(struct Connection *conn, char *buf, size_t count)
Definition: connection.h:80
Data compression layer.
Definition: zstrm.c:55
struct ZstrmDirection read
Data being read and de-compressed.
Definition: zstrm.c:56
struct Connection next_conn
Underlying stream.
Definition: zstrm.c:58
unsigned int pos
Current position.
Definition: zstrm.c:46
bool conn_eof
Connection end-of-file reached.
Definition: zstrm.c:47
unsigned int len
Length of data.
Definition: zstrm.c:45
z_stream z
zlib compression handle
Definition: zstrm.c:43
char * buf
Buffer for data being (de-)compressed.
Definition: zstrm.c:44
bool stream_eof
Stream end-of-file reached.
Definition: zstrm.c:48
+ Here is the caller graph for this function:

Variable Documentation

◆ read

int(* SaslSockData::read) (struct Connection *conn, char *buf, size_t count)

Read from a socket Connection - Implements Connection::read() -.

Definition at line 82 of file sasl.c.