Re: RFC: Serial port DTR/RTS - O_<something>
From: "H. Peter Anvin" <hpa@zytor.com>
Date: 2025-11-18 18:06:12
Also in:
linux-serial, lkml
On 2025-11-18 08:33, Ned Ulbricht wrote:
quoted
O_NOCLOBBER looks like an odd in-between between O_EXCL and (O_EXCL|O_NOFOLLOW); stated to be specifically to implement the shell "noclobber" semantic."(O_EXCL|O_NOFOLLOW)" provokes a thought... As essential context, fs/open.c build_open_flags() has: if (flags & O_CREAT) { op->intent |= LOOKUP_CREATE; if (flags & O_EXCL) { op->intent |= LOOKUP_EXCL; flags |= O_NOFOLLOW; } } if (!(flags & O_NOFOLLOW)) lookup_flags |= LOOKUP_FOLLOW;
Interesting. As far as O_NOCLOBBER is concerned, that is an "O_EXCL unless the output is a special file (device node, FIFO, etc)"; presumably to allow the shell to not flip out when doing, say "foo > /dev/ttyS0" when in noclobber mode. I had missed the bit in the spec that says that O_CREAT|O_EXCL is required to imply O_NOFOLLOW (as Linux indeed does as seen above.) O_NOCLOBBER emulation in user space would seem to be possible with a loop; first try to open O_CREAT|O_EXCL and if that fails with EEXIST then open without either; if that succeeds test with fstat() to see if it is a regular file, and if it is, close it and error. However, it is hardly ideal, and I might have overlooked some mechanism by which this may fail. -hpa