[dtrace-discuss] values from a struct

James Carlson
2010-09-17T15:31:17Z

goinsane wrote:
>> (This assumes the application is 32-bit or at least
>> that the system is
>> little-endian.  Things get more complicated if you
>> have to deal with
>> 64-bit big-endian systems.)
>>
>
> Hm, that''s a point I had not noticed yet. I expected the D scripts
running independent from the system''s arch. But as it becomes more
complex, it seems this has to be handled, too.

D scripts run in the context of the kernel.  If you''ve got a 64-bit
kernel, then your D scripts run as (effectively) 64-bit applications.
User-space applications on a 64-bit system, though, may be either 32-bit
or 64-bit; the system supports both simultaneously.  That''s what adds
in
a bit of complexity.  Things running in the kernel (such as D scripts)
need to be aware of what flavor of application is out there when they go
mucking around with application data structures -- as with copyin.

> Right now, I''m running at 64 bit i86pc . I''m getting a
value of the port (have to verify it), but no value of the ip address.
>
>    self->port = self->sockcont->sin_port;
>    self->ip_int = (uint_t)self->sockcont->sin_addr.s_addr;

Don''t forget that the port number will be in network (big-endian) byte
order.

As for the problem with the IP address, I don''t know what could be
going
on.  You might want to try a truss -vall to see if the values you''re
getting are the ones you''re expecting.

The alignment of sockaddr_in is such that I''d expect it to work fine
over the 32/64 boundary without special handling, so if you''re seeing
unexpected behavior here, it''s time to start dumping everything --
start
by printing out the length of the structure that''s being copied
(perhaps
that''s wrong) and the first few bytes of the structure to see if
it''s
what you expect.

--
James Carlson         42.703N 71.076W         <carlsonj at
workingcode.com>