src/server/util/io.c

changeset 415
d938228c382e
parent 407
78af44222463
child 430
83560f32e7d5
equal deleted inserted replaced
414:99a34860c105 415:d938228c382e
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
248 249
249 IOStream* httpstream_new(pool_handle_t *pool, IOStream *fd) { 250 IOStream* httpstream_new(pool_handle_t *pool, IOStream *fd) {
250 HttpStream *st = pool_malloc(pool, sizeof(HttpStream)); 251 HttpStream *st = pool_malloc(pool, sizeof(HttpStream));
251 st->st = http_io_funcs; 252 st->st = http_io_funcs;
252 st->fd = fd; 253 st->fd = fd;
254 st->written = 0;
253 st->max_read = 0; 255 st->max_read = 0;
254 st->read = 0; 256 st->read = 0;
255 st->read_total = 0; 257 st->read_total = 0;
256 st->readbuf = NULL; 258 st->readbuf = NULL;
257 st->bufsize = 0; 259 st->bufsize = 0;
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;

mercurial