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");