Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Mon, 31 Jul 2017 17:05:24 +0200
From: Denys Vlasenko <vda.linux@...glemail.com>
To: musl <musl@...ts.openwall.com>, Rich Felker <dalias@...c.org>
Subject: shell needs to change fd in a FILE

Hi,

I'm using ordinary FILE i/o for reading scripts in hush shell,
instead of rolling my own implementation, so that I can reuse
buffering code in libc, through the use of fgetc().

This works for almost all cases, except this one: if in script
I have a redirect which says shell wants to open a fd which happens
to be equal to the fd (say, 10) shell already used for script FILE:

    exec 10>FILE

What other shells do in this situation is they simply
dup and close script fd [in real code, they use fcntl(F_DUPFD)
instead of dup() since they want to avoid getting low fds],
so that fd is "moved" and no longer collides with the redirect.

I can do this trick, but since I use FILE interface, then
I need to inform libc that it needs to use new fd for this FILE.

"fileno(fp) = new_fd;" is non-portable and does not work in either
musl or glibc: it's a function, not a macro referencing
(fp)->field_holding_fd.

"fclose(fp); fp = fdopen(new_fd);" is not good since fp may have
some buffered input, which will be lost by such code.

How about adding a "set_fileno(fp, fd)" extension to musl,
with some easy define to probe for to conditionally use it?

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.