On Mon, Aug 13, 2007 at 05:59:15AM -0400, Daniel Veillard wrote:
On Sun, Aug 12, 2007 at 07:11:34PM -0400, Jim Paris wrote:
> Due to the TTY layer, sending "\n" to the qemu monitor translates
> into "\r\n" when received. This triggers a bug in older versions of
> QEMU (KVM <= 33) because the same command is executed twice, and
> still has problems with fixed QEMU because the "(qemu)" prompt is
> printed twice. Switch all monitor commands to end with "\r" which
> avoids both issues.
>
> The QEMU monitor sends frequent terminal escape sequences, typically
> \033[D and \033[K. At times, these interfere with the prompt
> detection when they get sent between "\n" and "(qemu) ". Fix
the
> issue by filtering out these sequences when they are received.
I think DanP can better comment on the QEmu interaction than me,
but the patch looks simple and clean except:
It looks sane to me - I had no idea QEMU was sending this escape sequences.
> @@ -1333,14 +1335,23 @@ static int qemudMonitorCommand(struct qemud_driver *driver
ATTRIBUTE_UNUSED,
> return -1;
> }
> buf = b;
> - memmove(buf+size, data, got);
> - buf[size+got] = '\0';
> - size += got;
> +
> + /* Copy data, skipping 3-byte escape sequences */
> + for (i = 0; i < got; i++) {
> + if (data[i] == '\033')
> + skip = 3;
> + if (skip)
> + skip--;
> + else
> + buf[size++] = data[i];
> + }
> + buf[size] = '\0';
> }
It seems that if for some reason you do a partial read on the QEmu
console descriptor ending in the middle of the escape command you may
have a problem. But it's possible that the way reads are done, and input
is chunked garantees that this won't happen, DanP can probably confirm
it's just fine :-)
We're reading from a Psuedo-TTY which is line buffered, so I think the OS
should guarentee that we can read a whole lines worth of data without
getting EAGAIN.
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules:
http://search.cpan.org/~danberr/ -=|
|=- Projects:
http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|