summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorRubyist <[email protected]>2015-07-18 23:22:57 -0700
committerRubyist <[email protected]>2015-07-18 23:22:57 -0700
commita426f0e2b580ce4c7335c4040458b1239148b6e2 (patch)
tree142077da9a7173a38c7aab0660a164a04d367c91 /src
parent752f7c1526ab2eace3c8d49cc73f963b00e1c3c7 (diff)
downloadmruby-a426f0e2b580ce4c7335c4040458b1239148b6e2.tar.gz
mruby-a426f0e2b580ce4c7335c4040458b1239148b6e2.zip
Overrided close and write to work on Win32 platforms
Diffstat (limited to 'src')
-rw-r--r--src/socket.c37
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) \