Em Qua, 2009-05-06 às 09:26 +0200, Daniel Veillard escreveu:
On Mon, May 04, 2009 at 05:50:03PM -0300, Eduardo Otubo wrote:
> Hello DV,
Hi Eduardo,
sorry for the delay I took a few days of vacations :-)
Hello DV,
Nice! Hope you enjoyed your vacations :)
> > > + while (channel &&
channel_is_open(channel)) {
> > > + ret = channel_read(channel, readbuf, 0, 0);
> > > + if (ret < 0) {
> > > + (*exit_status) = SSH_CHANNEL_READ_ERR;
> > > + break;
> > > + }
> > > +
> > > + if (ret == 0) {
> > > + channel_send_eof(channel);
> > > + while(channel_get_exit_status(channel) == -1){
> > > + channel_poll(channel,0);
> > > + usleep(50);
> > > + }
> >
> > It's always a bit nasty to sleep like that. Is there really now way
> > to use something like poll or select instead ? In average you're gonna
> > be waken up multiple time while waiting for your answer while the kernel
> > could instead wake you up exactly when you have the data.
>
> This was a libssh issue This was the only way I could make it work. But
> now the libssh is fixed and this function is a little different -
>
http://pastebin.com/fbf84426
Looks fine now, but how can you make sure libssh used will have the
fix, is there a new version released and the associated test in
configure.in ?
In fact I am part of the libssh team, I help them with testing. And yes,
we're planning to release a new version of libssh this week with all
these fixes. But I still need to make it sure in configure.in. I'll do
it right now.
> > > +
> > > +/* return the lpar_id given a name and a managed system name */
> > > +static int
> > > +phypGetLparID(SSH_SESSION * ssh_session, const char *managed_system,
> > > + const char *name)
> > > +{
> > > + int exit_status = 0;
> > > + virBuffer cmd = VIR_BUFFER_INITIALIZER;
> > > +
> > > + virBufferVSprintf(&cmd,
> > > + "lssyscfg -r lpar -m %s --filter lpar_names=%s
-F lpar_id",
> > > + managed_system, name);
> > > + const char *tex_ret =
> > > + __inner_exec_command(ssh_session,
virBufferContentAndReset(&cmd),
> > > + &exit_status);
> > > +
> > > + virBufferContentAndReset(&cmd);
> >
> > Huh ? you're supposed to get the resulting char *, and then free it
> > later once you're done with the data. Here youre just leaking memory
> > I'm afraid
> >
> > same thing for most of the commands in that file.
>
> Here, I just would like to free the Buffer, and this was the best way I
> find since I couldn't find any better function to manipulate this. How
> do I simply free a buffer using the internal virBuffer* API?
Well you didn't allocate the buffer structure since it's on the heap
and initilized with the VIR_BUFFER_INITIALIZER macro. So technically
you don't need to free it, but you need to free the string in the
buffer. That string is returned by virBufferContentAndReset(), so you
need to save that to a local variable and free it once done.
All right, got it. Thanks for the tips :)
[]'s
--
Eduardo Otubo
Software Engineer
Linux Technology Center
IBM Systems & Technology Group
Mobile: +55 19 8135 0885
otubo(a)linux.vnet.ibm.com