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);
|
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:
|
* @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);
|
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)
|
int qemu_chr_fe_ioctl(CharDriverState *s, int cmd, void *arg)
|
||||||
{
|
{
|
||||||
if (!s->chr_ioctl)
|
if (!s->chr_ioctl)
|
||||||
|
Loading…
Reference in New Issue
Block a user