Definition of __USE_MISC?

Message ID 24683c8c-e21c-7b7f-8525-0cb847b6cd81@redhat.com
State Committed
Headers

Commit Message

Florian Weimer Oct. 5, 2017, 9:50 a.m. UTC
  On 10/05/2017 08:07 AM, Sebastian Huber wrote:
> Hello,
> 
> according to the comment in features.h we have:
> 
> __USE_MISC        Define things from 4.3BSD or System V Unix.
> 
> What about interfaces that are present on newer BSD systems by default, 
> e.g. we have in glibc strings.h:
> 
> /* The following two functions are non-standard but necessary for non-32 
> bit
>     platforms.  */
> # ifdef    __USE_GNU
> extern int ffsl (long int __l) __THROW __attribute_const__;
> __extension__ extern int ffsll (long long int __ll)
>       __THROW __attribute_const__;
> # endif
> 
> In FreeBSD strings.h we have:
> 
> #if __BSD_VISIBLE
> int     ffsl(long) __pure2;
> int     ffsll(long long) __pure2;
> int     fls(int) __pure2;
> int     flsl(long) __pure2;
> int     flsll(long long) __pure2;
> #endif
> 
> Would it be possible to change the guard in glibc to __USE_MISC?

Yes, it should be a simple change.  I was worried about the long long 
part initially, but we have precedent for using long long under 
__USE_MISC (strtouq in <stdlib.h>).

Patch attached.

Thanks,
Florian
  

Comments

Sebastian Huber Oct. 10, 2017, 5:41 a.m. UTC | #1
On 05/10/17 11:50, Florian Weimer wrote:

> On 10/05/2017 08:07 AM, Sebastian Huber wrote:
>> Hello,
>>
>> according to the comment in features.h we have:
>>
>> __USE_MISC        Define things from 4.3BSD or System V Unix.
>>
>> What about interfaces that are present on newer BSD systems by 
>> default, e.g. we have in glibc strings.h:
>>
>> /* The following two functions are non-standard but necessary for 
>> non-32 bit
>>     platforms.  */
>> # ifdef    __USE_GNU
>> extern int ffsl (long int __l) __THROW __attribute_const__;
>> __extension__ extern int ffsll (long long int __ll)
>>       __THROW __attribute_const__;
>> # endif
>>
>> In FreeBSD strings.h we have:
>>
>> #if __BSD_VISIBLE
>> int     ffsl(long) __pure2;
>> int     ffsll(long long) __pure2;
>> int     fls(int) __pure2;
>> int     flsl(long) __pure2;
>> int     flsll(long long) __pure2;
>> #endif
>>
>> Would it be possible to change the guard in glibc to __USE_MISC?
>
> Yes, it should be a simple change.  I was worried about the long long 
> part initially, but we have precedent for using long long under 
> __USE_MISC (strtouq in <stdlib.h>).
>
> Patch attached. 

What are the opinions with respect to this patch? The ffsl() and ffsll() 
are BSD visible in FreeBSD,  DragonFlyBSD, some Mac OS X and musl. They 
are not available in OpenBSD and NetBSD.
  
Florian Weimer Oct. 17, 2017, 12:01 p.m. UTC | #2
On 10/10/2017 07:41 AM, Sebastian Huber wrote:
> On 05/10/17 11:50, Florian Weimer wrote:
> 
>> On 10/05/2017 08:07 AM, Sebastian Huber wrote:
>>> Hello,
>>>
>>> according to the comment in features.h we have:
>>>
>>> __USE_MISC        Define things from 4.3BSD or System V Unix.
>>>
>>> What about interfaces that are present on newer BSD systems by 
>>> default, e.g. we have in glibc strings.h:
>>>
>>> /* The following two functions are non-standard but necessary for 
>>> non-32 bit
>>>     platforms.  */
>>> # ifdef    __USE_GNU
>>> extern int ffsl (long int __l) __THROW __attribute_const__;
>>> __extension__ extern int ffsll (long long int __ll)
>>>       __THROW __attribute_const__;
>>> # endif
>>>
>>> In FreeBSD strings.h we have:
>>>
>>> #if __BSD_VISIBLE
>>> int     ffsl(long) __pure2;
>>> int     ffsll(long long) __pure2;
>>> int     fls(int) __pure2;
>>> int     flsl(long) __pure2;
>>> int     flsll(long long) __pure2;
>>> #endif
>>>
>>> Would it be possible to change the guard in glibc to __USE_MISC?
>>
>> Yes, it should be a simple change.  I was worried about the long long 
>> part initially, but we have precedent for using long long under 
>> __USE_MISC (strtouq in <stdlib.h>).
>>
>> Patch attached. 
> 
> What are the opinions with respect to this patch? The ffsl() and ffsll() 
> are BSD visible in FreeBSD,  DragonFlyBSD, some Mac OS X and musl. They 
> are not available in OpenBSD and NetBSD.

Unless there are objects, I'm going to check this in later this week.

Thanks,
Florian
  
Sebastian Huber Oct. 26, 2017, 8:55 a.m. UTC | #3
On 17/10/17 14:01, Florian Weimer wrote:
>>>>
>>>> Would it be possible to change the guard in glibc to __USE_MISC?
>>>
>>> Yes, it should be a simple change.  I was worried about the long 
>>> long part initially, but we have precedent for using long long under 
>>> __USE_MISC (strtouq in <stdlib.h>).
>>>
>>> Patch attached. 
>>
>> What are the opinions with respect to this patch? The ffsl() and 
>> ffsll() are BSD visible in FreeBSD,  DragonFlyBSD, some Mac OS X and 
>> musl. They are not available in OpenBSD and NetBSD.
>
> Unless there are objects, I'm going to check this in later this week. 

I think there were no objections.

Which documentation parts need an update? Only the man page in

https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man3/ffs.3

?
  
Florian Weimer Oct. 30, 2017, 1:01 p.m. UTC | #4
On 10/26/2017 10:55 AM, Sebastian Huber wrote:
> On 17/10/17 14:01, Florian Weimer wrote:
>>>>>
>>>>> Would it be possible to change the guard in glibc to __USE_MISC?
>>>>
>>>> Yes, it should be a simple change.  I was worried about the long 
>>>> long part initially, but we have precedent for using long long under 
>>>> __USE_MISC (strtouq in <stdlib.h>).
>>>>
>>>> Patch attached. 
>>>
>>> What are the opinions with respect to this patch? The ffsl() and 
>>> ffsll() are BSD visible in FreeBSD,  DragonFlyBSD, some Mac OS X and 
>>> musl. They are not available in OpenBSD and NetBSD.
>>
>> Unless there are objects, I'm going to check this in later this week. 
> 
> I think there were no objections.

Thanks for the reminder.  I have now pushed the change.

> Which documentation parts need an update? Only the man page in
> 
> https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man3/ffs.3
> 
> ?

Yes, the GNU manual does not document ffsl/ffsll at all, so no update is 
needed.  Will you contact Michael about the change?

Thanks,
Florian
  
Michael Kerrisk \(man-pages\) Nov. 2, 2017, 7:24 a.m. UTC | #5
On Mon, Oct 30, 2017 at 2:01 PM, Florian Weimer <fweimer@redhat.com> wrote:
> On 10/26/2017 10:55 AM, Sebastian Huber wrote:
>>
>> On 17/10/17 14:01, Florian Weimer wrote:
>>>>>>
>>>>>>
>>>>>> Would it be possible to change the guard in glibc to __USE_MISC?
>>>>>
>>>>>
>>>>> Yes, it should be a simple change.  I was worried about the long long
>>>>> part initially, but we have precedent for using long long under __USE_MISC
>>>>> (strtouq in <stdlib.h>).
>>>>>
>>>>> Patch attached.
>>>>
>>>>
>>>> What are the opinions with respect to this patch? The ffsl() and ffsll()
>>>> are BSD visible in FreeBSD,  DragonFlyBSD, some Mac OS X and musl. They are
>>>> not available in OpenBSD and NetBSD.
>>>
>>>
>>> Unless there are objects, I'm going to check this in later this week.
>>
>>
>> I think there were no objections.
>
>
> Thanks for the reminder.  I have now pushed the change.
>
>> Which documentation parts need an update? Only the man page in
>>
>>
>> https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man3/ffs.3
>>
>> ?
>
>
> Yes, the GNU manual does not document ffsl/ffsll at all, so no update is
> needed.  Will you contact Michael about the change?

No need (but thanks for thinking of it). I've just now updated the FTM
requirements in the man page to say:

       ffsl(), ffsll():
           Since glibc 2.27:
                   _DEFAULT_SOURCE
           Before glibc 2.27:
                   _GNU_SOURCE

Cheers,

Michael
  

Patch


Recent BSDs declare these functions, too.

2017-10-05  Florian Weimer  <fweimer@redhat.com>

	* string/strings.h (ffsl, ffsll): Declare under __USE_MISC, not
	just __USE_GNU.

diff --git a/string/strings.h b/string/strings.h
index 630b3adc23..27508e31b8 100644
--- a/string/strings.h
+++ b/string/strings.h
@@ -106,7 +106,7 @@  extern int ffs (int __i) __THROW __attribute_const__;
 
 /* The following two functions are non-standard but necessary for non-32 bit
    platforms.  */
-# ifdef	__USE_GNU
+# ifdef	__USE_MISC
 extern int ffsl (long int __l) __THROW __attribute_const__;
 __extension__ extern int ffsll (long long int __ll)
      __THROW __attribute_const__;