[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] FreeBSD and sysconf(_SC_GETPW_R_SIZE_MAX)



On 05/16/2011 03:27 AM, Daniel P. Berrange wrote:
> On Sun, May 15, 2011 at 07:22:46AM +0200, Matthias Bolte wrote:
>> On FreeBSD virsh fails to enter interactive mode because
>> vshReadlineInit fails, because virGetUserDirectory fails, because
>> virGetUserEnt fails, because sysconf(_SC_GETPW_R_SIZE_MAX) returns -1
>> and sets errno to EINVAL.
>>
>> Is this something that gnulib should/could deal with, Eric?

sysconf() is a can of worms; no chance that gnulib will touch it any
time soon.

>>
>> Or should we work around it in libvrt and fallback to PATH_MAX when
>> sysconf(_SC_GETPW_R_SIZE_MAX) fails?
> 
> PATH_MAX isn't expected to be available on all platforms either which
> is one of the reasons for us removing its use.
> 
> getpwnam() returns ERANGE if the allocated buffer is too small. So
> we should do something along the lines of
> 
>     size_t len = sysconf(_SC_GETPW_R_SIZE_MAX)

Guarded by #ifdef, and defaulting to -1 if _SC_GETPW_R_SIZE_MAX is not
defined (since it is a handy extension, but not present everywhere).

>     if (len < 0)
>        len = 1024;
>     while (1) {
>       ...
>       err = getpwnam()
>       if (err < 0) {
>         if (errno == ERANGE) {
>           len += 1024;

Or len <<= 1, to avoid quadratic performance.

But indeed this is the correct response.

-- 
Eric Blake   eblake redhat com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]