| 207 void net_sys_close(Sysstream *st) { |
207 void net_sys_close(Sysstream *st) { |
| 208 system_close(st->fd); |
208 system_close(st->fd); |
| 209 } |
209 } |
| 210 |
210 |
| 211 void net_sys_setmode(Sysstream *st, int mode) { |
211 void net_sys_setmode(Sysstream *st, int mode) { |
| |
212 if(mode > IO_MODE_NONBLOCKING) { |
| |
213 return; |
| |
214 } |
| 212 int flags; |
215 int flags; |
| 213 if (-1 == (flags = fcntl(st->fd, F_GETFL, 0))) { |
216 if (-1 == (flags = fcntl(st->fd, F_GETFL, 0))) { |
| 214 flags = 0; |
217 flags = 0; |
| 215 } |
218 } |
| 216 if(mode == IO_MODE_BLOCKING) { |
219 if(mode == IO_MODE_BLOCKING) { |
| 535 } else { |
538 } else { |
| 536 ssize_t w = fd->writev(fd, iovec, iovcnt); |
539 ssize_t w = fd->writev(fd, iovec, iovcnt); |
| 537 st->written += w; |
540 st->written += w; |
| 538 return w; |
541 return w; |
| 539 } |
542 } |
| |
543 } |
| |
544 |
| |
545 ssize_t net_http_write_raw(HttpStream *st, const void *buf, size_t nbytes) { |
| |
546 return st->fd->write(st->fd, buf, nbytes); |
| |
547 } |
| |
548 |
| |
549 ssize_t net_http_writev_raw(HttpStream *st, struct iovec *iovec, int iovcnt) { |
| |
550 return st->fd->writev(st->fd, iovec, iovcnt); |
| 540 } |
551 } |
| 541 |
552 |
| 542 ssize_t net_http_read(HttpStream *st, void *buf, size_t nbytes) { |
553 ssize_t net_http_read(HttpStream *st, void *buf, size_t nbytes) { |
| 543 if(st->read >= st->max_read) { |
554 if(st->read >= st->max_read) { |
| 544 st->read_eof = WS_TRUE; |
555 st->read_eof = WS_TRUE; |
| 795 } |
806 } |
| 796 |
807 |
| 797 return rd; |
808 return rd; |
| 798 } |
809 } |
| 799 |
810 |
| |
811 ssize_t net_http_read_raw(HttpStream *st, void *buf, size_t nbytes) { |
| |
812 return st->fd->read(st->fd, buf, nbytes); |
| |
813 } |
| |
814 |
| 800 ssize_t net_http_sendfile(HttpStream *st, sendfiledata *sfd) { |
815 ssize_t net_http_sendfile(HttpStream *st, sendfiledata *sfd) { |
| 801 if(st->write_eof) return 0; |
816 if(st->write_eof) return 0; |
| 802 ssize_t ret = 0; |
817 ssize_t ret = 0; |
| 803 // TODO: support chunked transfer encoding |
818 // TODO: support chunked transfer encoding |
| 804 if(st->fd->sendfile) { |
819 if(st->fd->sendfile) { |
| 822 } |
837 } |
| 823 st->write_eof = WS_TRUE; |
838 st->write_eof = WS_TRUE; |
| 824 } |
839 } |
| 825 |
840 |
| 826 void net_http_setmode(HttpStream *st, int mode) { |
841 void net_http_setmode(HttpStream *st, int mode) { |
| 827 st->fd->setmode(st->fd, mode); |
842 if(mode == IO_MODE_RAW) { |
| |
843 st->raw = TRUE; |
| |
844 } else { |
| |
845 st->fd->setmode(st->fd, mode); |
| |
846 } |
| 828 } |
847 } |
| 829 |
848 |
| 830 int net_http_poll(HttpStream *st, EventHandler *ev, int events, Event *cb) { |
849 int net_http_poll(HttpStream *st, EventHandler *ev, int events, Event *cb) { |
| 831 return st->fd->poll(st->fd, ev, events, cb); |
850 return st->fd->poll(st->fd, ev, events, cb); |
| 832 } |
851 } |