I'm writing something that's based on Murali Krishnan Ganapathy's
CMENU
system,
except mine's driven by a menu.txt file that I supply (mostly so I can
edit the
menu.txt wherever I happen to be and so I won't need a syslinux build
environment
everytime the menu structure changes).
I'm able to build up menus that do what I expect, so that's good.
However, I want to be able to grey out menus (mark them INACTIVE) or
hide them
altogether (mark them INVISIBLE). I want to do this based on the
presence or
absence of a file (or maybe files). So, for example, if I don't include
SLAX
on today's DVD, then /SLAX/boot/initrd.gz will not exist, so I might
choose
to write menu.txt so as to hide that option.
In my original testing the feature worked. With a more complete
menu.txt,
the feature fails.
Poking around a bit further it seems that after ~29 attempts like this:
FILE* ifp;
const char* fname = "/some/file/that/does/NOT/exist";
if ((ifp = fopen(fname, "r")) == 0) {
// code for failure
} else {
// code for success
fclose(ifp);
}
then a simple fopen(name, "r") of a file that *does* exist fails,
even though that exact same fopen will succeed if I try it before
the ~29 fopen()s on a file that foes not exist.
If I change the deliberatly failing pathname to one that succeeds, then
there seems to be no problem.
So it looks like I've hit a bug. Possibly the file descriptor table
entry
is not cleared when a file is closed or maybe older entries do not get
reused even though they are free?
Is this a known issue? (I'd go hunting but I'm not sure where in that
tree
the relevant code lives).
Opening a file is just a simple proxy for determining its existence: if
there's
an alternative way (that will work for ~150 files) then I'm happy to
change.
This is all under syslinux 4.03 and the C32 build environment is Ubuntu
10.10.
Thanks,
Antonio Carlini
arcarlini at iee.org