char: introduce a blocking version of qemu_chr_fe_write
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
e769bdc26d
commit
cd18720a29
@ -169,6 +169,21 @@ int qemu_chr_fe_add_watch(CharDriverState *s, GIOCondition cond,
|
||||
*/
|
||||
int qemu_chr_fe_write(CharDriverState *s, const uint8_t *buf, int len);
|
||||
|
||||
/**
|
||||
* @qemu_chr_fe_write_all:
|
||||
*
|
||||
* Write data to a character backend from the front end. This function will
|
||||
* send data from the front end to the back end. Unlike @qemu_chr_fe_write,
|
||||
* this function will block if the back end cannot consume all of the data
|
||||
* attempted to be written.
|
||||
*
|
||||
* @buf the data
|
||||
* @len the number of bytes to send
|
||||
*
|
||||
* Returns: the number of bytes consumed
|
||||
*/
|
||||
int qemu_chr_fe_write_all(CharDriverState *s, const uint8_t *buf, int len);
|
||||
|
||||
/**
|
||||
* @qemu_chr_fe_ioctl:
|
||||
*
|
||||
|
27
qemu-char.c
27
qemu-char.c
@ -140,6 +140,33 @@ int qemu_chr_fe_write(CharDriverState *s, const uint8_t *buf, int len)
|
||||
return s->chr_write(s, buf, len);
|
||||
}
|
||||
|
||||
int qemu_chr_fe_write_all(CharDriverState *s, const uint8_t *buf, int len)
|
||||
{
|
||||
int offset = 0;
|
||||
int res;
|
||||
|
||||
while (offset < len) {
|
||||
do {
|
||||
res = s->chr_write(s, buf + offset, len - offset);
|
||||
if (res == -1 && errno == EAGAIN) {
|
||||
g_usleep(100);
|
||||
}
|
||||
} while (res == -1 && errno == EAGAIN);
|
||||
|
||||
if (res == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (res < 0) {
|
||||
return res;
|
||||
}
|
||||
|
||||
offset += res;
|
||||
}
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
int qemu_chr_fe_ioctl(CharDriverState *s, int cmd, void *arg)
|
||||
{
|
||||
if (!s->chr_ioctl)
|
||||
|
Loading…
Reference in New Issue
Block a user