[libvirt] FreeBSD and sysconf(_SC_GETPW_R_SIZE_MAX)

Eric Blake eblake at redhat.com
Mon May 16 21:03:22 UTC 2011


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 at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110516/76c00150/attachment-0001.sig>


More information about the libvir-list mailing list