Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2019-04

Translating c records

3 messages · 3 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Rainer Stratmann
struct sockaddr_ll {
     unsigned short sll_family;
     unsigned short sll_protocol;
     int            sll_ifindex;
     unsigned short sll_hatype;
     unsigned char  sll_pkttype;
     unsigned char  sll_halen;
     unsigned char  sll_addr[8];
 };
type
 sockaddr_ll = record
  sll_family : word;
  sll_protocol : word;
  sll_ifindex : integer;
  sll_hatype : word;
  sll_pkttype : byte;
  sll_halen : byte;
  sll_addr: array[ 0 .. 7 ] of byte;
 end;

Is this correct?

Reply by email

Michael Van Canneyt
to Rainer Stratmann
Rainer Stratmann wrote 23 lines
struct sockaddr_ll { unsigned short sll_family; unsigned short sll_protocol; int sll_ifindex; unsigned short sll_hatype; unsigned char sll_pkttype; unsigned char sll_halen; unsigned char sll_addr[8]; }; type sockaddr_ll = record sll_family : word; sll_protocol : word; sll_ifindex : integer; sll_hatype : word; sll_pkttype : byte; sll_halen : byte; sll_addr: array[ 0 .. 7 ] of byte; end; Is this correct?
if you add
{$PPACKRECORDS C}

And make integer a longint (that is always 4 bytes, regardless of the mode you're compiling in), then it should be OK.

You can always compare with

#include <stdio.h>
#include <yourcheader.h>

int main () {

   printf("%d\n",sizeof(struct sockaddr_l));

}

and in pascal
writeln(sizeof(sockaddr_ll));

Michael.

Reply by email

silvioprog
to Rainer Stratmann: struct sockaddr_ll { unsigned short sll_family; unsigned short sll_protocol; int …

On Wed, Apr 24, 2019 at 5:41 PM Rainer Stratmann <

Show quoted text 24 lines
wrote: struct sockaddr_ll { unsigned short sll_family; unsigned short sll_protocol; int sll_ifindex; unsigned short sll_hatype; unsigned char sll_pkttype; unsigned char sll_halen; unsigned char sll_addr[8]; }; type sockaddr_ll = record sll_family : word; sll_protocol : word; sll_ifindex : integer; sll_hatype : word; sll_pkttype : byte; sll_halen : byte; sll_addr: array[ 0 .. 7 ] of byte; end; Is this correct?

It seems OK, however, if you want portability too, you should:

uses
  ctypes;
{$PACKRECORDS C} // already commented by Michael
type
  sockaddr_ll = record
    sll_family: cushort;
    sll_protocol: cushort;
    sll_ifindex: cint;
    sll_hatype: cushort;
    sll_pkttype: cuchar;
    sll_halen: cuchar;
    sll_addr: array[0..7] of cuchar;
 end;

cheers

Silvio Clécio

Reply by email