get_myaddress problem

Ian Caddy ianc at goanna.iinet.net.au
Thu Jan 29 03:24:53 UTC 2009


Hi,

I had a quick look at this the other day and couldn't see anything 
obvious wrong, but I have put some comments in your email below:


ARQUER Stephane wrote:
> Hello,
> 
> I'm trying to debug my problem of get_myadress seg fault, I don't  
> understand something strange:
> 
> the function  get_myadress use a struct sockaddr_in * as input  
> parameter : addr.
> 
> but the struct ifreq doesn't have a struct sockaddr_in field ?
> The ifr->ifr_addr (ifr->ifr_ifru.ifru_addr) is a struct sockaddr .
> Is it normal ?

This appears to be normal in the networking code.  sockaddr is defined 
in cpukit/libnetworking/sys/scoket.h as:

struct sockaddr {
	unsigned char	sa_len;			/* total length */
	sa_family_t	sa_family;		/* address family */
	char	sa_data[14];		/* actually longer; address value */
};

where as sockaddr_in is the internet style of a sockaddr defined in 
cpukit/libnetworking/netinet/in.h as:

/* Socket address, internet style. */
struct sockaddr_in {
	uint8_t	sin_len;
	sa_family_t	sin_family;
	in_port_t	sin_port;
	struct	in_addr sin_addr;
	char	sin_zero[8];
};

In get_myaddress it is cast to the sockaddr_in format, and looking at 
the two structures, the first two elements are the same.

The sockaddr then has an array of 14 chars where sockaddr_in contains 
sin_port which is defined as uint16_t and sin_addr which is a uint32_t 
followed by 8 chars, and if packed would be 14 chars.

The only thing I could think that it could be would be some sort of 
packing issue, but I couldn't really see that the sockaddr would be 
bigger than the sockaddr_in.

regards,

Ian Caddy



-- 
Ian Caddy
Goanna Technologies Pty Ltd
+61 8 9444 2634





More information about the users mailing list