Revision d654f34e qemu-char.c
b/qemu-char.c | ||
---|---|---|
3177 | 3177 |
|
3178 | 3178 |
#endif |
3179 | 3179 |
|
3180 |
static const struct {
|
|
3180 |
typedef struct CharDriver {
|
|
3181 | 3181 |
const char *name; |
3182 | 3182 |
CharDriverState *(*open)(QemuOpts *opts); |
3183 |
} backend_table[] = { |
|
3184 |
{ .name = "null", .open = qemu_chr_open_null }, |
|
3185 |
{ .name = "socket", .open = qemu_chr_open_socket }, |
|
3186 |
{ .name = "udp", .open = qemu_chr_open_udp }, |
|
3187 |
{ .name = "msmouse", .open = qemu_chr_open_msmouse }, |
|
3188 |
{ .name = "vc", .open = vc_init }, |
|
3189 |
{ .name = "memory", .open = qemu_chr_open_ringbuf }, |
|
3190 |
#ifdef _WIN32 |
|
3191 |
{ .name = "file", .open = qemu_chr_open_win_file_out }, |
|
3192 |
{ .name = "pipe", .open = qemu_chr_open_win_pipe }, |
|
3193 |
{ .name = "console", .open = qemu_chr_open_win_con }, |
|
3194 |
{ .name = "serial", .open = qemu_chr_open_win }, |
|
3195 |
{ .name = "stdio", .open = qemu_chr_open_win_stdio }, |
|
3196 |
#else |
|
3197 |
{ .name = "file", .open = qemu_chr_open_file_out }, |
|
3198 |
{ .name = "pipe", .open = qemu_chr_open_pipe }, |
|
3199 |
{ .name = "stdio", .open = qemu_chr_open_stdio }, |
|
3200 |
#endif |
|
3201 |
#ifdef CONFIG_BRLAPI |
|
3202 |
{ .name = "braille", .open = chr_baum_init }, |
|
3203 |
#endif |
|
3204 |
#ifdef HAVE_CHARDEV_TTY |
|
3205 |
{ .name = "tty", .open = qemu_chr_open_tty }, |
|
3206 |
{ .name = "serial", .open = qemu_chr_open_tty }, |
|
3207 |
{ .name = "pty", .open = qemu_chr_open_pty }, |
|
3208 |
#endif |
|
3209 |
#ifdef HAVE_CHARDEV_PARPORT |
|
3210 |
{ .name = "parallel", .open = qemu_chr_open_pp }, |
|
3211 |
{ .name = "parport", .open = qemu_chr_open_pp }, |
|
3212 |
#endif |
|
3213 |
#ifdef CONFIG_SPICE |
|
3214 |
{ .name = "spicevmc", .open = qemu_chr_open_spice }, |
|
3215 |
#if SPICE_SERVER_VERSION >= 0x000c02 |
|
3216 |
{ .name = "spiceport", .open = qemu_chr_open_spice_port }, |
|
3217 |
#endif |
|
3218 |
#endif |
|
3219 |
}; |
|
3183 |
} CharDriver; |
|
3184 |
|
|
3185 |
static GSList *backends; |
|
3186 |
|
|
3187 |
void register_char_driver(const char *name, CharDriverState *(*open)(QemuOpts *)) |
|
3188 |
{ |
|
3189 |
CharDriver *s; |
|
3190 |
|
|
3191 |
s = g_malloc0(sizeof(*s)); |
|
3192 |
s->name = g_strdup(name); |
|
3193 |
s->open = open; |
|
3194 |
|
|
3195 |
backends = g_slist_append(backends, s); |
|
3196 |
} |
|
3220 | 3197 |
|
3221 | 3198 |
CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts, |
3222 | 3199 |
void (*init)(struct CharDriverState *s), |
3223 | 3200 |
Error **errp) |
3224 | 3201 |
{ |
3202 |
CharDriver *cd; |
|
3225 | 3203 |
CharDriverState *chr; |
3226 |
int i;
|
|
3204 |
GSList *i;
|
|
3227 | 3205 |
|
3228 | 3206 |
if (qemu_opts_id(opts) == NULL) { |
3229 | 3207 |
error_setg(errp, "chardev: no id specified"); |
... | ... | |
3235 | 3213 |
qemu_opts_id(opts)); |
3236 | 3214 |
goto err; |
3237 | 3215 |
} |
3238 |
for (i = 0; i < ARRAY_SIZE(backend_table); i++) { |
|
3239 |
if (strcmp(backend_table[i].name, qemu_opt_get(opts, "backend")) == 0) |
|
3216 |
for (i = backends; i; i = i->next) { |
|
3217 |
cd = i->data; |
|
3218 |
|
|
3219 |
if (strcmp(cd->name, qemu_opt_get(opts, "backend")) == 0) { |
|
3240 | 3220 |
break; |
3221 |
} |
|
3241 | 3222 |
} |
3242 |
if (i == ARRAY_SIZE(backend_table)) {
|
|
3223 |
if (i == NULL) {
|
|
3243 | 3224 |
error_setg(errp, "chardev: backend \"%s\" not found", |
3244 | 3225 |
qemu_opt_get(opts, "backend")); |
3245 |
goto err;
|
|
3226 |
return NULL;
|
|
3246 | 3227 |
} |
3247 | 3228 |
|
3248 |
chr = backend_table[i].open(opts);
|
|
3229 |
chr = cd->open(opts);
|
|
3249 | 3230 |
if (!chr) { |
3250 | 3231 |
error_setg(errp, "chardev: opening backend \"%s\" failed", |
3251 | 3232 |
qemu_opt_get(opts, "backend")); |
... | ... | |
3677 | 3658 |
} |
3678 | 3659 |
qemu_chr_delete(chr); |
3679 | 3660 |
} |
3661 |
|
|
3662 |
static void register_types(void) |
|
3663 |
{ |
|
3664 |
register_char_driver("null", qemu_chr_open_null); |
|
3665 |
register_char_driver("socket", qemu_chr_open_socket); |
|
3666 |
register_char_driver("udp", qemu_chr_open_udp); |
|
3667 |
register_char_driver("msmouse", qemu_chr_open_msmouse); |
|
3668 |
register_char_driver("vc", vc_init); |
|
3669 |
register_char_driver("memory", qemu_chr_open_ringbuf); |
|
3670 |
#ifdef _WIN32 |
|
3671 |
register_char_driver("file", qemu_chr_open_win_file_out); |
|
3672 |
register_char_driver("pipe", qemu_chr_open_win_pipe); |
|
3673 |
register_char_driver("console", qemu_chr_open_win_con); |
|
3674 |
register_char_driver("serial", qemu_chr_open_win); |
|
3675 |
register_char_driver("stdio", qemu_chr_open_win_stdio); |
|
3676 |
#else |
|
3677 |
register_char_driver("file", qemu_chr_open_file_out); |
|
3678 |
register_char_driver("pipe", qemu_chr_open_pipe); |
|
3679 |
register_char_driver("stdio", qemu_chr_open_stdio); |
|
3680 |
#endif |
|
3681 |
#ifdef CONFIG_BRLAPI |
|
3682 |
register_char_driver("braille", chr_baum_init); |
|
3683 |
#endif |
|
3684 |
#ifdef HAVE_CHARDEV_TTY |
|
3685 |
register_char_driver("tty", qemu_chr_open_tty); |
|
3686 |
register_char_driver("serial", qemu_chr_open_tty); |
|
3687 |
register_char_driver("pty", qemu_chr_open_pty); |
|
3688 |
#endif |
|
3689 |
#ifdef HAVE_CHARDEV_PARPORT |
|
3690 |
register_char_driver("parallel", qemu_chr_open_pp); |
|
3691 |
register_char_driver("parport", qemu_chr_open_pp); |
|
3692 |
#endif |
|
3693 |
#ifdef CONFIG_SPICE |
|
3694 |
register_char_driver("spicevmc", qemu_chr_open_spice); |
|
3695 |
#if SPICE_SERVER_VERSION >= 0x000c02 |
|
3696 |
register_char_driver("spiceport", qemu_chr_open_spice_port); |
|
3697 |
#endif |
|
3698 |
#endif |
|
3699 |
} |
|
3700 |
|
|
3701 |
type_init(register_types); |
Also available in: Unified diff