closedir(3) handling NULL

Bruce Evans brde at optusnet.com.au
Fri Jan 24 20:28:24 UTC 2014


On Fri, 24 Jan 2014, Garrett Wollman wrote:

> <<On Sat, 25 Jan 2014 06:00:08 +1100 (EST), Bruce Evans <brde at optusnet.com.au> said:
>
>> I don't know how the fd can be invalid for a (necessarily valid) stream.
>> Maybe because the fd for a stdio stream is not private, and POSIX actually
>> allows closing it directly.  At least this says "shall fail" instead of
>> "may fail".  I think the "may fail" for closedir() is just buggy wording.
>> The "may" is for the implementation not being required to use fd's at all.
>> But when it uses them, errors from them should be "shall fail" like they
>> are for fclose().
>
> "may fail" has a very specific meaning in the "ERRORS" section: if the
> implementation detects the condition described, it must use the
> specified error number.

That doesn't quite do it.  Detection of the error for closing a closed fd
is still not required, unlike for fclose().

I could only find the above implied indirectly, and not completely.

% 435              RETURN VALUE
% 436                        This section indicates the possible return values, if any.
% 437                        If the implementation can detect errors, ``successful completion'' means that no error
% 438                        has been detected during execution of the function. If the implementation does detect
% 439                        an error, the error is indicated.

So if an error is detected, that error is "indicated".  I think the indication
must be in the usual way, by storing in errno (except for these unsual APIs
where it is returned).  This is already inconsistent with returning a
specific error.  I think nothing prevents detection of a different error
(one not even listed in the ERRORS section) and nothing prevents returning
that error, while the above requires it.

% 440                        For functions where no errors are defined, ``successful completion'' means that if the
% 441                        implementation checks for errors, no error has been detected. If the implementation can
% 442                        detect errors, and an error is detected, the indicated return value is returned and errno
% 443                        may be set.

The only thing that is clear is that if an error is detected, the function
cannot succeed.

Bruce


More information about the freebsd-standards mailing list