From: Anthony Liguori <anthony@codemonkey.ws>
To: Thiemo Seufer <ths@networkno.de>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] Add info commands for serial/parallel devices
Date: Tue, 20 Mar 2007 09:05:56 -0500 [thread overview]
Message-ID: <45FFEA44.7040703@codemonkey.ws> (raw)
In-Reply-To: <20070319161342.GC28895@networkno.de>
Thiemo Seufer wrote:
> Anthony Liguori wrote:
>
>> Howdy,
>>
>> The following patch adds an info serial and an info parallel command.
>> Besides providing useful information (especially for the serial port),
>> it provides a method for management tools to connect to a running VM and
>> what character devices the serial/parallel ports have been redirected to.
>>
>> The format of the info is similar to that of info block.
>>
> [snip]
>
>> diff -r 18e99d1e8814 vl.c
>> --- a/vl.c Sat Mar 03 21:18:48 2007 -0600
>> +++ b/vl.c Sat Mar 03 21:33:07 2007 -0600
>> @@ -2884,66 +2884,73 @@ CharDriverState *qemu_chr_open(const cha
>> CharDriverState *qemu_chr_open(const char *filename)
>> {
>> const char *p;
>> + CharDriverState *chr;
>>
>> if (!strcmp(filename, "vc")) {
>> - return text_console_init(&display_state);
>> + chr = text_console_init(&display_state);
>> } else if (!strcmp(filename, "null")) {
>> - return qemu_chr_open_null();
>> + chr = qemu_chr_open_null();
>> } else
>> if (strstart(filename, "tcp:", &p)) {
>> - return qemu_chr_open_tcp(p, 0, 0);
>> + chr = qemu_chr_open_tcp(p, 0, 0);
>> } else
>> if (strstart(filename, "telnet:", &p)) {
>> - return qemu_chr_open_tcp(p, 1, 0);
>> + chr = qemu_chr_open_tcp(p, 1, 0);
>> } else
>> if (strstart(filename, "udp:", &p)) {
>> - return qemu_chr_open_udp(p);
>> + chr = qemu_chr_open_udp(p);
>> } else
>> if (strstart(filename, "mon:", &p)) {
>> CharDriverState *drv = qemu_chr_open(p);
>> if (drv) {
>> drv = qemu_chr_open_mux(drv);
>> monitor_init(drv, !nographic);
>> - return drv;
>> - }
>> - printf("Unable to open driver: %s\n", p);
>> - return 0;
>> + chr = drv;
>> + } else {
>> + printf("Unable to open driver: %s\n", p);
>> + return 0;
>> + }
>> } else
>> #ifndef _WIN32
>> if (strstart(filename, "unix:", &p)) {
>> - return qemu_chr_open_tcp(p, 0, 1);
>> + chr = qemu_chr_open_tcp(p, 0, 1);
>> } else if (strstart(filename, "file:", &p)) {
>> - return qemu_chr_open_file_out(p);
>> + chr = qemu_chr_open_file_out(p);
>> } else if (strstart(filename, "pipe:", &p)) {
>> - return qemu_chr_open_pipe(p);
>> + chr = qemu_chr_open_pipe(p);
>> } else if (!strcmp(filename, "pty")) {
>> - return qemu_chr_open_pty();
>> + chr = qemu_chr_open_pty();
>> } else if (!strcmp(filename, "stdio")) {
>> - return qemu_chr_open_stdio();
>> + chr = qemu_chr_open_stdio();
>> } else
>> #endif
>> #if defined(__linux__)
>> if (strstart(filename, "/dev/parport", NULL)) {
>> - return qemu_chr_open_pp(filename);
>> + chr = qemu_chr_open_pp(filename);
>> } else
>> if (strstart(filename, "/dev/", NULL)) {
>> - return qemu_chr_open_tty(filename);
>> + chr = qemu_chr_open_tty(filename);
>> } else
>> #endif
>> #ifdef _WIN32
>> if (strstart(filename, "COM", NULL)) {
>> - return qemu_chr_open_win(filename);
>> + chr = qemu_chr_open_win(filename);
>> } else
>> if (strstart(filename, "pipe:", &p)) {
>> - return qemu_chr_open_win_pipe(p);
>> + chr = qemu_chr_open_win_pipe(p);
>> } else
>> if (strstart(filename, "file:", &p)) {
>> - return qemu_chr_open_win_file_out(p);
>> - }
>> + chr = qemu_chr_open_win_file_out(p);
>> + } else
>> #endif
>> {
>> return NULL;
>> }
>> +
>> + if (chr)
>> + chr->filename = strdup(filename);
>> +
>> + return chr;
>>
>
> Why is this part needed?
>
So that info seral|parallel can spit out the name used to create open
the device.
It has to be strdup()'d b/c it's passed in as a const char. There's no
guarantee that memory will stay around.
>> }
>>
>> void qemu_chr_close(CharDriverState *chr)
>> diff -r 18e99d1e8814 vl.h
>> --- a/vl.h Sat Mar 03 21:18:48 2007 -0600
>> +++ b/vl.h Sat Mar 03 21:33:07 2007 -0600
>> @@ -307,6 +307,7 @@ typedef struct CharDriverState {
>> void *opaque;
>> int focus;
>> QEMUBH *bh;
>> + char *filename;
>> } CharDriverState;
>>
>
> const char * ?
>
To me, const char * always implies that you don't own the memory. This
is helped by the fact that free doesn't take a const void * and newer
GCC's will complain if you free() a const char *.
Regards,
Anthony Liguori
> Thiemo
>
>
next prev parent reply other threads:[~2007-03-20 14:07 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-04 3:38 [Qemu-devel] [PATCH] Add info commands for serial/parallel devices Anthony Liguori
2007-03-19 16:13 ` Thiemo Seufer
2007-03-20 14:05 ` Anthony Liguori [this message]
2007-03-20 14:48 ` M. Warner Losh
2007-03-20 15:02 ` Andreas Schwab
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=45FFEA44.7040703@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
--cc=ths@networkno.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).