taskrambler  v0.1.8
Web server and task management solution.
stream/read.c File Reference
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <unistd.h>
#include <errno.h>
#include "stream.h"
#include "logger.h"
+ Include dependency graph for stream/read.c:

Go to the source code of this file.

Functions

ssize_t streamRead (Stream this, void *buf, size_t count)
 

Variables

Logger logger
 

Detailed Description

Author
Georg Hopp

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file stream/read.c.

Function Documentation

ssize_t streamRead ( Stream  this,
void *  buf,
size_t  count 
)

Definition at line 35 of file stream/read.c.

References logger, LOGGER_DEBUG, loggerLog(), STREAM_FD, and STREAM_SSL.

Referenced by cbufRead().

36 {
37  ssize_t done;
38 
39  switch(this->type) {
40  ssize_t _read;
41 
42  case STREAM_FD:
43  _read = read((this->handle).fd, buf, count);
44 
45  if (_read < 0) {
46  switch (errno) {
47  case EINTR:
48  case ENOMEM:
49  done = 0;
50  break;
51  case (EAGAIN|EWOULDBLOCK):
52  done = -1;
53  break;
54  default:
55  done = -2;
56  break;
57  }
58  } else if (_read == 0) {
59  done = -2;
60  } else {
61  done = _read;
62  }
63 
64  break;
65 
66  case STREAM_SSL:
67  done = SSL_read((this->handle).ssl, buf, count);
68 
69  if (0 == done) {
70  done = -2;
71  } else if (0 > done) {
72  switch (SSL_get_error((this->handle).ssl, done)) {
73  case SSL_ERROR_SYSCALL:
74  {
75  switch (errno) {
76  case EINTR:
77  case ENOBUFS:
78  case ENOMEM:
79  done = 0;
80  break;
81  case (EAGAIN|EWOULDBLOCK):
82  done = -1;
83  break;
84  default:
85  done = -1;
86  break;
87  }
88  }
89  break;
90 
91  case SSL_ERROR_SSL:
92  {
93  unsigned long err;
94 
95  while (0 != (err = ERR_get_error())) {
96  loggerLog(
97  logger,
99  ERR_error_string(err, NULL));
100  }
101  }
102  // DROP THROUGH
103 
104  case SSL_ERROR_ZERO_RETURN:
105  done = -2;
106  break;
107  }
108  }
109 
110  break;
111 
112  default:
113  done = -2;
114  break;
115  }
116 
117  return done;
118 }
Logger logger
Definition: taskrambler.c:66
void loggerLog(void *, logger_level, const char *const,...)
Definition: i_logger.c:38

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

Variable Documentation

Logger logger