[fpc-pascal] Linux RecvMsg( ) Calls Missing

md at rpzdesign.com md at rpzdesign.com
Mon Jun 16 07:48:29 CEST 2014


See solution below:

> On 6/15/2014 6:08 PM, md at rpzdesign.com wrote:
>> I was looking through the RTL and found that cfprecvmsg( ) socket calls
>> into the C Run Time library were commented out.
>>
>> Also commented out cfpsendmsg( ) calls.
>>
>> While recvfrom( ) is available, it does not include the PTKINFO options
>> necessary to determine a destination IP address on a multi interface
>> Linux server.
>>
>> Nor does it offer the ability to set the Source Address when sending via
>> sendto( )
>>
>> Anybody have a quick suggestion or must I spend the afternoon
>> implementing cfprecvmsg( ) and cfpsendmsg( ) calls.
>>
>> Thanks,
>>
>> Marco
>>
>> _______________________________________________
>> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
>> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>>
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
> 
On 6/15/2014 6:26 PM, md at rpzdesign.com wrote:> Ok, I am getting closer.
>
> Under the unixsockets in RTL, it has all the declarations necessary.
>
> Anybody have an idea on how to use unixsockets in a uses clause
> so the compiler will not trigger:
>
> Can't find unit 'unixsockets' used by xxxx.pas
>
> Or should I just add the RTL to my project path?
>
> Thanks for any responses,
>
> marco
>
>
>

It borrows heavily from RTL, but is now confirmed to
work on Linux 2.6.x +

Sorry to pepper the list...

Here is the solution:

A copied unixsockets file usable in fpc 2.6.4/lazarus 1.2.x

unit fpunixsocket;


{$mode objfpc}{$H+}

{$packrecords C}

interface

uses
  sockets,
  cTypes,
  BaseUnix;

type

  Piovec = ^Tiovec;
  Tiovec = record
    iov_base : pointer;
    iov_len : size_t;
  end;

  Pmsghdr = ^Tmsghdr;
  Tmsghdr = record
     msg_name : pointer; //8
     msg_namelen : socklen_t; //4
     msg_iov : piovec; //8
     msg_iovlen : size_t; //8
     msg_control : pbyte ; //8
     msg_controllen : size_t; //8
     msg_flags : cInt; //4
  end;

  Pcmsghdr = ^Tcmsghdr;
  Tcmsghdr = record
    cmsg_len   : size_t;
    cmsg_level : cInt;
    cmsg_type  : cInt;
  end;

  Ppktinfo = ^Tpktinfo;
  Tpktinfo = record
    ipi_ifindex : longint;
    ipi_spec_dst : in_addr;
    ipi_addr : in_addr;
  end;


  function fpsendmsg(__fd: cInt; __message: pmsghdr; __flags: cInt):
ssize_t; cdecl; external 'c' name 'sendmsg';
  function fprecvmsg(__fd: cInt; __message: pmsghdr; __flags: cInt):
ssize_t; cdecl; external 'c' name 'recvmsg';
  function __cmsg_nxthdr(__mhdr:Pmsghdr;
__cmsg:Pcmsghdr):Pcmsghdr;cdecl;external 'c' name '__cmsg_nxthdr';

  function CMSG_FIRSTHDR(mhdr: Pmsghdr): Pcmsghdr;
  function CMSG_NXTHDR(mhdr: Pmsghdr; cmsg: Pcmsghdr): Pcmsghdr;
  function CMSG_ALIGN(len: size_t): size_t;
  function CMSG_SPACE(len: size_t): size_t;
  function CMSG_LEN(len: size_t): size_t;
  function CMSG_DATA(cmsg: Pcmsghdr): Pointer;

implementation

function CMSG_FIRSTHDR(mhdr: Pmsghdr): Pcmsghdr;
begin
  if mhdr^.msg_controllen >= SizeOf(Tcmsghdr) then
    Result:=Pointer(mhdr^.msg_control)
  else
    Result:=nil;
end;

function CMSG_NXTHDR(mhdr: Pmsghdr; cmsg: Pcmsghdr): Pcmsghdr;
begin
   Result:=__cmsg_nxthdr(mhdr, cmsg);
end;

function CMSG_ALIGN(len: size_t): size_t;
begin
  Result:=(len+SizeOf(size_t)-1) and (not(SizeOf(size_t)-1));
end;

function CMSG_SPACE(len: size_t): size_t;
begin
  Result:=CMSG_ALIGN(len)+CMSG_ALIGN(SizeOf(Tcmsghdr));
end;

function CMSG_LEN(len: size_t): size_t;
begin
  Result:=CMSG_ALIGN(SizeOf(Tcmsghdr))+len;
end;

function CMSG_DATA(cmsg: Pcmsghdr): Pointer;
begin
  Result:=Pointer(  cuint64(cmsg) + SizeOf(Tcmsghdr));
end;


end.




More information about the fpc-pascal mailing list