From: ghazel@... Date: 2011-06-17T10:12:55+09:00 Subject: [ruby-core:37192] rb_w32_add_socket / rb_w32_remove_socket --000325555866b19e5d04a5de151d Content-Type: text/plain; charset=UTF-8 Hello, There are many gems which attempt to make use of Windows sockets created by external libraries (libpq, libmysqlclient, libcurl, etc). Currently, they are all broken. This is impossible on Ruby 1.9, and on Ruby 1.8 it required a significant hack which I submitted to several projects only this year. First, I should make it clear that I think the correct way to fix this is to remove the use of _open_osfhandle *entirely* from win32/win32.c, as I suggested here: http://www.ruby-forum.com/topic/869239 However this is becoming increasingly more time consuming as Ruby 1.9 adds to the complexity of the win32 layer, and it seems unlikely that a 1.8 release with such a tremendously large patch would ever occur. So, attached are two very tiny patches for new functions which will allow gem authors to use externally created sockets. Their usage is as follows: int fd = libwhatever_get_socket(); #ifdef _WIN32 ruby_fd = rb_w32_add_socket(fd, 0); #else ruby_fd = fd; #endif ... do stuff with the ruby_fd as you would on other platforms ... #ifdef _WIN32 rb_w32_remove_socket(ruby_fd); #endif libwhatever_close_socket(fd); In a nutshell; you pass the SOCKET given to you by the external library to ruby and it gives you a CRT fd you can use with ruby functions. When you're done, you pass that CRT fd to ruby to remove it, and then close the SOCKET however the library normally does. If the ifdefs are not preferred, rb_add_socket / rb_remove_socket could be added as no-ops on non-win32 platforms, however I should stress that making this a permanent fixture of the API is probably a mistake, and the ruby win32 code should be rewritten to use HANDLEs/SOCKETs instead of CRT fds. Thoughts? -Greg --000325555866b19e5d04a5de151d Content-Type: application/octet-stream; name="add_socket.1_8.patch" Content-Disposition: attachment; filename="add_socket.1_8.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gp0ftm9s0 SW5kZXg6IHdpbjMyL3dpbjMyLmMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSB3aW4zMi93aW4zMi5jCShyZXZp c2lvbiAzMTk5OSkNCisrKyB3aW4zMi93aW4zMi5jCSh3b3JraW5nIGNvcHkpDQpAQCAtMTkyNyw2 ICsxOTI3LDE5IEBADQogfQogI2VuZGlmCiAKK2ludAorcmJfdzMyX2FkZF9zb2NrZXQoU09DS0VU IHNvY2ssIGludCBmbGFnKQoreworICAgIHJldHVybiByYl93MzJfb3Blbl9vc2ZoYW5kbGUoc29j aywgT19SRFdSfE9fQklOQVJZfE9fTk9JTkhFUklUKTsKK30KKwordm9pZAorcmJfdzMyX3JlbW92 ZV9zb2NrZXQoaW50IGZkKQoreworICAgIF9zZXRfb3NmaG5kKGZkLCAoU09DS0VUKUlOVkFMSURf SEFORExFX1ZBTFVFKTsKKyAgICBfY2xvc2UoZmQpOworfQorCiAjdW5kZWYgZ2V0c29ja29wdAog CiBzdGF0aWMgaW50CkluZGV4OiB3aW4zMi93aW4zMi5oDQo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gd2luMzIv d2luMzIuaAkocmV2aXNpb24gMzE5OTkpDQorKysgd2luMzIvd2luMzIuaAkod29ya2luZyBjb3B5 KQ0KQEAgLTYxMiw2ICs2MTIsOCBAQA0KIHNpemVfdCByYl93MzJfd3JpdGUoaW50LCBjb25zdCB2 b2lkICosIHNpemVfdCk7CiBpbnQgIHJiX3czMl91dGltZShjb25zdCBjaGFyICosIHN0cnVjdCB1 dGltYnVmICopOwogI2RlZmluZSBTbGVlcChtc2VjKSAodm9pZClyYl93MzJfc2xlZXAobXNlYykK K2ludCAgcmJfdzMyX2FkZF9zb2NrZXQoU09DS0VUIHNvY2ssIGludCBmbGFnKTsKK3ZvaWQgcmJf dzMyX3JlbW92ZV9zb2NrZXQoaW50IGZkKTsKIAogLyoKID09ICoqKkNBVVRJT04qKioK --000325555866b19e5d04a5de151d Content-Type: application/octet-stream; name="add_socket.1_9.patch" Content-Disposition: attachment; filename="add_socket.1_9.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gp0ftzkx1 SW5kZXg6IGluY2x1ZGUvcnVieS93aW4zMi5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gaW5jbHVkZS9ydWJ5 L3dpbjMyLmgJKHJldmlzaW9uIDMyMTM2KQ0KKysrIGluY2x1ZGUvcnVieS93aW4zMi5oCSh3b3Jr aW5nIGNvcHkpDQpAQCAtMjM1LDYgKzIzNSw4IEBADQogZXh0ZXJuIHJiX3BpZF90ICByYl93MzJf cGlwZV9leGVjKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCAqLCBpbnQgKik7 CiBleHRlcm4gaW50ICAgIGZsb2NrKGludCBmZCwgaW50IG9wZXIpOwogZXh0ZXJuIGludCAgICBy Yl93MzJfaGFzX2NhbmNlbF9pbyh2b2lkKTsKK2V4dGVybiBpbnQgICAgcmJfdzMyX2FkZF9zb2Nr ZXQoU09DS0VULCBpbnQpOworZXh0ZXJuIHZvaWQgICByYl93MzJfcmVtb3ZlX3NvY2tldChpbnQp OwogZXh0ZXJuIGludCAgICByYl93MzJfaXNfc29ja2V0KGludCk7CiBleHRlcm4gaW50ICAgIFdT QUFQSSByYl93MzJfYWNjZXB0KGludCwgc3RydWN0IHNvY2thZGRyICosIGludCAqKTsKIGV4dGVy biBpbnQgICAgV1NBQVBJIHJiX3czMl9iaW5kKGludCwgY29uc3Qgc3RydWN0IHNvY2thZGRyICos IGludCk7CkluZGV4OiB3aW4zMi93aW4zMi5jDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gd2luMzIvd2luMzIu YwkocmV2aXNpb24gMzIxMzYpDQorKysgd2luMzIvd2luMzIuYwkod29ya2luZyBjb3B5KQ0KQEAg LTIxNzcsNiArMjE3NywyNiBAQA0KIH0KICNlbmRpZgogCitpbnQKK3JiX3czMl9hZGRfc29ja2V0 KFNPQ0tFVCBzb2NrLCBpbnQgZmxhZykKK3sKKyAgICBpbnQgZmQgPSByYl93MzJfb3Blbl9vc2Zo YW5kbGUoc29jaywgT19SRFdSfE9fQklOQVJZfE9fTk9JTkhFUklUKTsKKyAgICBpZiAoZmQgIT0g LTEpIHsKKyAgICAgICAgc3RfaW5zZXJ0KHNvY2tsaXN0LCAoc3RfZGF0YV90KXNvY2ssIChzdF9k YXRhX3QpZmxhZyk7CisgICAgfQorICAgIHJldHVybiBmZDsKK30KKwordm9pZAorcmJfdzMyX3Jl bW92ZV9zb2NrZXQoaW50IGZkKQoreworICAgIFNPQ0tFVCBzb2NrID0gVE9fU09DS0VUKGZkKTsK KyAgICBzdF9kYXRhX3Qga2V5ID0gKHN0X2RhdGFfdClzb2NrOworICAgIHN0X2RlbGV0ZShzb2Nr bGlzdCwgJmtleSwgTlVMTCk7CisgICAgX3NldF9vc2ZobmQoZmQsIChTT0NLRVQpSU5WQUxJRF9I QU5ETEVfVkFMVUUpOworICAgIF9jbG9zZShmZCk7Cit9CisKICN1bmRlZiBnZXRzb2Nrb3B0CiAK IHN0YXRpYyBpbnQK --000325555866b19e5d04a5de151d--