64 #include "../daemon/vfs.h" |
64 #include "../daemon/vfs.h" |
65 #include "io.h" |
65 #include "io.h" |
66 #include "pool.h" |
66 #include "pool.h" |
67 #include "../daemon/netsite.h" |
67 #include "../daemon/netsite.h" |
68 #include "../daemon/event.h" |
68 #include "../daemon/event.h" |
69 #include "ucx/utils.h" |
69 #include "cx/utils.h" |
|
70 #include <cx/printf.h> |
70 |
71 |
71 IOStream native_io_funcs = { |
72 IOStream native_io_funcs = { |
72 (io_write_f)net_sys_write, |
73 (io_write_f)net_sys_write, |
73 (io_writev_f)net_sys_writev, |
74 (io_writev_f)net_sys_writev, |
74 (io_read_f)net_sys_read, |
75 (io_read_f)net_sys_read, |
104 0 |
105 0 |
105 }; |
106 }; |
106 |
107 |
107 |
108 |
108 /* |
109 /* |
109 * SysStream implementation |
110 * Sycx_stream implementation |
110 */ |
111 */ |
111 |
112 |
112 IOStream* sysstream_new(pool_handle_t *pool, SYS_SOCKET fd) { |
113 IOStream* sycx_stream_new(pool_handle_t *pool, SYS_SOCKET fd) { |
113 SysStream *st = pool_malloc(pool, sizeof(SysStream)); |
114 Sycx_stream *st = pool_malloc(pool, sizeof(Sycx_stream)); |
114 st->st = native_io_funcs; |
115 st->st = native_io_funcs; |
115 st->fd = fd; |
116 st->fd = fd; |
116 return (IOStream*)st; |
117 return (IOStream*)st; |
117 } |
118 } |
118 |
119 |
119 #ifdef XP_UNIX |
120 #ifdef XP_UNIX |
120 ssize_t net_sys_write(SysStream *st, void *buf, size_t nbytes) { |
121 ssize_t net_sys_write(Sycx_stream *st, void *buf, size_t nbytes) { |
121 return write(st->fd, buf, nbytes); |
122 return write(st->fd, buf, nbytes); |
122 } |
123 } |
123 |
124 |
124 ssize_t net_sys_writev(SysStream *st, struct iovec *iovec, int iovcnt) { |
125 ssize_t net_sys_writev(Sycx_stream *st, struct iovec *iovec, int iovcnt) { |
125 return writev(st->fd, iovec, iovcnt); |
126 return writev(st->fd, iovec, iovcnt); |
126 } |
127 } |
127 |
128 |
128 ssize_t net_sys_read(SysStream *st, void *buf, size_t nbytes) { |
129 ssize_t net_sys_read(Sycx_stream *st, void *buf, size_t nbytes) { |
129 return read(st->fd, buf, nbytes); |
130 return read(st->fd, buf, nbytes); |
130 } |
131 } |
131 |
132 |
132 #ifdef WS_SENDFILE |
133 #ifdef WS_SENDFILE |
133 ssize_t net_sys_sendfile(SysStream *st, sendfiledata *sfd) { |
134 ssize_t net_sys_sendfile(Sycx_stream *st, sendfiledata *sfd) { |
134 ssize_t ret = 0; |
135 ssize_t ret = 0; |
135 off_t fileoffset = sfd->offset; |
136 off_t fileoffset = sfd->offset; |
136 if(sfd->fd->fd != -1) { |
137 if(sfd->fd->fd != -1) { |
137 #ifdef BSD |
138 #ifdef BSD |
138 struct iovec hdvec; |
139 struct iovec hdvec; |
175 |
176 |
176 return ret; |
177 return ret; |
177 } |
178 } |
178 #endif |
179 #endif |
179 |
180 |
180 void net_sys_close(SysStream *st) { |
181 void net_sys_close(Sycx_stream *st) { |
181 system_close(st->fd); |
182 system_close(st->fd); |
182 } |
183 } |
183 |
184 |
184 void net_sys_setmode(SysStream *st, int mode) { |
185 void net_sys_setmode(Sycx_stream *st, int mode) { |
185 int flags; |
186 int flags; |
186 if (-1 == (flags = fcntl(st->fd, F_GETFL, 0))) { |
187 if (-1 == (flags = fcntl(st->fd, F_GETFL, 0))) { |
187 flags = 0; |
188 flags = 0; |
188 } |
189 } |
189 if(mode == IO_MODE_BLOCKING) { |
190 if(mode == IO_MODE_BLOCKING) { |
197 // TODO: error |
198 // TODO: error |
198 } |
199 } |
199 } |
200 } |
200 } |
201 } |
201 |
202 |
202 int net_sys_poll(SysStream *st, EventHandler *ev, int events, Event *cb) { |
203 int net_sys_poll(Sycx_stream *st, EventHandler *ev, int events, Event *cb) { |
203 switch(events) { |
204 switch(events) { |
204 default: return -1; |
205 default: return -1; |
205 case IO_POLL_NONE: return ev_remove_poll(ev, st->fd); |
206 case IO_POLL_NONE: return ev_remove_poll(ev, st->fd); |
206 case IO_POLL_IN: return ev_pollin(ev, st->fd, cb); |
207 case IO_POLL_IN: return ev_pollin(ev, st->fd, cb); |
207 case IO_POLL_OUT: return ev_pollout(ev, st->fd, cb); |
208 case IO_POLL_OUT: return ev_pollout(ev, st->fd, cb); |
209 } |
210 } |
210 } |
211 } |
211 |
212 |
212 #elif defined(XP_WIN32) |
213 #elif defined(XP_WIN32) |
213 |
214 |
214 ssize_t net_sys_write(SysStream *st, void *buf, size_t nbytes) { |
215 ssize_t net_sys_write(Sycx_stream *st, void *buf, size_t nbytes) { |
215 int ret = send(st->fd, buf, nbytes, 0); |
216 int ret = send(st->fd, buf, nbytes, 0); |
216 if(ret == SOCKET_ERROR) { |
217 if(ret == SOCKET_ERROR) { |
217 return IO_ERROR; |
218 return IO_ERROR; |
218 } |
219 } |
219 return ret; |
220 return ret; |
220 } |
221 } |
221 |
222 |
222 ssize_t net_sys_writev(SysStream *st, struct iovec *iovec, int iovcnt) { |
223 ssize_t net_sys_writev(Sycx_stream *st, struct iovec *iovec, int iovcnt) { |
223 // TODO |
224 // TODO |
224 } |
225 } |
225 |
226 |
226 ssize_t net_sys_read(SysStream *st, void *buf, size_t nbytes) { |
227 ssize_t net_sys_read(Sycx_stream *st, void *buf, size_t nbytes) { |
227 int ret = recv(st->fd, buf, nbytes, 0); |
228 int ret = recv(st->fd, buf, nbytes, 0); |
228 if(ret == SOCKET_ERROR) { |
229 if(ret == SOCKET_ERROR) { |
229 return IO_ERROR; |
230 return IO_ERROR; |
230 } |
231 } |
231 return ret; |
232 return ret; |
232 } |
233 } |
233 |
234 |
234 ssize_t net_sys_sendfile(SysStream *st, sendfiledata *sfd) { |
235 ssize_t net_sys_sendfile(Sycx_stream *st, sendfiledata *sfd) { |
235 // TODO |
236 // TODO |
236 } |
237 } |
237 |
238 |
238 void net_sys_close(SysStream *st) { |
239 void net_sys_close(Sycx_stream *st) { |
239 closesocket(st->fd); |
240 closesocket(st->fd); |
240 } |
241 } |
241 |
242 |
242 #endif |
243 #endif |
243 |
244 |
745 } |
747 } |
746 |
748 |
747 ssize_t net_printf(SYS_NETFD fd, char *format, ...) { |
749 ssize_t net_printf(SYS_NETFD fd, char *format, ...) { |
748 va_list arg; |
750 va_list arg; |
749 va_start(arg, format); |
751 va_start(arg, format); |
750 sstr_t buf = ucx_vasprintf(ucx_default_allocator(), format, arg); |
752 cxmutstr buf = cx_vasprintf_a(cxDefaultAllocator, format, arg); |
751 ssize_t r = buf.length > 0 ? net_write(fd, buf.ptr, buf.length) : 0; |
753 ssize_t r = buf.length > 0 ? net_write(fd, buf.ptr, buf.length) : 0; |
752 free(buf.ptr); |
754 free(buf.ptr); |
753 va_end(arg); |
755 va_end(arg); |
754 if(r < 0) { |
756 if(r < 0) { |
755 ((IOStream*)fd)->io_errno = errno; |
757 ((IOStream*)fd)->io_errno = errno; |