[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