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@xxxxxxxxxx +1-801-349-2682 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list