diff options
Diffstat (limited to 'vl.c')
-rw-r--r-- | vl.c | 150 |
1 files changed, 55 insertions, 95 deletions
@@ -1119,11 +1119,17 @@ void quit_timers(void) /***********************************************************/ /* character device */ +static void qemu_chr_event(CharDriverState *s, int event) +{ + if (!s->chr_event) + return; + s->chr_event(s->handler_opaque, event); +} + static void qemu_chr_reset_bh(void *opaque) { CharDriverState *s = opaque; - if (s->chr_event) - s->chr_event(s, CHR_EVENT_RESET); + qemu_chr_event(s, CHR_EVENT_RESET); qemu_bh_delete(s->bh); s->bh = NULL; } @@ -1148,6 +1154,19 @@ int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg) return s->chr_ioctl(s, cmd, arg); } +int qemu_chr_can_read(CharDriverState *s) +{ + if (!s->chr_can_read) + return 0; + return s->chr_can_read(s->handler_opaque); +} + +void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len) +{ + s->chr_read(s->handler_opaque, buf, len); +} + + void qemu_chr_printf(CharDriverState *s, const char *fmt, ...) { char buf[4096]; @@ -1164,29 +1183,25 @@ void qemu_chr_send_event(CharDriverState *s, int event) s->chr_send_event(s, event); } -void qemu_chr_add_read_handler(CharDriverState *s, - IOCanRWHandler *fd_can_read, - IOReadHandler *fd_read, void *opaque) +void qemu_chr_add_handlers(CharDriverState *s, + IOCanRWHandler *fd_can_read, + IOReadHandler *fd_read, + IOEventHandler *fd_event, + void *opaque) { - s->chr_add_read_handler(s, fd_can_read, fd_read, opaque); + s->chr_can_read = fd_can_read; + s->chr_read = fd_read; + s->chr_event = fd_event; + s->handler_opaque = opaque; + if (s->chr_update_read_handler) + s->chr_update_read_handler(s); } -void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event) -{ - s->chr_event = chr_event; -} - static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len) { return len; } -static void null_chr_add_read_handler(CharDriverState *chr, - IOCanRWHandler *fd_can_read, - IOReadHandler *fd_read, void *opaque) -{ -} - static CharDriverState *qemu_chr_open_null(void) { CharDriverState *chr; @@ -1195,7 +1210,6 @@ static CharDriverState *qemu_chr_open_null(void) if (!chr) return NULL; chr->chr_write = null_chr_write; - chr->chr_add_read_handler = null_chr_add_read_handler; return chr; } @@ -1287,9 +1301,6 @@ void socket_set_nonblock(int fd) typedef struct { int fd_in, fd_out; - IOCanRWHandler *fd_can_read; - IOReadHandler *fd_read; - void *fd_opaque; int max_size; } FDCharDriver; @@ -1309,7 +1320,7 @@ static int fd_chr_read_poll(void *opaque) CharDriverState *chr = opaque; FDCharDriver *s = chr->opaque; - s->max_size = s->fd_can_read(s->fd_opaque); + s->max_size = qemu_chr_can_read(chr); return s->max_size; } @@ -1332,20 +1343,15 @@ static void fd_chr_read(void *opaque) return; } if (size > 0) { - s->fd_read(s->fd_opaque, buf, size); + qemu_chr_read(chr, buf, size); } } -static void fd_chr_add_read_handler(CharDriverState *chr, - IOCanRWHandler *fd_can_read, - IOReadHandler *fd_read, void *opaque) +static void fd_chr_update_read_handler(CharDriverState *chr) { FDCharDriver *s = chr->opaque; if (s->fd_in >= 0) { - s->fd_can_read = fd_can_read; - s->fd_read = fd_read; - s->fd_opaque = opaque; if (nographic && s->fd_in == 0) { } else { qemu_set_fd_handler2(s->fd_in, fd_chr_read_poll, @@ -1372,7 +1378,7 @@ static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out) s->fd_out = fd_out; chr->opaque = s; chr->chr_write = fd_chr_write; - chr->chr_add_read_handler = fd_chr_add_read_handler; + chr->chr_update_read_handler = fd_chr_update_read_handler; qemu_chr_reset(chr); @@ -1465,7 +1471,7 @@ static void stdio_received_byte(int ch) chr = stdio_clients[client_index]; s = chr->opaque; - chr->chr_event(s->fd_opaque, CHR_EVENT_BREAK); + qemu_chr_event(chr, CHR_EVENT_BREAK); } break; case 'c': @@ -1492,13 +1498,11 @@ static void stdio_received_byte(int ch) if (client_index < stdio_nb_clients) { uint8_t buf[1]; CharDriverState *chr; - FDCharDriver *s; chr = stdio_clients[client_index]; - s = chr->opaque; - if (s->fd_can_read(s->fd_opaque) > 0) { + if (qemu_chr_can_read(chr) > 0) { buf[0] = ch; - s->fd_read(s->fd_opaque, buf, 1); + qemu_chr_read(chr, buf, 1); } else if (term_fifo_size == 0) { term_fifo[term_fifo_size++] = ch; } @@ -1509,14 +1513,12 @@ static void stdio_received_byte(int ch) static int stdio_read_poll(void *opaque) { CharDriverState *chr; - FDCharDriver *s; if (client_index < stdio_nb_clients) { chr = stdio_clients[client_index]; - s = chr->opaque; /* try to flush the queue if needed */ - if (term_fifo_size != 0 && s->fd_can_read(s->fd_opaque) > 0) { - s->fd_read(s->fd_opaque, term_fifo, 1); + if (term_fifo_size != 0 && qemu_chr_can_read(chr) > 0) { + qemu_chr_read(chr, term_fifo, 1); term_fifo_size = 0; } /* see if we can absorb more chars */ @@ -1855,7 +1857,6 @@ static CharDriverState *qemu_chr_open_pp(const char *filename) } chr->opaque = (void *)fd; chr->chr_write = null_chr_write; - chr->chr_add_read_handler = null_chr_add_read_handler; chr->chr_ioctl = pp_ioctl; qemu_chr_reset(chr); @@ -1874,9 +1875,6 @@ static CharDriverState *qemu_chr_open_pty(void) #ifdef _WIN32 typedef struct { - IOCanRWHandler *fd_can_read; - IOReadHandler *fd_read; - void *win_opaque; int max_size; HANDLE hcom, hrecv, hsend; OVERLAPPED orecv, osend; @@ -2020,10 +2018,10 @@ static int win_chr_write(CharDriverState *chr, const uint8_t *buf, int len1) static int win_chr_read_poll(WinCharState *s) { - s->max_size = s->fd_can_read(s->win_opaque); + s->max_size = qemu_chr_can_read(s->chr); return s->max_size; } - + static void win_chr_readfile(WinCharState *s) { int ret, err; @@ -2041,7 +2039,7 @@ static void win_chr_readfile(WinCharState *s) } if (size > 0) { - s->fd_read(s->win_opaque, buf, size); + qemu_chr_read(s->chr, buf, size); } } @@ -2071,17 +2069,6 @@ static int win_chr_poll(void *opaque) return 0; } -static void win_chr_add_read_handler(CharDriverState *chr, - IOCanRWHandler *fd_can_read, - IOReadHandler *fd_read, void *opaque) -{ - WinCharState *s = chr->opaque; - - s->fd_can_read = fd_can_read; - s->fd_read = fd_read; - s->win_opaque = opaque; -} - static CharDriverState *qemu_chr_open_win(const char *filename) { CharDriverState *chr; @@ -2097,7 +2084,6 @@ static CharDriverState *qemu_chr_open_win(const char *filename) } chr->opaque = s; chr->chr_write = win_chr_write; - chr->chr_add_read_handler = win_chr_add_read_handler; chr->chr_close = win_chr_close; if (win_chr_init(s, filename) < 0) { @@ -2201,7 +2187,6 @@ static CharDriverState *qemu_chr_open_win_pipe(const char *filename) } chr->opaque = s; chr->chr_write = win_chr_write; - chr->chr_add_read_handler = win_chr_add_read_handler; chr->chr_close = win_chr_close; if (win_chr_pipe_init(s, filename) < 0) { @@ -2229,7 +2214,6 @@ static CharDriverState *qemu_chr_open_win_file(HANDLE fd_out) s->hcom = fd_out; chr->opaque = s; chr->chr_write = win_chr_write; - chr->chr_add_read_handler = win_chr_add_read_handler; qemu_chr_reset(chr); return chr; } @@ -2251,9 +2235,6 @@ static CharDriverState *qemu_chr_open_win_file_out(const char *file_out) /* UDP Net console */ typedef struct { - IOCanRWHandler *fd_can_read; - IOReadHandler *fd_read; - void *fd_opaque; int fd; struct sockaddr_in daddr; char buf[1024]; @@ -2275,15 +2256,15 @@ static int udp_chr_read_poll(void *opaque) CharDriverState *chr = opaque; NetCharDriver *s = chr->opaque; - s->max_size = s->fd_can_read(s->fd_opaque); + s->max_size = qemu_chr_can_read(chr); /* If there were any stray characters in the queue process them * first */ while (s->max_size > 0 && s->bufptr < s->bufcnt) { - s->fd_read(s->fd_opaque, &s->buf[s->bufptr], 1); + qemu_chr_read(chr, &s->buf[s->bufptr], 1); s->bufptr++; - s->max_size = s->fd_can_read(s->fd_opaque); + s->max_size = qemu_chr_can_read(chr); } return s->max_size; } @@ -2302,22 +2283,17 @@ static void udp_chr_read(void *opaque) s->bufptr = 0; while (s->max_size > 0 && s->bufptr < s->bufcnt) { - s->fd_read(s->fd_opaque, &s->buf[s->bufptr], 1); + qemu_chr_read(chr, &s->buf[s->bufptr], 1); s->bufptr++; - s->max_size = s->fd_can_read(s->fd_opaque); + s->max_size = qemu_chr_can_read(chr); } } -static void udp_chr_add_read_handler(CharDriverState *chr, - IOCanRWHandler *fd_can_read, - IOReadHandler *fd_read, void *opaque) +static void udp_chr_update_read_handler(CharDriverState *chr) { NetCharDriver *s = chr->opaque; if (s->fd >= 0) { - s->fd_can_read = fd_can_read; - s->fd_read = fd_read; - s->fd_opaque = opaque; qemu_set_fd_handler2(s->fd, udp_chr_read_poll, udp_chr_read, NULL, chr); } @@ -2367,7 +2343,7 @@ static CharDriverState *qemu_chr_open_udp(const char *def) s->bufptr = 0; chr->opaque = s; chr->chr_write = udp_chr_write; - chr->chr_add_read_handler = udp_chr_add_read_handler; + chr->chr_update_read_handler = udp_chr_update_read_handler; return chr; return_err: @@ -2384,13 +2360,11 @@ return_err: /* TCP Net console */ typedef struct { - IOCanRWHandler *fd_can_read; - IOReadHandler *fd_read; - void *fd_opaque; int fd, listen_fd; int connected; int max_size; int do_telnetopt; + int do_nodelay; int is_unix; } TCPCharDriver; @@ -2413,9 +2387,7 @@ static int tcp_chr_read_poll(void *opaque) TCPCharDriver *s = chr->opaque; if (!s->connected) return 0; - if (!s->fd_can_read) - return 0; - s->max_size = s->fd_can_read(s->fd_opaque); + s->max_size = qemu_chr_can_read(chr); return s->max_size; } @@ -2448,7 +2420,7 @@ static void tcp_chr_process_IAC_bytes(CharDriverState *chr, } else { if ((unsigned char)buf[i] == IAC_BREAK && s->do_telnetopt == 2) { /* Handle IAC break commands by sending a serial break */ - chr->chr_event(s->fd_opaque, CHR_EVENT_BREAK); + qemu_chr_event(chr, CHR_EVENT_BREAK); s->do_telnetopt++; } s->do_telnetopt++; @@ -2495,21 +2467,10 @@ static void tcp_chr_read(void *opaque) if (s->do_telnetopt) tcp_chr_process_IAC_bytes(chr, s, buf, &size); if (size > 0) - s->fd_read(s->fd_opaque, buf, size); + qemu_chr_read(chr, buf, size); } } -static void tcp_chr_add_read_handler(CharDriverState *chr, - IOCanRWHandler *fd_can_read, - IOReadHandler *fd_read, void *opaque) -{ - TCPCharDriver *s = chr->opaque; - - s->fd_can_read = fd_can_read; - s->fd_read = fd_read; - s->fd_opaque = opaque; -} - static void tcp_chr_connect(void *opaque) { CharDriverState *chr = opaque; @@ -2658,7 +2619,6 @@ static CharDriverState *qemu_chr_open_tcp(const char *host_str, chr->opaque = s; chr->chr_write = tcp_chr_write; - chr->chr_add_read_handler = tcp_chr_add_read_handler; chr->chr_close = tcp_chr_close; if (is_listen) { |