134 ssize_t r = read(st->fd, buf, nbytes); |
134 ssize_t r = read(st->fd, buf, nbytes); |
135 st->read += r; |
135 st->read += r; |
136 return r; |
136 return r; |
137 } |
137 } |
138 |
138 |
139 ssize_t net_stream_sendfile(NetIOStream *st, sendfiledata *sfd) { |
139 ssize_t net_stream_sendfile(NetIOStream *st, sendfiledata *sfd) { |
140 // TODO: header and trailer |
|
141 ssize_t ret = 0; |
140 ssize_t ret = 0; |
142 off_t fileoffset = sfd->offset; |
141 off_t fileoffset = sfd->offset; |
143 if(sfd->fd->fd != -1) { |
142 if(sfd->fd->fd != -1) { |
144 #ifdef BSD |
143 #ifdef BSD |
145 struct iovec hdvec; |
144 struct iovec hdvec; |
166 &hdtr, |
165 &hdtr, |
167 NULL, |
166 NULL, |
168 0); |
167 0); |
169 #endif |
168 #endif |
170 #else // Solaris/Linux |
169 #else // Solaris/Linux |
171 ret = sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len); |
170 if(sfd->header) { |
|
171 ret += write(st->fd, sfd->header, sfd->hlen); |
|
172 } |
|
173 ret += sendfile(st->fd, sfd->fd->fd, &fileoffset, sfd->len); |
|
174 if(sfd->trailer) { |
|
175 ret += write(st->fd, sfd->trailer, sfd->tlen); |
|
176 } |
172 #endif |
177 #endif |
173 } else { |
178 } else { |
174 // TODO: regular copy |
179 // TODO: regular copy |
175 fprintf(stderr, "sendfile not implemented for SYS_FILE\n"); |
180 fprintf(stderr, "sendfile not implemented for SYS_FILE\n"); |
176 } |
181 } |