ssize_tngx_unix_recv(ngx_connection_t*c,u_char*buf,size_tsize){ssize_tn;ngx_err_terr;ngx_event_t*rev;rev=c->read;#if(NGX_HAVE_KQUEUE)if(ngx_event_flags&NGX_USE_KQUEUE_EVENT){ngx_log_debug3(NGX_LOG_DEBUG_EVENT,c->log,0,"recv: eof:%d, avail:%d, err:%d",rev->pending_eof,rev->available,rev->kq_errno);if(rev->available==0){if(rev->pending_eof){rev->ready=0;rev->eof=1;if(rev->kq_errno){rev->error=1;ngx_set_socket_errno(rev->kq_errno);returnngx_connection_error(c,rev->kq_errno,"kevent() reported about an closed connection");}return0;}else{rev->ready=0;returnNGX_AGAIN;}}}#endif#if(NGX_HAVE_EPOLLRDHUP)if((ngx_event_flags&NGX_USE_EPOLL_EVENT)&&ngx_use_epoll_rdhup){ngx_log_debug2(NGX_LOG_DEBUG_EVENT,c->log,0,"recv: eof:%d, avail:%d",rev->pending_eof,rev->available);if(rev->available==0&&!rev->pending_eof){rev->ready=0;returnNGX_AGAIN;}}#endifdo{n=recv(c->fd,buf,size,0);ngx_log_debug3(NGX_LOG_DEBUG_EVENT,c->log,0,"recv: fd:%d %z of %uz",c->fd,n,size);if(n==0){rev->ready=0;rev->eof=1;#if(NGX_HAVE_KQUEUE)/* * on FreeBSD recv() may return 0 on closed socket * even if kqueue reported about available data */if(ngx_event_flags&NGX_USE_KQUEUE_EVENT){rev->available=0;}#endifreturn0;}if(n>0){#if(NGX_HAVE_KQUEUE)if(ngx_event_flags&NGX_USE_KQUEUE_EVENT){rev->available-=n;/* * rev->available may be negative here because some additional * bytes may be received between kevent() and recv() */if(rev->available<=0){if(!rev->pending_eof){rev->ready=0;}rev->available=0;}returnn;}#endif#if(NGX_HAVE_FIONREAD)if(rev->available>=0){rev->available-=n;/* * negative rev->available means some additional bytes * were received between kernel notification and recv(), * and therefore ev->ready can be safely reset even for * edge-triggered event methods */if(rev->available<0){rev->available=0;rev->ready=0;}ngx_log_debug1(NGX_LOG_DEBUG_EVENT,c->log,0,"recv: avail:%d",rev->available);}elseif((size_t)n==size){if(ngx_socket_nread(c->fd,&rev->available)==-1){n=ngx_connection_error(c,ngx_socket_errno,ngx_socket_nread_n" failed");break;}ngx_log_debug1(NGX_LOG_DEBUG_EVENT,c->log,0,"recv: avail:%d",rev->available);}#endif#if(NGX_HAVE_EPOLLRDHUP)if((ngx_event_flags&NGX_USE_EPOLL_EVENT)&&ngx_use_epoll_rdhup){if((size_t)n<size){if(!rev->pending_eof){rev->ready=0;}rev->available=0;}returnn;}#endifif((size_t)n<size&&!(ngx_event_flags&NGX_USE_GREEDY_EVENT)){rev->ready=0;}returnn;}err=ngx_socket_errno;if(err==NGX_EAGAIN||err==NGX_EINTR){ngx_log_debug0(NGX_LOG_DEBUG_EVENT,c->log,err,"recv() not ready");n=NGX_AGAIN;}else{n=ngx_connection_error(c,err,"recv() failed");break;}}while(err==NGX_EINTR);rev->ready=0;if(n==NGX_ERROR){rev->error=1;}returnn;}
#if(NGX_HAVE_KQUEUE)if(ngx_event_flags&NGX_USE_KQUEUE_EVENT){ngx_log_debug3(NGX_LOG_DEBUG_EVENT,c->log,0,"recv: eof:%d, avail:%d, err:%d",rev->pending_eof,rev->available,rev->kq_errno);if(rev->available==0){if(rev->pending_eof){rev->ready=0;rev->eof=1;if(rev->kq_errno){rev->error=1;ngx_set_socket_errno(rev->kq_errno);returnngx_connection_error(c,rev->kq_errno,"kevent() reported about an closed connection");}return0;}else{rev->ready=0;returnNGX_AGAIN;}}}#endif
do{n=recv(c->fd,buf,size,0);ngx_log_debug3(NGX_LOG_DEBUG_EVENT,c->log,0,"recv: fd:%d %z of %uz",c->fd,n,size);if(n==0){rev->ready=0;rev->eof=1;#if(NGX_HAVE_KQUEUE)/* * on FreeBSD recv() may return 0 on closed socket * even if kqueue reported about available data */if(ngx_event_flags&NGX_USE_KQUEUE_EVENT){rev->available=0;}#endifreturn0;}if(n>0){#if(NGX_HAVE_KQUEUE)if(ngx_event_flags&NGX_USE_KQUEUE_EVENT){rev->available-=n;/* * rev->available may be negative here because some additional * bytes may be received between kevent() and recv() */if(rev->available<=0){if(!rev->pending_eof){rev->ready=0;}rev->available=0;}returnn;}#endif#if(NGX_HAVE_FIONREAD)if(rev->available>=0){rev->available-=n;/* * negative rev->available means some additional bytes * were received between kernel notification and recv(), * and therefore ev->ready can be safely reset even for * edge-triggered event methods */if(rev->available<0){rev->available=0;rev->ready=0;}ngx_log_debug1(NGX_LOG_DEBUG_EVENT,c->log,0,"recv: avail:%d",rev->available);}elseif((size_t)n==size){if(ngx_socket_nread(c->fd,&rev->available)==-1){n=ngx_connection_error(c,ngx_socket_errno,ngx_socket_nread_n" failed");break;}ngx_log_debug1(NGX_LOG_DEBUG_EVENT,c->log,0,"recv: avail:%d",rev->available);}#endif#if(NGX_HAVE_EPOLLRDHUP)if((ngx_event_flags&NGX_USE_EPOLL_EVENT)&&ngx_use_epoll_rdhup){if((size_t)n<size){if(!rev->pending_eof){rev->ready=0;}rev->available=0;}returnn;}#endifif((size_t)n<size&&!(ngx_event_flags&NGX_USE_GREEDY_EVENT)){rev->ready=0;}returnn;}err=ngx_socket_errno;if(err==NGX_EAGAIN||err==NGX_EINTR){ngx_log_debug0(NGX_LOG_DEBUG_EVENT,c->log,err,"recv() not ready");n=NGX_AGAIN;}else{n=ngx_connection_error(c,err,"recv() failed");break;}}while(err==NGX_EINTR);
3个关键场景重塑Web邮件体验:Roundcube Mail深度实践指南 【免费下载链接】roundcubemail The Roundcube Webmail suite 项目地址: https://gitcode.com/gh_mirrors/ro/roundcubemail
你是否曾为传统邮件客户端的笨重界面而烦恼?或是为移动设备上…