On Fri, Jan 16, 2009 at 12:21:59PM +0000, Richard W.M. Jones wrote:
On Tue, Jan 13, 2009 at 05:46:37PM +0000, Daniel P. Berrange wrote:
> + char buf[1024];
sysconf (_SC_GETPW_R_SIZE_MAX)?
Looking at glibc's implementation of getpwuid (which uses getpwuid_r),
I see that glibc dynamically reallocates the buffer as necessary to
the correct size for the return value. The logic of this is fairly
simple so maybe we should do the same?
From glibc:
buffer = malloc (/*some_initial_size*/);
while (buffer != NULL
&& (getpwuid_r (const char *name, &resbuf, buffer,
buffer_size, &result)
== ERANGE))
{
char *new_buf;
buffer_size *= 2;
new_buf = (char *) realloc (buffer, buffer_size);
if (new_buf == NULL)
{
free (buffer);
errno = ENOMEM;
}
buffer = new_buf;
}
Anyhow, +1 but I'd be happier if these functions were centralized in
somewhere like src/utils.c.
That's a good idea - in all the cases where we currently use getpwuid
all we actually want is the home directory path. So we could add a
simple func:
char *virUserHomeDirectory(uid_t uid);
and hide all the horrific code in there.
Daniel
--
|: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://ovirt.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|