add mkstemps

Jeff Johnston jjohnstn@redhat.com
Wed Jul 1 01:02:00 GMT 2009


Eric Blake wrote:
> Howland Craig D (Craig <howland <at> LGSInnovations.com> writes:
>
>   
>> An alternate thought:
>> Practically, size_t versus int for the suffix length makes no
>> difference at all.  That is, both int and size_t can easily have
>> numbers that are far too big compared to FILENAME_MAX (or any of the
>> other variations for max path lengths) to actually work.  If size_t
>> were used, passing a negative integer would come out to be too big and
>> result in an error.
>>
>> Therefore, why not declare it to be the "proper" size_t from the start?
>>     
>
> That may be fine for 32-bit systems, but causes an ABI change on 64-bit systems 
> if it ever gets standardized as int because of existing practice.  The 
> standards tend to favor existing practice, and since libiberty, BSD, and 
> Solaris all used int rather than size_t, that would probably be what gets 
> standardized (along with rules for when to fail with EINVAL).
>
>   
>> Thinking of this, a potential weakness in the new code is that it
>> does not sanity-check the given suffix length.  (Unless perhaps I've
>> missed a touchup, as one of the gmane comments that Eric made implies
>> that some kind of negative length check was added.)
>>     
>
> Yes, my sandbox has another touchup not previously posted on this list, which I 
> had in place before your email.  I basically changed the internal helper 
> function to use size_t (but the public mkstemps still uses int), and added an 
> additional comparison for (trv - path < suffixlen) as an early exit case prior 
> to doing trv -= suffixlen.
>
>   
Please post any updated patches you intend to check-in as it makes it 
hard to review based on
my low ESP skills :)
>> Secondly, the addition probably should be in unistd.h.  stdlib.h is
>> properly fully standardized from ISO and POSIX.
>>     
>
> stdlib.h can still be fully compliant, with proper #ifdef guards to hide non-
> standard functions when the user is requesting strict compliance.  I disagree 
> about <unistd.h> for two reasons: 1) <unistd.h> implies standardized functions, 
> but mkstemps is not (yet) standardized; 2) existing practice - Solaris chose 
> <stdlib.h>.
>
>   
>>  We should avoid
>> "polluting" it with non-standard items (not that it isn't already).
>>     
>
> Again, the pollution should be something that can be controlled by #ifdef 
> switches (similar to glibc's _GNU_SOURCE, or AIX' _ALL_SOURCE, or Solaris' 
> __EXTENSIONS__, etc).  True, newlib is not yet at the point where all 
> extensions are properly guarded by a single macro, but that's not an excuse for 
> putting mkstemps in the correct header to begin with.
>
>   
>> If it needed to be moved later if it ever became standard, then move it
>> later.  (Or perhaps now is a good time to introduce a stdlibext.h
>> file, which is one of the things that I've been thinking about as a
>> possible mechanism for cleaning up the system header files.)
>>     
>
> But that's the whole point of this thread - there is existing practice that 
> puts it in <stdlib.h>, so putting it in a non-standard header like 
> <stdlibext.h> is only doing a disservice to code trying to be portable across 
> all the systems that already provide this function as an extension.
>
>   
If stdlibext.h is included from stdlib.h, then stdlib.h becomes less 
cluttered.  I assume that is what
Craig is suggesting.  This does not need to be done as part of this patch.

-- Jeff J.




More information about the Newlib mailing list