Thread View: comp.unix.programmer
9 messages
9 total messages
Started by eran yehudai
Fri, 14 Sep 1990 18:52
binding sockets
Author: eran yehudai
Date: Fri, 14 Sep 1990 18:52
Date: Fri, 14 Sep 1990 18:52
7 lines
800 bytes
800 bytes
I am trying to use bind() to create an entry in the file system for a socket. I find that a socket special file is created, but its name is only composed of the first two letters of the name I pass the system. The same phenomena occurs on both DEC3100 and a NeXT. Any ideas? -- Eran Yehudai eran@thsun1.slac.stanford.edu
Re: binding sockets
Author: Larry Wall
Date: Fri, 14 Sep 1990 20:54
Date: Fri, 14 Sep 1990 20:54
11 lines
1103 bytes
1103 bytes
In article <ERAN.90Sep14115242@elaine7.stanford.edu> eran@elaine7.stanford.edu (eran yehudai) writes: : I am trying to use bind() to create an entry in the file system for a : socket. I find that a socket special file is created, but its name is : only composed of the first two letters of the name I pass the system. : The same phenomena occurs on both DEC3100 and a NeXT. Any ideas? I suspect you're calling bind with two arguments instead of three, and the stack garbage happens to have a value of 2. Larry Wall lwall@jpl-devvax.jpl.nasa.gov
Re: binding sockets
Author: eran yehudai
Date: Sat, 15 Sep 1990 00:57
Date: Sat, 15 Sep 1990 00:57
6 lines
748 bytes
748 bytes
It seems the namelen parameter one passes bind() should be 2 + strlen(socketname), and then everything works. -- Eran Yehudai eran@thsun1.slac.stanford.edu
Re: binding sockets
Author: Jonathan I. Kamens
Date: Sun, 16 Sep 1990 18:37
Date: Sun, 16 Sep 1990 18:37
26 lines
1467 bytes
1467 bytes
In article <ERAN.90Sep14175746@adelbert9.stanford.edu>, eran@adelbert9.stanford.edu (eran yehudai) writes: |> It seems the namelen parameter one passes bind() should be |> 2 + strlen(socketname), and then everything works. No, actually, the namelen parameter one passes to bind() should be the sizeof the sockaddr structure being passed into it, e.g. (error checking omitted): #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <strings.h> struct sockaddr_un name; int s; name.sun_family = AF_UNIX; strcpy(name.sun_path, "/tmp/testsocket"); s = socket(PF_UNIX, SOCK_STREAM, 0); bind(s, &name, sizeof(name)); -- Jonathan Kamens USnail: MIT Project Athena 11 Ashford Terrace jik@Athena.MIT.EDU Allston, MA 02134 Office: 617-253-8495 Home: 617-782-0710
Re: binding sockets
Author: Chris Torek
Date: Wed, 19 Sep 1990 12:55
Date: Wed, 19 Sep 1990 12:55
22 lines
1497 bytes
1497 bytes
In article <1990Sep16.183730.18698@athena.mit.edu>
jik@athena.mit.edu (Jonathan I. Kamens) writes:
> No, actually, the namelen parameter one passes to bind() should be the
>sizeof the sockaddr structure being passed into it ...
Well, it `should' be 2+strlen(path), or (in 4.3BSD-reno) SUN_LEN:
> name.sun_family = AF_UNIX;
> strcpy(name.sun_path, "/tmp/testsocket");
> bind(s, &name, sizeof(name));
bind(s, &name, SUN_LEN(name));
Since the size of a sockaddr_un is carefully set to fill one mbuf, using
sizeof(name) will work, and you can `cheat' and just use sizeof(name): the
embedded '\0' will (must) be within the resulting single mbuf allocated
by the bind() system call and the name lookup will work. But the
documentation (such as it is) says that the name length `should' be
exactly right, and a future version of the system might require this.
--
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 405 2750)
Domain: chris@cs.umd.edu Path: uunet!mimsy!chris
Re: binding sockets
Author: Peter Jeffe 512.823.4091
Date: Wed, 19 Sep 1990 18:26
Date: Wed, 19 Sep 1990 18:26
16 lines
1376 bytes
1376 bytes
In article <26618@mimsy.umd.edu> chris@mimsy.umd.edu (Chris Torek) writes:
>In article <1990Sep16.183730.18698@athena.mit.edu>
>jik@athena.mit.edu (Jonathan I. Kamens) writes:
>> No, actually, the namelen parameter one passes to bind() should be the
>>sizeof the sockaddr structure being passed into it ...
>
>Well, it `should' be 2+strlen(path), or (in 4.3BSD-reno) SUN_LEN:
Not to quibble, but it `should' be "sizeof(name.sun_family)+strlen(path)";
or better yet, "sizeof(name)-sizeof(name.sun_path)+strlen(path)"; in any
case, assuming the 2 bytes is not a good idea.
-------------------------------------------------------------------------------
Peter Jeffe ...uunet!cs.utexas.edu!ibmaus!auschs!sandino.austin.ibm.com!jeffe
first they want a disclaimer, then they make you pee in a jar,
then they come for you in the night
Re: binding sockets
Author: Chris Torek
Date: Thu, 20 Sep 1990 14:47
Date: Thu, 20 Sep 1990 14:47
36 lines
1738 bytes
1738 bytes
>In article <26618@mimsy.umd.edu> I wrote: >>[namelen] `should' be 2+strlen(path), or (in 4.3BSD-reno) SUN_LEN: In article <3580@awdprime.UUCP> jeffe@sandino.austin.ibm.com (Peter Jeffe 512.823.4091) writes: >Not to quibble, but it `should' be "sizeof(name.sun_family)+strlen(path)"; Not so---and I specifically wrote `2' to avoid this---because in 4.3BSD-reno the result will be one byte too short. (You must also include sizeof(name.sun_len), which is 1.) >or better yet, "sizeof(name)-sizeof(name.sun_path)+strlen(path)"; This will work, and is how SUN_LEN is defined. >in any case, assuming the 2 bytes is not a good idea. Recommendation: add the following to your code, and then use SUN_LEN. #ifndef SUN_LEN /* actual length of an initialized sockaddr_un */ #define SUN_LEN(su) \ (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) #endif > >------------------------------------------------------------------------------- >Peter Jeffe ...uunet!cs.utexas.edu!ibmaus!auschs!sandino.austin.ibm.com!jeffe > first they want a disclaimer, then they make you pee in a jar, > then they come for you in the night -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 405 2750) Domain: chris@cs.umd.edu Path: uunet!mimsy!chris
Re: binding sockets
Author: Jonathan I. Kamens
Date: Mon, 24 Sep 1990 08:29
Date: Mon, 24 Sep 1990 08:29
23 lines
1612 bytes
1612 bytes
Now I'm confused. First of all, I thought all of the sockaddr structures (in 4.3BSD, "all" means sockaddr_in and sockaddr_un, unless I've forgotten something :-) are padded so that they're the same length. Is this not correct? Second, the documentation in /usr/doc/ps1/07.ipctut and /usr/doc/ps1/08.ipc all uses sizeof() on the sockaddr structure to get the third argument to bind(). Is that documentation all wrong, and if so, is it updated in 4.3-Reno? And finally, what do you mean when you say that the documentation "says that the name length `should' be exactly right"? I can't find any documentation anywhere, including the bind(2) man page in 4.3, that even mentions the namelen argument, let alone describes what it should be, and all the documentation that *does* show calls to bind() shows them using sizeof(), as I did. -- Jonathan Kamens USnail: MIT Project Athena 11 Ashford Terrace jik@Athena.MIT.EDU Allston, MA 02134 Office: 617-253-8495 Home: 617-782-0710
Re: binding sockets
Author: Chris Torek
Date: Mon, 24 Sep 1990 18:17
Date: Mon, 24 Sep 1990 18:17
44 lines
2486 bytes
2486 bytes
In article <1990Sep24.082942.10213@athena.mit.edu> jik@athena.mit.edu (Jonathan I. Kamens) writes: > First of all, I thought all of the sockaddr structures (in 4.3BSD, "all" >means sockaddr_in and sockaddr_un, unless I've forgotten something :-) are >padded so that they're the same length. Is this not correct? 4.3BSD-tahoe also has `sockaddr_xn', which is padded. However, a sockaddr_un is 112 bytes, and sockaddr_in and sockaddr_xn are both 16 bytes (and the same size as `sizeof(struct sockaddr)'). > Second, the documentation in /usr/doc/ps1/07.ipctut and /usr/doc/ps1/08.ipc >all uses sizeof() on the sockaddr structure to get the third argument to >bind(). Is that documentation all wrong, It is now. >and if so, is it updated in 4.3-Reno? Not yet (or at least, I have not updated ours). >And finally, what do you mean when you say that the documentation "says that >the name length `should' be exactly right"? I can't find any documentation >anywhere .... I guess maybe we never got around to writing it yet. :-) There was always a sneaky suspicion that a constant (`sizeof(...)' is always a constant) was not right. It worked for TCP/IP and for XNS, but it did not work properly for path names (a kludge---using the maximum size the current implementation could handle---made it function). Now, with ISO variable-length addresses, it also does not work for TP. The solution was to discard `backwards compatibility' except where such was essentially free, i.e., Internet, XNS, and---at least temporarily--- Unix domain sockets. (`Backwards compatibility means we get to keep all our old mistakes.') The iso(4) man page in 4.3-reno hints at the fact that sizeof() will fail under some circumstances, but is not clear on what is the `right' value for namelen. Something should be done about this someday. -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 405 2750) Domain: chris@cs.umd.edu Path: uunet!mimsy!chris
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads