Subject: Re: accept() call
To: Christian Kuhtz <ckuhtz@paranet.com>
From: matthew green <mrg@eterna.com.au>
List: tech-net
Date: 02/04/1997 19:20:47
   
         new_socket=accept(socket,(struct sockaddr *)&cli_addr,&sizeof(cli_addr));

you can't take the address of a number.  sizeof() "returns" a number.
that's like trying to say:

accept(foo, bar, &4);
   
   Why is accept() declared as "int accept(int, struct sockaddr *, int *)" and  
   not "int accept(int, struct sockaddr *, int)"?  Why can't I typecast this  
   silly argument without having to waste another temporary variable?

it's passed as a pointer because the accept system call may alter the
size of it.  in netbsd-current, sys/kern/uipc_syscalls.c:sys_accept(),
look at the block of code starting at line 207:

	if (SCARG(uap, name)) {
   
   Heck, looking at the implementation in Rich Steven's TCP/IP Illustrated Vol  
   II, p. 458, it does even seem like it is using the third argument (retval) at  
   all!
   [ ... ]

retval is _not_ the third argument.  retval is the return value of the
system call -- in your example i've quoted above, it is eventually
assigned to `new_socket'.

   retval after that, both being local to the procedure (well, sort of).  And  
   since I have never seen anyone passing anything but sizeof() the sockaddr arg  
   down to accept(), what's the point?

different sockaddr structures have different sizes.  eg, sockaddr_un is
not the same size as sockaddr_in.