views:

173

answers:

2

I want to be able to map memory to a file descriptor so I can use some existing functions that need a file descriptor. Here's essentially what I'm looking for:

void do_operation1(int fd);

char data[DATA_MAX] = { /* embedded binary data */ };
int fd = addr_to_fd(data, DATA_MAX);

do_operation1(fd);
/* ... operate on fd ... */

What system call, or calls, can I use to accomplish this?

+7  A: 

Some implementations have fmemopen(). (Then of course you have to call fileno()).

If yours doesn't, you can build it yourself with fork() and pipe().

Randy Proctor
It turns out that `fileno()` fails on both Linux/FreeBSD (and I presume others) when the `FILE*` comes from `fmemopen ` or something equivalent. Without a way to get the file descriptor, I'm not sure we have a solution.
Kaleb Pederson
`fmemopen` may also be implemented using `funopen` on BSD. One implementation is available at https://redmine.openinfosecfoundation.org/attachments/105/0001-fmemopen-wrapper-added-fix-compilation-problems-on-m.patch
Kaleb Pederson
`fork()` is rather heavy-weight for this purpose. I’d suggest using a thread instead. Would be even better to use `select()` to multiplex between reading and writing from the pipe, but I guess that isn’t an option here.
Sven
+1  A: 

Check out shm_open().

Enquimot