Henrik Nordstrom wrote:
> tis 2008-04-01 klockan 22:59 +1300 skrev Amos Jeffries:
>> I started out that way (assuming ss_len was absent but sin_len was 
>> present) but a header analysis proved the assumption wrong. sin_len also 
>> proves very absent from Debian Linux 2.6.25 headers.
> 
> Somehow I doubt that linux would change the socket ABI between 2.6.24
> and 2.6.25 breaking all applications..
> 
> Additinally the relevant header is not really from the kernel but
> glibc..
> 
>> OS that I know of and have tested the headers for all define a 
>> SOCKADDR_COMMON() macro for these types which neatly ensures they all 
>> have the same initial format within a given kernel. But not necessarily 
>> the same as other kernels.
> 
> Linux only has the family in the common part, with length being a family
> specific member so you need to look in the actual definition of
> sockaddr_in and sockaddr_in6 to find it.
rio:/usr/include# grep -R "sin_len" ./*
rio:/usr/include#
## bits/sockaddr.h
#
# /* POSIX.1g specifies this type name for the `sa_family' member.  */
# typedef unsigned short int sa_family_t;
#
# /* This macro is used to declare the initial common members
#    of the data types used for socket addresses, `struct sockaddr',
#    `struct sockaddr_in', `struct sockaddr_un', etc.  */
#
# #define __SOCKADDR_COMMON(sa_prefix) \
#   sa_family_t sa_prefix##family
#
#
## linux/in.h
#
# /* Structure describing an Internet (IP) socket address. */
# #define __SOCK_SIZE__   16              /* sizeof(struct sockaddr) */
# struct sockaddr_in {
#   sa_family_t           sin_family;     /* Address family    */
#   __be16                sin_port;       /* Port number       */
#   struct in_addr        sin_addr;       /* Internet address  */
#
#  /* Pad to size of `struct sockaddr'. */
#  unsigned char         __pad[__SOCK_SIZE__ - sizeof(short int) -
#                        sizeof(unsigned short int) -
#                        sizeof(struct in_addr)];
# };
# #define sin_zero        __pad           /* for BSD UNIX comp. -FvK */
## netinet/in.h
  - contains the same code with different comments.
{
   family
   port
   in_addr
   __padding
}
> 
> family
> ----
> length
> data
> 
> 
> FreeBSD has a both length and family in the common area
> 
> length
> family
> ---
> data
> 
> 
>> AFAICT they are formally required to do so for sockaddr_in6. But not for 
>> sockaddr_in or sockaddr_storage.
> 
> sockaddr_in must have a sin_length for BSD socket implementations, which
> is the common implementation seen in most OS:es...
> 
> sockaddr_storage does not have much requirements other than it being
> able to store all supported sockaddr formats and there at minimum being
> a ss_family member telling the address format..
> 
> Regards
> Henrik
> 
Amos
-- Please use Squid 2.6STABLE19 or 3.0STABLE3Received on Tue Apr 01 2008 - 05:38:55 MDT
This archive was generated by hypermail 2.2.0 : Wed Apr 30 2008 - 12:00:07 MDT