
On Thu, Jan 22, 2009 at 10:48:59AM +0000, Daniel P. Berrange wrote:
On Fri, Jan 16, 2009 at 12:25:02PM +0000, Daniel P. Berrange wrote:
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.
Here's an update with that usage in it
That's better. There's still the question about whether the particular sysconf() sub-call we are using exists on all platforms, and we might need to replace it with the glibc-style incremental buffer. I say we should commit this and test it for a while. Rich. -- Richard Jones, Emerging Technologies, Red Hat http://et.redhat.com/~rjones virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into Xen guests. http://et.redhat.com/~rjones/virt-p2v