[libvirt] PATCH: 19/25: Remove use of non-threadsafe POSIX apis

Richard W.M. Jones rjones at redhat.com
Thu Jan 22 15:01:45 UTC 2009


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




More information about the libvir-list mailing list