lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Reuben Thomas wrote:

Hey, Lua maintainers: this could be a fix for it:

liolib.c:
int
luaIO_filecreate(lua_State *L, FILE *f)
{
   FILE **pf = newfile(L);
   *pf = f;
   return 1;
}


That's a good idea, and its lack a bit puzzling in retrospect: "what, no
simple constructor?".

liolib.c was written as a self-contained Lua extension---it has no global symbols except luaopen_io. This is good practice, if there are no other considerations. I'm arguing here that exposing a small part of the internals would significantly help other extensions.

While I'm asking for things, it might be nice to have either or both of the existing

  static FILE **topfile (lua_State *L, int findex)

and

  static FILE *tofile (lua_State *L, int findex)

exposed to the outside; these functions allow other extensions to pull the FILE* out of a filehandle userdata. I don't have a compelling reason off the top of my head, but it feels like somebody might need to run something like fileno() on an existing handle, perhaps as an argument to select().

Would that stop you needing to use the shell?

Yeah. The notional popen2.lua would fork and execve the child process attached through file descriptors. The posix module then implements posix.fdopen(fd, mode) in terms of luaIO_filecreate, and then returns a filehandle userdata to the caller.

Jay