opening things without the O_LARGEFILE flag

A

Athanasios

Hi everyone,

I am trying to open the /dev/net/tun character device with perl.

In C, I would issue:

open("/dev/net/tun", O_RDWR)

and continue as usual.

However, when I try to use sysopen in perl like

sysopen(TUNNELDEV, "/dev/net/tun", O_RDWR);

from the strace (truss) output I can see that instead it tries to do:

open("/dev/net/tun", O_RDWR|O_LARGEFILE)

which for some VERY strange reason succeeds but the file descriptor is
left in a bad state, so it is really unusable. For anything I try to do
afterwards, I get a

EBADFD (File descriptor in bad state).


As I have come down to the systel call level, there is no other reason
for this problem that I can think of except the O_LARGEFILE flag.
Indeed, a simple C program works quite fine without that flag.

I also have tried to use POSIX::eek:pen but it still adds the flag.

The documentation clearly states that from perl 5.6 and forth, the
O_LARGEFILE will be used whenever possible. But I really need to bypass
this and generate an open system call without it.

Does anyone know any conceivable way to accomplish this? Any help will
be appreciated.

If I should take this question to another group or list more suitable
to get an answer, could you also please indicate that group?

Kind Regards,
Athanasios

(I know, I know, the tun/tap driver may be slightly broken in the
strict sense, but let's leave that outside for a moment.)
 
T

Ted Zlatanov

The documentation clearly states that from perl 5.6 and forth, the
O_LARGEFILE will be used whenever possible. But I really need to bypass
this and generate an open system call without it.

Does anyone know any conceivable way to accomplish this? Any help will
be appreciated.

While there may be other more appropriate ways, you could use
Inline::C maybe?

Ted
 
X

xhoster

Athanasios said:
Hi everyone,

I am trying to open the /dev/net/tun character device with perl.

In C, I would issue:

open("/dev/net/tun", O_RDWR)

and continue as usual.

However, when I try to use sysopen in perl like

sysopen(TUNNELDEV, "/dev/net/tun", O_RDWR);

from the strace (truss) output I can see that instead it tries to do:

open("/dev/net/tun", O_RDWR|O_LARGEFILE)

which for some VERY strange reason succeeds but the file descriptor is
left in a bad state, so it is really unusable. For anything I try to do
afterwards, I get a

EBADFD (File descriptor in bad state).

As I have come down to the systel call level, there is no other reason
for this problem that I can think of except the O_LARGEFILE flag.
Indeed, a simple C program works quite fine without that flag.

Just to make sure it is absolutely nailed down, does the simple C program
stop working fine if you add the O_LARGEFILE in?

I also have tried to use POSIX::eek:pen but it still adds the flag.

The documentation clearly states that from perl 5.6 and forth, the
O_LARGEFILE will be used whenever possible. But I really need to bypass
this and generate an open system call without it.

Maybe you could compile perl without large file support?

Or write a small C server that will accept socket connections and
proxy /dev/net/tun over the socket.

Xho
 
A

Athanasios

Just to make sure it is absolutely nailed down, does the simple C program
stop working fine if you add the O_LARGEFILE in?

I 'll confirm that shortly, I haven't tried it yet. But judging from
the system calls I see in truss, it almost surely won't work.
Maybe you could compile perl without large file support?

Or write a small C server that will accept socket connections and
proxy /dev/net/tun over the socket.

Yes, these are valid options, as is the Inline::C idea which the
previous poster suggested. But the general idea is that there *should*
be a way to omit the O_LARGEFILE flag if needed.

Kind Regards,
Athanasios
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,821
Latest member
AleidaSchi

Latest Threads

Top