132 ssize_t net_stream_sendfile(NetIOStream *st, sendfiledata *sfd) { |
135 ssize_t net_stream_sendfile(NetIOStream *st, sendfiledata *sfd) { |
133 // TODO: header and trailer |
136 // TODO: header and trailer |
134 ssize_t ret = 0; |
137 ssize_t ret = 0; |
135 off_t fileoffset = sfd->offset; |
138 off_t fileoffset = sfd->offset; |
136 if(sfd->fd->fd != -1) { |
139 if(sfd->fd->fd != -1) { |
|
140 #ifdef OSX |
|
141 struct iovec hdvec; |
|
142 hdvec.iov_base = (void*)sfd->header; |
|
143 hdvec.iov_len = sfd->hlen; |
|
144 struct iovec trvec; |
|
145 trvec.iov_base = (void*)sfd->trailer; |
|
146 trvec.iov_len = sfd->tlen; |
|
147 struct sf_hdtr hdtr; |
|
148 hdtr.headers = &hdvec; |
|
149 hdtr.hdr_cnt = 1; |
|
150 hdtr.trailers = &trvec; |
|
151 hdtr.trl_cnt = 1; |
|
152 |
|
153 ret = sendfile(sfd->fd->fd, st->fd, sfd->offset, (off_t*)&sfd->len, &hdtr, 0); |
|
154 #else |
137 ret = sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len); |
155 ret = sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len); |
|
156 #endif |
138 } else { |
157 } else { |
139 // TODO: regular copy |
158 // TODO: regular copy |
140 fprintf(stderr, "sendfile not implemented for SYS_FILE\n"); |
159 fprintf(stderr, "sendfile not implemented for SYS_FILE\n"); |
141 } |
160 } |
142 |
161 |