Created
November 19, 2010 08:08
-
-
Save authorNari/706248 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/ext/cmain.cpp b/ext/cmain.cpp | |
index c9c2fdd..cd7f747 100644 | |
--- a/ext/cmain.cpp | |
+++ b/ext/cmain.cpp | |
@@ -464,12 +464,12 @@ extern "C" void evma_accept_ssl_peer (const unsigned long binding) | |
evma_get_peername | |
*****************/ | |
-extern "C" int evma_get_peername (const unsigned long binding, struct sockaddr *sa) | |
+extern "C" int evma_get_peername (const unsigned long binding, struct sockaddr *sa, socklen_t *len) | |
{ | |
ensure_eventmachine("evma_get_peername"); | |
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); | |
if (ed) { | |
- return ed->GetPeername (sa) ? 1 : 0; | |
+ return ed->GetPeername (sa, len) ? 1 : 0; | |
} | |
else | |
return 0; | |
@@ -479,12 +479,12 @@ extern "C" int evma_get_peername (const unsigned long binding, struct sockaddr * | |
evma_get_sockname | |
*****************/ | |
-extern "C" int evma_get_sockname (const unsigned long binding, struct sockaddr *sa) | |
+extern "C" int evma_get_sockname (const unsigned long binding, struct sockaddr *sa, socklen_t *len) | |
{ | |
ensure_eventmachine("evma_get_sockname"); | |
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); | |
if (ed) { | |
- return ed->GetSockname (sa) ? 1 : 0; | |
+ return ed->GetSockname (sa, len) ? 1 : 0; | |
} | |
else | |
return 0; | |
diff --git a/ext/ed.cpp b/ext/ed.cpp | |
index 4c40dcc..50fd632 100644 | |
--- a/ext/ed.cpp | |
+++ b/ext/ed.cpp | |
@@ -1393,12 +1393,11 @@ void AcceptorDescriptor::Heartbeat() | |
AcceptorDescriptor::GetSockname | |
*******************************/ | |
-bool AcceptorDescriptor::GetSockname (struct sockaddr *s) | |
+bool AcceptorDescriptor::GetSockname (struct sockaddr *s, socklen_t *len) | |
{ | |
bool ok = false; | |
if (s) { | |
- socklen_t len = sizeof(*s); | |
- int gp = getsockname (GetSocket(), s, &len); | |
+ int gp = getsockname (GetSocket(), s, len); | |
if (gp == 0) | |
ok = true; | |
} | |
@@ -1716,12 +1715,11 @@ int DatagramDescriptor::SendOutboundDatagram (const char *data, int length, cons | |
ConnectionDescriptor::GetPeername | |
*********************************/ | |
-bool ConnectionDescriptor::GetPeername (struct sockaddr *s) | |
+bool ConnectionDescriptor::GetPeername (struct sockaddr *s, socklen_t *len) | |
{ | |
bool ok = false; | |
if (s) { | |
- socklen_t len = sizeof(*s); | |
- int gp = getpeername (GetSocket(), s, &len); | |
+ int gp = getpeername (GetSocket(), s, len); | |
if (gp == 0) | |
ok = true; | |
} | |
@@ -1732,12 +1730,11 @@ bool ConnectionDescriptor::GetPeername (struct sockaddr *s) | |
ConnectionDescriptor::GetSockname | |
*********************************/ | |
-bool ConnectionDescriptor::GetSockname (struct sockaddr *s) | |
+bool ConnectionDescriptor::GetSockname (struct sockaddr *s, socklen_t *len) | |
{ | |
bool ok = false; | |
if (s) { | |
- socklen_t len = sizeof(*s); | |
- int gp = getsockname (GetSocket(), s, &len); | |
+ int gp = getsockname (GetSocket(), s, len); | |
if (gp == 0) | |
ok = true; | |
} | |
@@ -1770,10 +1767,11 @@ int ConnectionDescriptor::SetCommInactivityTimeout (uint64_t value) | |
DatagramDescriptor::GetPeername | |
*******************************/ | |
-bool DatagramDescriptor::GetPeername (struct sockaddr *s) | |
+bool DatagramDescriptor::GetPeername (struct sockaddr *s, socklen_t *len) | |
{ | |
bool ok = false; | |
if (s) { | |
+ *len = sizeof(struct sockaddr); | |
memset (s, 0, sizeof(struct sockaddr)); | |
memcpy (s, &ReturnAddress, sizeof(ReturnAddress)); | |
ok = true; | |
@@ -1785,12 +1783,11 @@ bool DatagramDescriptor::GetPeername (struct sockaddr *s) | |
DatagramDescriptor::GetSockname | |
*******************************/ | |
-bool DatagramDescriptor::GetSockname (struct sockaddr *s) | |
+bool DatagramDescriptor::GetSockname (struct sockaddr *s, socklen_t *len) | |
{ | |
bool ok = false; | |
if (s) { | |
- socklen_t len = sizeof(*s); | |
- int gp = getsockname (GetSocket(), s, &len); | |
+ int gp = getsockname (GetSocket(), s, len); | |
if (gp == 0) | |
ok = true; | |
} | |
diff --git a/ext/ed.h b/ext/ed.h | |
index bcfe682..ddc71ba 100644 | |
--- a/ext/ed.h | |
+++ b/ext/ed.h | |
@@ -64,8 +64,8 @@ class EventableDescriptor: public Bindable_t | |
void SetEventCallback (EMCallback); | |
- virtual bool GetPeername (struct sockaddr*) {return false;} | |
- virtual bool GetSockname (struct sockaddr*) {return false;} | |
+ virtual bool GetPeername (struct sockaddr*, socklen_t*) {return false;} | |
+ virtual bool GetSockname (struct sockaddr*, socklen_t*) {return false;} | |
virtual bool GetSubprocessPid (pid_t*) {return false;} | |
virtual void StartTls() {} | |
@@ -197,8 +197,8 @@ class ConnectionDescriptor: public EventableDescriptor | |
void SetServerMode() {bIsServer = true;} | |
- virtual bool GetPeername (struct sockaddr*); | |
- virtual bool GetSockname (struct sockaddr*); | |
+ virtual bool GetPeername (struct sockaddr*, socklen_t*); | |
+ virtual bool GetSockname (struct sockaddr*, socklen_t*); | |
virtual uint64_t GetCommInactivityTimeout(); | |
virtual int SetCommInactivityTimeout (uint64_t value); | |
@@ -279,8 +279,8 @@ class DatagramDescriptor: public EventableDescriptor | |
// Do we have any data to write? This is used by ShouldDelete. | |
virtual int GetOutboundDataSize() {return OutboundDataSize;} | |
- virtual bool GetPeername (struct sockaddr*); | |
- virtual bool GetSockname (struct sockaddr*); | |
+ virtual bool GetPeername (struct sockaddr*, socklen_t*); | |
+ virtual bool GetSockname (struct sockaddr*, socklen_t*); | |
virtual uint64_t GetCommInactivityTimeout(); | |
virtual int SetCommInactivityTimeout (uint64_t value); | |
@@ -319,7 +319,7 @@ class AcceptorDescriptor: public EventableDescriptor | |
virtual bool SelectForRead() {return true;} | |
virtual bool SelectForWrite() {return false;} | |
- virtual bool GetSockname (struct sockaddr*); | |
+ virtual bool GetSockname (struct sockaddr*, socklen_t*); | |
static void StopAcceptor (const unsigned long binding); | |
}; | |
diff --git a/ext/eventmachine.h b/ext/eventmachine.h | |
index 17947e1..75e5d09 100644 | |
--- a/ext/eventmachine.h | |
+++ b/ext/eventmachine.h | |
@@ -72,8 +72,8 @@ extern "C" { | |
void evma_accept_ssl_peer (const unsigned long binding); | |
#endif | |
- int evma_get_peername (const unsigned long binding, struct sockaddr*); | |
- int evma_get_sockname (const unsigned long binding, struct sockaddr*); | |
+ int evma_get_peername (const unsigned long binding, struct sockaddr*, socklen_t*); | |
+ int evma_get_sockname (const unsigned long binding, struct sockaddr*, socklen_t*); | |
int evma_get_subprocess_pid (const unsigned long binding, pid_t*); | |
int evma_get_subprocess_status (const unsigned long binding, int*); | |
int evma_get_connection_count(); | |
diff --git a/ext/rubymain.cpp b/ext/rubymain.cpp | |
index c9422b4..9cd33c5 100644 | |
--- a/ext/rubymain.cpp | |
+++ b/ext/rubymain.cpp | |
@@ -341,9 +341,10 @@ t_get_peername | |
static VALUE t_get_peername (VALUE self, VALUE signature) | |
{ | |
- struct sockaddr s; | |
- if (evma_get_peername (NUM2ULONG (signature), &s)) { | |
- return rb_str_new ((const char*)&s, sizeof(s)); | |
+ char buf[1024]; | |
+ socklen_t len = sizeof buf; | |
+ if (evma_get_peername (NUM2ULONG (signature), (struct sockaddr*)buf, &len)) { | |
+ return rb_str_new (buf, len); | |
} | |
return Qnil; | |
@@ -355,9 +356,10 @@ t_get_sockname | |
static VALUE t_get_sockname (VALUE self, VALUE signature) | |
{ | |
- struct sockaddr s; | |
- if (evma_get_sockname (NUM2ULONG (signature), &s)) { | |
- return rb_str_new ((const char*)&s, sizeof(s)); | |
+ char buf[1024]; | |
+ socklen_t len = sizeof buf; | |
+ if (evma_get_sockname (NUM2ULONG (signature), (struct sockaddr*)buf, &len)) { | |
+ return rb_str_new (buf, len); | |
} | |
return Qnil; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment