src/server/daemon/sessionhandler.c

changeset 169
76c96ee18221
parent 162
b169992137a8
child 171
af7e2d80dee6
equal deleted inserted replaced
168:5c752979bfd6 169:76c96ee18221
53 int connection_write(Connection *conn, const void *buf, int len) { 53 int connection_write(Connection *conn, const void *buf, int len) {
54 return (int)write(conn->fd, buf, len); 54 return (int)write(conn->fd, buf, len);
55 } 55 }
56 56
57 void connection_close(Connection *conn) { 57 void connection_close(Connection *conn) {
58 close(conn->fd); 58 while(close(conn->fd)) {
59 if(errno != EINTR) {
60 log_ereport(LOG_VERBOSE, "connection close failed: %s", strerror(errno));
61 break;
62 }
63 }
59 } 64 }
60 65
61 int connection_ssl_read(Connection *conn, void *buf, int len) { 66 int connection_ssl_read(Connection *conn, void *buf, int len) {
62 int ret = SSL_read(conn->ssl, buf, len); 67 int ret = SSL_read(conn->ssl, buf, len);
63 if(ret <= 0) { 68 if(ret <= 0) {
80 if(ret != 1) { 85 if(ret != 1) {
81 conn->ssl_error = SSL_get_error(conn->ssl, ret); 86 conn->ssl_error = SSL_get_error(conn->ssl, ret);
82 log_ereport(LOG_VERBOSE, "SSL_shutdown failed: %d", conn->ssl_error); 87 log_ereport(LOG_VERBOSE, "SSL_shutdown failed: %d", conn->ssl_error);
83 } 88 }
84 } 89 }
85 close(conn->fd); 90 while(close(conn->fd)) {
91 if(errno != EINTR) {
92 log_ereport(LOG_VERBOSE, "connection close failed: %s", strerror(errno));
93 break;
94 }
95 }
86 } 96 }
87 97
88 void connection_destroy(Connection *conn) { 98 void connection_destroy(Connection *conn) {
89 conn->close(conn); 99 conn->close(conn);
90 if(conn->ssl) { 100 if(conn->ssl) {
318 HTTPRequest *request = io->request; 328 HTTPRequest *request = io->request;
319 329
320 int r = handle_request(request, NULL); 330 int r = handle_request(request, NULL);
321 if(r != 0) { 331 if(r != 0) {
322 // TODO: error message 332 // TODO: error message
323 close(request->connection->fd); 333 connection_destroy(request->connection);
324 } 334 }
325 335
326 /* 336 /*
327 * handle_request can return before the request is finished, but it copies 337 * handle_request can return before the request is finished, but it copies
328 * all important data. We can free request, parser and event 338 * all important data. We can free request, parser and event

mercurial