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