Mercurial > hg > nginx-quic
comparison src/os/unix/ngx_process_cycle.c @ 361:446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 20 Jun 2004 19:54:15 +0000 |
parents | 239e37d44a34 |
children | 7650aea1816f |
comparison
equal
deleted
inserted
replaced
360:239e37d44a34 | 361:446782c909b3 |
---|---|
761 | 761 |
762 | 762 |
763 ngx_int_t ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, | 763 ngx_int_t ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, |
764 ngx_log_t *log) | 764 ngx_log_t *log) |
765 { | 765 { |
766 ssize_t n; | 766 ssize_t n; |
767 ngx_err_t err; | 767 ngx_err_t err; |
768 struct iovec iov[1]; | 768 struct iovec iov[1]; |
769 struct msghdr msg; | 769 struct msghdr msg; |
770 struct cmsghdr cm; | |
771 | 770 |
772 #if (HAVE_MSGHDR_MSG_CONTROL) | 771 #if (HAVE_MSGHDR_MSG_CONTROL) |
772 | |
773 union { | |
774 struct cmsghdr cm; | |
775 char space[CMSG_SPACE(sizeof(int))]; | |
776 } cmsg; | |
773 | 777 |
774 if (ch->fd == -1) { | 778 if (ch->fd == -1) { |
775 msg.msg_control = NULL; | 779 msg.msg_control = NULL; |
776 msg.msg_controllen = 0; | 780 msg.msg_controllen = 0; |
777 | 781 |
778 } else { | 782 } else { |
779 msg.msg_control = (caddr_t) &cm; | 783 msg.msg_control = (caddr_t) &cmsg; |
780 msg.msg_controllen = sizeof(struct cmsghdr) + sizeof(int); | 784 msg.msg_controllen = sizeof(cmsg); |
781 | 785 |
782 cm.cmsg_len = sizeof(struct cmsghdr) + sizeof(int); | 786 cmsg.cm.cmsg_len = sizeof(cmsg); |
783 cm.cmsg_level = SOL_SOCKET; | 787 cmsg.cm.cmsg_level = SOL_SOCKET; |
784 cm.cmsg_type = SCM_RIGHTS; | 788 cmsg.cm.cmsg_type = SCM_RIGHTS; |
785 *((int *) ((char *) &cm + sizeof(struct cmsghdr))) = ch->fd; | 789 *(int *) CMSG_DATA(&cmsg) = ch->fd; |
786 } | 790 } |
787 | 791 |
788 #else | 792 #else |
789 | 793 |
790 if (ch->fd == -1) { | 794 if (ch->fd == -1) { |
823 | 827 |
824 | 828 |
825 ngx_int_t ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, | 829 ngx_int_t ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, |
826 ngx_log_t *log) | 830 ngx_log_t *log) |
827 { | 831 { |
828 int fd; | 832 ssize_t n; |
829 ssize_t n; | 833 ngx_err_t err; |
830 ngx_err_t err; | 834 struct iovec iov[1]; |
831 struct iovec iov[1]; | 835 struct msghdr msg; |
832 struct msghdr msg; | 836 |
833 struct cmsghdr cm; | 837 #if (HAVE_MSGHDR_MSG_CONTROL) |
838 union { | |
839 struct cmsghdr cm; | |
840 char space[CMSG_SPACE(sizeof(int))]; | |
841 } cmsg; | |
842 #else | |
843 int fd; | |
844 #endif | |
834 | 845 |
835 iov[0].iov_base = (char *) ch; | 846 iov[0].iov_base = (char *) ch; |
836 iov[0].iov_len = size; | 847 iov[0].iov_len = size; |
837 | 848 |
838 msg.msg_name = NULL; | 849 msg.msg_name = NULL; |
839 msg.msg_namelen = 0; | 850 msg.msg_namelen = 0; |
840 msg.msg_iov = iov; | 851 msg.msg_iov = iov; |
841 msg.msg_iovlen = 1; | 852 msg.msg_iovlen = 1; |
842 | 853 |
843 #if (HAVE_MSGHDR_MSG_CONTROL) | 854 #if (HAVE_MSGHDR_MSG_CONTROL) |
844 msg.msg_control = (caddr_t) &cm; | 855 msg.msg_control = (caddr_t) &cmsg; |
845 msg.msg_controllen = sizeof(struct cmsghdr) + sizeof(int); | 856 msg.msg_controllen = sizeof(cmsg); |
846 #else | 857 #else |
847 msg.msg_accrights = (caddr_t) &fd; | 858 msg.msg_accrights = (caddr_t) &fd; |
848 msg.msg_accrightslen = sizeof(int); | 859 msg.msg_accrightslen = sizeof(int); |
849 #endif | 860 #endif |
850 | 861 |
868 | 879 |
869 #if (HAVE_MSGHDR_MSG_CONTROL) | 880 #if (HAVE_MSGHDR_MSG_CONTROL) |
870 | 881 |
871 if (ch->command == NGX_CMD_OPEN_CHANNEL) { | 882 if (ch->command == NGX_CMD_OPEN_CHANNEL) { |
872 | 883 |
873 if (cm.cmsg_len < sizeof(struct cmsghdr) + sizeof(int)) { | 884 if (cmsg.cm.cmsg_len < sizeof(cmsg)) { |
874 ngx_log_error(NGX_LOG_ALERT, log, 0, | 885 ngx_log_error(NGX_LOG_ALERT, log, 0, |
875 "recvmsg() returned too small ancillary data"); | 886 "recvmsg() returned too small ancillary data"); |
876 return NGX_ERROR; | 887 return NGX_ERROR; |
877 } | 888 } |
878 | 889 |
879 if (cm.cmsg_level != SOL_SOCKET || cm.cmsg_type != SCM_RIGHTS) { | 890 if (cmsg.cm.cmsg_level != SOL_SOCKET || cmsg.cm.cmsg_type != SCM_RIGHTS) |
891 { | |
880 ngx_log_error(NGX_LOG_ALERT, log, 0, | 892 ngx_log_error(NGX_LOG_ALERT, log, 0, |
881 "recvmsg() returned invalid ancillary data " | 893 "recvmsg() returned invalid ancillary data " |
882 "level %d or type %d", cm.cmsg_level, cm.cmsg_type); | 894 "level %d or type %d", |
895 cmsg.cm.cmsg_level, cmsg.cm.cmsg_type); | |
883 return NGX_ERROR; | 896 return NGX_ERROR; |
884 } | 897 } |
885 | 898 |
886 ch->fd = *((int *) ((char *) &cm + sizeof(struct cmsghdr))); | 899 ch->fd = *(int *) CMSG_DATA(&cmsg); |
887 } | 900 } |
888 | 901 |
889 if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) { | 902 if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) { |
890 ngx_log_error(NGX_LOG_ALERT, log, 0, | 903 ngx_log_error(NGX_LOG_ALERT, log, 0, |
891 "recvmsg() truncated data"); | 904 "recvmsg() truncated data"); |