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