|
Message-ID: <CAK1hOcPZNYAwAjH0V702gZ6kMscK=xdb2SLCX1SptvG4T69PQg@mail.gmail.com> 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.