Skip to content

Commit

Permalink
Make EventMachine::Connection#get_peername and #get_sockname valid fo…
Browse files Browse the repository at this point in the history
…r IPv6 (closes eventmachine#132)

Signed-off-by: Aman Gupta <aman@tmm1.net>
  • Loading branch information
authorNari authored and tmm1 committed Feb 16, 2011
1 parent 1d9b28e commit 5651e9f
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 32 deletions.
8 changes: 4 additions & 4 deletions ext/cmain.cpp
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
23 changes: 10 additions & 13 deletions ext/ed.cpp
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down
14 changes: 7 additions & 7 deletions ext/ed.h
Expand Up @@ -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() {}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
};
Expand Down
4 changes: 2 additions & 2 deletions ext/eventmachine.h
Expand Up @@ -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();
Expand Down
14 changes: 8 additions & 6 deletions ext/rubymain.cpp
Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit 5651e9f

Please sign in to comment.