# fq - a dynamic ffi for kdb+ 3.1

**URL:** <https://forum.kx.com/t/fq-a-dynamic-ffi-for-kdb-3-1/8290>\
**Category:** Community Support\
**Tags:** kdb-and-q\
**Created:** [July 19, 2013, 4:22am UTC](https://forum.kx.com/t/fq-a-dynamic-ffi-for-kdb-3-1/8290 "2013-07-19T04:22:00Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![jack31](https://avatars.discourse-cdn.com/v4/letter/j/58956e/32.png) [@jack31](https://forum.kx.com/u/jack31)\
**Post date:** [July 19, 2013, 4:22am UTC](https://forum.kx.com/t/fq-a-dynamic-ffi-for-kdb-3-1/8290/1 "2013-07-19T04:22:00Z")

</div>

Hi guys,Before I post this to the k4 list, I’d appreciate it if anyone wouldlike to try this out: [http://www.ivorykite.com/fq/from](http://www.ivorykite.com/fq/from) that page: . load any shared object (.so) or .dll q)c:.fq.dlo`libc.so.6 . load any functions or variables from a library q)fwrite:.fq.dlf[c;`fwrite] q)stdout:.fq.dls[c;`stdout] . call any function in q (providing a call signature) q).fq.call[fwrite;“iCiiz”;(“ho\n”;3i;1i;stdout)]ThanksJack.

---

<div class="post-metadata">

**Author:** ![tianye75](https://avatars.discourse-cdn.com/v4/letter/t/7ab992/32.png) [@tianye75](https://forum.kx.com/u/tianye75)\
**Post date:** [July 19, 2013, 4:31am UTC](https://forum.kx.com/t/fq-a-dynamic-ffi-for-kdb-3-1/8290/2 "2013-07-19T04:31:00Z")

</div>

To: [personal-kdbplus@googlegroups.com](mailto:personal-kdbplus@googlegroups.com)  
X-Mailer: Apple Mail (2.1283)

how is it different from ffiq?

[http://code.kx.com/wsvn/code/contrib/serpent.speak/trunk/ffiq/README](http://code.kx.com/wsvn/code/contrib/serpent.speak/trunk/ffiq/README)

is it possible to call C functions taking struct/\* as parameters?

thanks,  
Ye

---

<div class="post-metadata">

**Author:** ![jack31](https://avatars.discourse-cdn.com/v4/letter/j/58956e/32.png) [@jack31](https://forum.kx.com/u/jack31)\
**Post date:** [July 19, 2013, 5:49am UTC](https://forum.kx.com/t/fq-a-dynamic-ffi-for-kdb-3-1/8290/3 "2013-07-19T05:49:00Z")

</div>

\> how is it different from ffiq?i plan to support it…\> is it possible to call C functions taking struct/\* as parameters?..such as adding support for struct parametersta, jack.

---

<div class="post-metadata">

**Author:** ![jack31](https://avatars.discourse-cdn.com/v4/letter/j/58956e/32.png) [@jack31](https://forum.kx.com/u/jack31)\
**Post date:** [July 19, 2013, 6:27am UTC](https://forum.kx.com/t/fq-a-dynamic-ffi-for-kdb-3-1/8290/4 "2013-07-19T06:27:00Z")

</div>

support will be provided to define libc function prototypes like connect()  
support for struct parameters will include .q files defining the structs used in functions like connect()

struct sockaddr\_in server;  
connect (sock, (struct sockaddr \*) &server, sizeof server);

where server is a:? struct sockaddr\_in  
? {  
? ? sa\_family\_t sin\_family;  
? ? in\_port\_t sin\_port;  
? ? struct in\_addr sin\_addr;  
? ? unsigned char sin\_zero[sizeof (struct sockaddr) -  
? ? ? (sizeof (unsigned short int)) -  
? ? ? sizeof (in\_port\_t) -  
? ? ? sizeof (struct in\_addr)];  
? };

not a simple problem - but there are tools that will generate descriptions of structs - but will need to be done for each platform.

ta, jack

---

<div class="post-metadata">

**Author:** ![tianye75](https://avatars.discourse-cdn.com/v4/letter/t/7ab992/32.png) [@tianye75](https://forum.kx.com/u/tianye75)\
**Post date:** [July 19, 2013, 12:55pm UTC](https://forum.kx.com/t/fq-a-dynamic-ffi-for-kdb-3-1/8290/5 "2013-07-19T12:55:00Z")

</div>

Sounds great, that’ll make it very useful.  
– you can almost call any c library.

---

<div class="post-metadata">

**Author:** ![jack31](https://avatars.discourse-cdn.com/v4/letter/j/58956e/32.png) [@jack31](https://forum.kx.com/u/jack31)\
**Post date:** [July 19, 2013, 5:53pm UTC](https://forum.kx.com/t/fq-a-dynamic-ffi-for-kdb-3-1/8290/6 "2013-07-19T17:53:00Z")

</div>

Hi Ye,Yes, you can call any function in any shared object.I’ll add support for passing struct\* to functions in the next week or so.Thanks,Jack.On 19 July 2013 21:55, Ye Tian wrote:\> Sounds great, that’ll make it very useful.\> – you can almost call any c library.\>\> On Jul 19, 2013, at 1:27 AM, Jack Andrews wrote:\>\> support will be provided to define libc function prototypes like connect()\> support for struct parameters will include .q files defining the structs\> used in functions like connect()\>\> struct sockaddr\_in server;\> connect (sock, (struct sockaddr \*) &server, sizeof server);\>\> where server is a: struct sockaddr\_in\> {\> sa\_family\_t sin\_family;\> in\_port\_t sin\_port;\> struct in\_addr sin\_addr;\> unsigned char sin\_zero[sizeof (struct sockaddr) -\> (sizeof (unsigned short int)) -\> sizeof (in\_port\_t) -\> sizeof (struct in\_addr)];\> };\>\> not a simple problem - but there are tools that will generate descriptions\> of structs - but will need to be done for each platform.\>\> ta, jack\>\> –\>

Submitted via Google Groups

---

<div class="post-metadata">

**Author:** ![Alexander\_Belop](https://avatars.discourse-cdn.com/v4/letter/a/258eb7/32.png) [@Alexander\_Belop](https://forum.kx.com/u/Alexander_Belop)\
**Post date:** [July 24, 2013, 4:23pm UTC](https://forum.kx.com/t/fq-a-dynamic-ffi-for-kdb-3-1/8290/7 "2013-07-24T16:23:00Z")

</div>

On Thursday, July 18, 2013 11:22:14 PM UTC-4, Jack Andrews wrote:

> Before I post this to the k4 list, I’d appreciate it if anyone would  
> like to try this out:  
> &nbsp; http://www.ivorykite.com/fq/

How does it compare to ffiq?

[http://code.kx.com/wsvn/code/contrib/serpent.speak/trunk/ffiq/README](http://code.kx.com/wsvn/code/contrib/serpent.speak/trunk/ffiq/README)

&nbsp;

---

<div class="post-metadata">

**Author:** ![jack31](https://avatars.discourse-cdn.com/v4/letter/j/58956e/32.png) [@jack31](https://forum.kx.com/u/jack31)\
**Post date:** [July 25, 2013, 4:40am UTC](https://forum.kx.com/t/fq-a-dynamic-ffi-for-kdb-3-1/8290/8 "2013-07-25T04:40:00Z")

</div>

On 25 July 2013 01:23, Sasha \<alexander.belopolsky\> wrote:  
\>\> Before I post this to the k4 list, I’d appreciate it if anyone would  
\>\> like to try this out:  
\>\> [http://www.ivorykite.com/fq/](http://www.ivorykite.com/fq/)  
\>\>  
\> How does it compare to ffiq?  
  
i’m working on struct/union, function prototypes and macro values  
  
eg: an HTTP client using .fq\*  
  
`$"fq Copyright (C) 2013 Ivorykite."<br>.fq:(`fq 2:(`fq;1))`  
c:.fq.libc  
h:c.gethostbyname “[google.com](http://google.com)”  
dest:c.sockaddr\_in 0  
sockfd:c.socket[dest.sin\_family:c.AF\_INET;c.SOCK\_STREAM;0]  
dest.sin\_port:c.htons 80  
c.memcpy[dest.sin\_addr;h.h\_addr;h.h\_length]  
connect[sockfd;dest;c.sizeof dest]  
send[sockfd;g:“GET / HTTP/1.0\n\n”;count g]  
({buffer:999#0x0;0\<0N!c.recv[sockfd;buffer;count buffer]}/)`  
  
if you have a similar small example for me to work off, please  
send it through to me.  
  
ta, jack  
  
  
\*which is similar to:  
int main(int c, char \*v)  
{ int sockfd, bytes\_read;  
 struct sockaddr\_in dest;  
 char buffer[999];  
 if ( c != 2 )  
 return fprintf(stderr,“usage: %s host\neg. %s [google.com](http://google.com)\n”,_v,v);  
 if ( (sockfd = socket(AF\_INET, SOCK\_STREAM, 0)) \< 0 )  
 EX(“socket”);  
 bzero(&dest, sizeof(dest));  
 dest.sin\_family = AF\_INET;  
 dest.sin\_port = htons(80);  
 struct hostenth=gethostbyname(v[1]);  
 memcpy(&dest.sin\_addr,h-\>h\_addr,h-\>h\_length);  
 if ( inet\_addr(v[1], &dest.sin\_addr.s\_addr) == 0 )  
 EX(v[1]);  
 if ( connect(sockfd, (struct sockaddr_)&dest, sizeof(dest)) != 0 )  
 EX(“connect”);  
 sprintf(buffer,“GET / HTTP/1.0\n\n”);  
 send(sockfd, buffer, strlen(buffer), 0);  
 do {  
 bzero(buffer, sizeof(buffer));  
 bytes\_read = recv(sockfd, buffer, sizeof(buffer), 0);  
 if ( bytes\_read \> 0 )  
 printf(“%s”, buffer);  
 } while ( bytes\_read \> 0 );  
 return 0;  
}  
  
\</alexander.belopolsky\>
