On 2025-02-01 11:46:59+0100, Willy Tarreau wrote:
On Sat, Feb 01, 2025 at 11:41:58AM +0100, Thomas Weißschuh wrote:
On 2025-02-01 11:34:38+0100, Willy Tarreau wrote:
On Thu, Jan 30, 2025 at 08:54:03PM +0100, Thomas Weißschuh wrote:
From: Thomas Weißschuh thomas.weissschuh@linutronix.de
Add an allocation-free implementation of readdir() and related functions. The implementation is modelled after the one for FILE.
I think you'd need to mention/remind the two important points that come out of that choice, one being that DIR is a fake pointer that instead stores ~fd so that it can be turned back to a valid FD, and that subsequent readdir() calls will only work from the same file unit since it relies on a local static storage.
Point one is true. Point two not so much. It is fine to have multiple directories open at the same time. All state is kept inside the kernel. Only the *current* return value is in the static buffer.
Excellent point! It also needs to be mentioned.
Unfortunately POSIX is more specific in it's definition and forbids this:
The returned pointer, and pointers within the structure, might be invalidated or the structure or the storage areas might be overwritten by a subsequent call to readdir() on the same directory stream.
I see two possibilities:
Allocate one 'struct dirent' as part of DIR. Only implement readdir_r().
While readdir_r() is deprecated (according to readdir(3) but not readdir(3p)) this seems to be due to ABI issues, which shouldn't matter for nolibc anyways.
Personally I would prefer readdir_r().
<snip>