[ 
https://issues.apache.org/jira/browse/THRIFT-900?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12915622#action_12915622
 ] 

Christian Lavoie commented on THRIFT-900:
-----------------------------------------

Ok, I looked into this some more, I think you've got a few mugs when computing 
addrlen to pass to {{bind}}:

# {{sprintf}} does NOT take into account the trailing \0 (at least you have an 
off-by-one error here)
# you're manually the length of {{sun_path}} and {{sun_family}} instead of 
calling {{sizeof}} -- which means you're missing out on other fields in the 
struct, or for that matter, padding between fields
# using an {{int}} instead of {{socklen_t}} to hold the length of the socket 
address (minor, but while you're at it...)

I changed the {{TServerSocket.cpp}} code thusly, which works on both my Mac and 
my Linux virtual machine:

{noformat}
257   if (! path_.empty()) {
258     // Unix Domain Socket
259     struct sockaddr_un address;
260     socklen_t len;
261 
262     if (path_.length() > sizeof(address.sun_path)) {
263       int errno_copy = errno;
264       GlobalOutput.perror("TSocket::listen() Unix Domain socket path too 
long", errno_copy);
265       throw TTransportException(TTransportException::NOT_OPEN, " Unix 
Domain socket path too long");
266     }
267 
268     address.sun_family = AF_UNIX;
269     sprintf(address.sun_path, path_.c_str());
270     len = sizeof(address);
271     std::cerr << len << ": address.sun_path(" << address.sun_path << ") 
path_(" << path_ << ")" << std::endl;
{noformat}

As it happens, it's also what my copy of Stevens says in its example for using 
{{bind}} on {{AF_UNIX}} sockets with regards to {{addrlen}}.

The linux box (amd64 virtual machine) says:

{noformat}
$ ./server.linux /tmp/sock123
Starting the server...
TServerSocket::listen() IPV6_V6ONLY Operation not supported on socket
106: address.sun_path(/tmp/sock123) path_(/tmp/sock123)
{noformat}

and the mac (10.6, x86):

{noformat}
$ ./server.mac /tmp/sock123
Starting the server...
TServerSocket::listen() IPV6_V6ONLY Operation not supported on socket
110: address.sun_path(/tmp/sock123) path_(/tmp/sock123)
{noformat}

Not sure why they socket structure is of different length -- but it illustrates 
my point above: doing it by hand is not an optimal approach.

> Unix domain socket
> ------------------
>
>                 Key: THRIFT-900
>                 URL: https://issues.apache.org/jira/browse/THRIFT-900
>             Project: Thrift
>          Issue Type: New Feature
>          Components: C++ - Library
>         Environment: Debian GNU/Linux Lenny
>            Reporter: Roger Meier
>             Fix For: 0.6
>
>         Attachments: THRIFT-900_UnixDomainSockets.v2.patch, 
> THRIFT-900_UnixDomainSockets.v3.patch, THRIFT-900_UnixDominSockets.patch
>
>
> I would like to use Unix domain sockets.
> client side:
> {code}
> shared_ptr<TSocket> socket(new TSocket("/tmp/ThriftTest.binary.thrift"));
> // as alternative to
> shared_ptr<TSocket> socket(new TSocket(host, port));
> {code}
> server side:
> {code}
> shared_ptr<TServerSocket> serverSocket(new 
> TServerSocket("/tmp/ThriftTest.binary.thrift"));
> // as alternative to
> shared_ptr<TServerSocket> serverSocket(new TServerSocket(port));
> {code}
> further enhancement might be:
> use a RFC 3986 compliant URI parser e.g. by using 
> http://uriparser.sourceforge.net/ (BSD License)
> and pass a real URI to the constructor, e.g. 
> file:///tmp/ThriftTest.binary.thrift

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to