| 96 | | static GIOStatus (GIOChannel *handle, gchar *buf, gsize len, gsize *ret, GError **gerr) |
| 97 | | { |
| 98 | | GIOSSLChannel *chan = (GIOSSLChannel *)handle; |
| 99 | | gint ret1, err; |
| 100 | | const char *errstr; |
| 101 | | |
| 102 | | ret1 = SSL_read(chan->ssl, buf, len); |
| 103 | | if(ret1 <= 0) |
| 104 | | { |
| 105 | | *ret = 0; |
| 106 | | err = SSL_get_error(chan->ssl, ret1); |
| 107 | | if(err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
|
| 108 | | return G_IO_STATUS_AGAIN; |
| 109 | | else if(err == SSL_ERROR_ZERO_RETURN)
|
| 110 | | return G_IO_STATUS_EOF; |
| 111 | | else if (err == SSL_ERROR_SYSCALL)
|
| 112 | | { |
| 113 | | errstr = ERR_reason_error_string(ERR_get_error()); |
| 114 | | if (errstr == NULL && ret1 == -1)
|
| 115 | | errstr = strerror(errno); |
| 116 | | if (errstr == NULL)
|
| 117 | | errstr = "server closed connection unexpectedly"; |
| 118 | | } |
| 119 | | else |
| 120 | | { |
| 121 | | errstr = ERR_reason_error_string(ERR_get_error()); |
| 122 | | if (errstr == NULL)
|
| 123 | | errstr = "unknown SSL error"; |
| 124 | | } |
| 125 | | g_warning("SSL read error: %s", errstr);
|
| 126 | | *gerr = g_error_new_literal(G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_FAILED,
|
| 127 | | errstr); |
| 128 | | return G_IO_STATUS_ERROR; |
| 129 | | } |
| 130 | | else |
| 131 | | { |
| 132 | | *ret = ret1; |
| 133 | | return G_IO_STATUS_NORMAL; |
| 134 | | } |
| 135 | | |
| 136 | | return G_IO_STATUS_ERROR; |
| 137 | | } |