Skip to content

Instantly share code, notes, and snippets.

@authorNari
Created November 19, 2010 08:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save authorNari/706248 to your computer and use it in GitHub Desktop.
Save authorNari/706248 to your computer and use it in GitHub Desktop.
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