diff options
| author | Rubyist <[email protected]> | 2015-07-18 23:22:57 -0700 |
|---|---|---|
| committer | Rubyist <[email protected]> | 2015-07-18 23:22:57 -0700 |
| commit | a426f0e2b580ce4c7335c4040458b1239148b6e2 (patch) | |
| tree | 142077da9a7173a38c7aab0660a164a04d367c91 /src | |
| parent | 752f7c1526ab2eace3c8d49cc73f963b00e1c3c7 (diff) | |
| download | mruby-a426f0e2b580ce4c7335c4040458b1239148b6e2.tar.gz mruby-a426f0e2b580ce4c7335c4040458b1239148b6e2.zip | |
Overrided close and write to work on Win32 platforms
Diffstat (limited to 'src')
| -rw-r--r-- | src/socket.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/socket.c b/src/socket.c index 506142f3f..00f1c6ce4 100644 --- a/src/socket.c +++ b/src/socket.c @@ -649,6 +649,37 @@ mrb_tcpsocket_allocate(mrb_state *mrb, mrb_value klass) return mrb_obj_value((struct RObject*)mrb_obj_alloc(mrb, ttype, c)); } +/* Windows overrides for IO methods on BasicSocket objects. + * This is because sockets on Windows are not the same as file + * descriptors, and thus functions which operate on file descriptors + * will break on socket descriptors. + */ +#ifdef _WIN32 +static mrb_value +mrb_win32_basicsocket_close(mrb_state *mrb, mrb_value self) +{ + if (closesocket(socket_fd(mrb, self)) != NO_ERROR) + mrb_sys_fail(mrb, "closesocket"); + return mrb_nil_value(); +} + +static mrb_value +mrb_win32_basicsocket_write(mrb_state *mrb, mrb_value self) +{ + int n; + SOCKET sd; + mrb_value str; + + sd = socket_fd(mrb, self); + mrb_get_args(mrb, "S", &str); + n = send(sd, RSTRING_PTR(str), RSTRING_LEN(str), 0); + if (n == SOCKET_ERROR) + mrb_sys_fail(mrb, "write"); + return mrb_fixnum_value(n); +} + +#endif + void mrb_mruby_socket_gem_init(mrb_state* mrb) { @@ -728,6 +759,12 @@ mrb_mruby_socket_gem_init(mrb_state* mrb) //mrb_define_method(mrb, usock, "recvfrom", mrb_unixsocket_peeraddr, MRB_ARGS_NONE()); //mrb_define_method(mrb, usock, "send_io", mrb_unixsocket_peeraddr, MRB_ARGS_NONE()); + /* Windows IO Method Overrides on BasicSocket */ +#ifdef _WIN32 + mrb_define_method(mrb, bsock, "close", mrb_win32_basicsocket_close, MRB_ARGS_NONE()); + mrb_define_method(mrb, bsock, "write", mrb_win32_basicsocket_write, MRB_ARGS_REQ(1)); +#endif + constants = mrb_define_module_under(mrb, sock, "Constants"); #define define_const(SYM) \ |
