taskrambler  0.1.9
Web server and task management solution.
stream/write.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/write.c:

Go to the source code of this file.

Functions

ssize_t streamWrite (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/write.c.

Function Documentation

ssize_t streamWrite ( Stream  this,
void *  buf,
size_t  count 
)
Todo:
I got a segfault in this call under unclear circumstances. Most likely it has to do with a write on a closed connection.

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

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

Referenced by httpWriterWrite().

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

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

Variable Documentation

Logger logger

Definition at line 66 of file taskrambler.c.

Referenced by main(), and streamWrite().