diff mbox series

[V1,22/32] char: qio_channel_socket_accept reuse fd

Message ID 1596122076-341293-23-git-send-email-steven.sistare@oracle.com
State New
Headers show
Series [V1,01/32] savevm: add vmstate handler iterators | expand

Commit Message

Steven Sistare July 30, 2020, 3:14 p.m. UTC
From: Mark Kanda <mark.kanda@oracle.com>

Add an fd argument to qio_channel_socket_accept.  If not -1, the channel
uses that fd instead of accepting a new socket connection.  All callers
pass -1 in this patch, so no functional change.

Signed-off-by: Mark Kanda <mark.kanda@oracle.com>
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
---
 include/io/channel-socket.h    |  3 ++-
 io/channel-socket.c            | 12 +++++++++---
 io/net-listener.c              |  4 ++--
 scsi/qemu-pr-helper.c          |  2 +-
 tests/qtest/tpm-emu.c          |  2 +-
 tests/test-char.c              |  2 +-
 tests/test-io-channel-socket.c |  4 ++--
 7 files changed, 18 insertions(+), 11 deletions(-)

Comments

Dr. David Alan Gilbert Sept. 15, 2020, 5:33 p.m. UTC | #1
* Steve Sistare (steven.sistare@oracle.com) wrote:
> From: Mark Kanda <mark.kanda@oracle.com>
> 
> Add an fd argument to qio_channel_socket_accept.  If not -1, the channel
> uses that fd instead of accepting a new socket connection.  All callers
> pass -1 in this patch, so no functional change.

Doesn't some of this just come from the fact you're insisting on reusing
the command line?   We should be able to open a chardev on an fd
shouldn't we?

Dave

> Signed-off-by: Mark Kanda <mark.kanda@oracle.com>
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
> ---
>  include/io/channel-socket.h    |  3 ++-
>  io/channel-socket.c            | 12 +++++++++---
>  io/net-listener.c              |  4 ++--
>  scsi/qemu-pr-helper.c          |  2 +-
>  tests/qtest/tpm-emu.c          |  2 +-
>  tests/test-char.c              |  2 +-
>  tests/test-io-channel-socket.c |  4 ++--
>  7 files changed, 18 insertions(+), 11 deletions(-)
> 
> diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h
> index 777ff59..0ffc560 100644
> --- a/include/io/channel-socket.h
> +++ b/include/io/channel-socket.h
> @@ -248,6 +248,7 @@ qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
>  /**
>   * qio_channel_socket_accept:
>   * @ioc: the socket channel object
> + * @reuse_fd: fd to reuse; -1 otherwise
>   * @errp: pointer to a NULL-initialized error object
>   *
>   * If the socket represents a server, then this accepts
> @@ -258,7 +259,7 @@ qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
>   */
>  QIOChannelSocket *
>  qio_channel_socket_accept(QIOChannelSocket *ioc,
> -                          Error **errp);
> +                          int reuse_fd, Error **errp);
>  
>  
>  #endif /* QIO_CHANNEL_SOCKET_H */
> diff --git a/io/channel-socket.c b/io/channel-socket.c
> index e1b4667..dde12bf 100644
> --- a/io/channel-socket.c
> +++ b/io/channel-socket.c
> @@ -352,7 +352,7 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
>  
>  QIOChannelSocket *
>  qio_channel_socket_accept(QIOChannelSocket *ioc,
> -                          Error **errp)
> +                          int reuse_fd, Error **errp)
>  {
>      QIOChannelSocket *cioc;
>  
> @@ -362,8 +362,14 @@ qio_channel_socket_accept(QIOChannelSocket *ioc,
>  
>   retry:
>      trace_qio_channel_socket_accept(ioc);
> -    cioc->fd = qemu_accept(ioc->fd, (struct sockaddr *)&cioc->remoteAddr,
> -                           &cioc->remoteAddrLen);
> +
> +    if (reuse_fd != -1) {
> +        cioc->fd = reuse_fd;
> +    } else {
> +        cioc->fd = qemu_accept(ioc->fd, (struct sockaddr *)&cioc->remoteAddr,
> +                               &cioc->remoteAddrLen);
> +    }
> +
>      if (cioc->fd < 0) {
>          if (errno == EINTR) {
>              goto retry;
> diff --git a/io/net-listener.c b/io/net-listener.c
> index 5d8a226..bbdea1e 100644
> --- a/io/net-listener.c
> +++ b/io/net-listener.c
> @@ -45,7 +45,7 @@ static gboolean qio_net_listener_channel_func(QIOChannel *ioc,
>      QIOChannelSocket *sioc;
>  
>      sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
> -                                     NULL);
> +                                     -1, NULL);
>      if (!sioc) {
>          return TRUE;
>      }
> @@ -194,7 +194,7 @@ static gboolean qio_net_listener_wait_client_func(QIOChannel *ioc,
>      QIOChannelSocket *sioc;
>  
>      sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
> -                                     NULL);
> +                                     -1, NULL);
>      if (!sioc) {
>          return TRUE;
>      }
> diff --git a/scsi/qemu-pr-helper.c b/scsi/qemu-pr-helper.c
> index 57ad830..0e6d683 100644
> --- a/scsi/qemu-pr-helper.c
> +++ b/scsi/qemu-pr-helper.c
> @@ -800,7 +800,7 @@ static gboolean accept_client(QIOChannel *ioc, GIOCondition cond, gpointer opaqu
>      PRHelperClient *prh;
>  
>      cioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
> -                                     NULL);
> +                                     -1, NULL);
>      if (!cioc) {
>          return TRUE;
>      }
> diff --git a/tests/qtest/tpm-emu.c b/tests/qtest/tpm-emu.c
> index 2e8eb7b..19e5dab 100644
> --- a/tests/qtest/tpm-emu.c
> +++ b/tests/qtest/tpm-emu.c
> @@ -83,7 +83,7 @@ void *tpm_emu_ctrl_thread(void *data)
>      g_cond_signal(&s->data_cond);
>  
>      qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);
> -    ioc = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));
> +    ioc = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));
>      g_assert(ioc);
>  
>      {
> diff --git a/tests/test-char.c b/tests/test-char.c
> index 614bdac..1bb6ae0 100644
> --- a/tests/test-char.c
> +++ b/tests/test-char.c
> @@ -884,7 +884,7 @@ char_socket_client_server_thread(gpointer data)
>      QIOChannelSocket *cioc;
>  
>  retry:
> -    cioc = qio_channel_socket_accept(ioc, &error_abort);
> +    cioc = qio_channel_socket_accept(ioc, -1, &error_abort);
>      g_assert_nonnull(cioc);
>  
>      if (char_socket_ping_pong(QIO_CHANNEL(cioc), NULL) != 0) {
> diff --git a/tests/test-io-channel-socket.c b/tests/test-io-channel-socket.c
> index d43083a..0d410cf 100644
> --- a/tests/test-io-channel-socket.c
> +++ b/tests/test-io-channel-socket.c
> @@ -75,7 +75,7 @@ static void test_io_channel_setup_sync(SocketAddress *listen_addr,
>      qio_channel_set_delay(*src, false);
>  
>      qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);
> -    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));
> +    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));
>      g_assert(*dst);
>  
>      test_io_channel_set_socket_bufs(*src, *dst);
> @@ -143,7 +143,7 @@ static void test_io_channel_setup_async(SocketAddress *listen_addr,
>      g_assert(!data.err);
>  
>      qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);
> -    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));
> +    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));
>      g_assert(*dst);
>  
>      qio_channel_set_delay(*src, false);
> -- 
> 1.8.3.1
>
Daniel P. Berrangé Sept. 15, 2020, 5:53 p.m. UTC | #2
On Tue, Sep 15, 2020 at 06:33:34PM +0100, Dr. David Alan Gilbert wrote:
> * Steve Sistare (steven.sistare@oracle.com) wrote:
> > From: Mark Kanda <mark.kanda@oracle.com>
> > 
> > Add an fd argument to qio_channel_socket_accept.  If not -1, the channel
> > uses that fd instead of accepting a new socket connection.  All callers
> > pass -1 in this patch, so no functional change.
> 
> Doesn't some of this just come from the fact you're insisting on reusing
> the command line?   We should be able to open a chardev on an fd
> shouldn't we?

Even ignoring that question, this patch looks pointless to me. The callers
have to be modified to pass in the FD to use instead of accepting a new
connection. Given that, you migt as well just modify the callers to use
the FD immediately if valid and never call qio_channel_socket_accept at all.

ie

   if (reuse_fd)
      fd = reuse_fd;
   else
      fd = qio_channel_socket_accept(ioc...)

> 
> Dave
> 
> > Signed-off-by: Mark Kanda <mark.kanda@oracle.com>
> > Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
> > ---
> >  include/io/channel-socket.h    |  3 ++-
> >  io/channel-socket.c            | 12 +++++++++---
> >  io/net-listener.c              |  4 ++--
> >  scsi/qemu-pr-helper.c          |  2 +-
> >  tests/qtest/tpm-emu.c          |  2 +-
> >  tests/test-char.c              |  2 +-
> >  tests/test-io-channel-socket.c |  4 ++--
> >  7 files changed, 18 insertions(+), 11 deletions(-)
> > 
> > diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h
> > index 777ff59..0ffc560 100644
> > --- a/include/io/channel-socket.h
> > +++ b/include/io/channel-socket.h
> > @@ -248,6 +248,7 @@ qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
> >  /**
> >   * qio_channel_socket_accept:
> >   * @ioc: the socket channel object
> > + * @reuse_fd: fd to reuse; -1 otherwise
> >   * @errp: pointer to a NULL-initialized error object
> >   *
> >   * If the socket represents a server, then this accepts
> > @@ -258,7 +259,7 @@ qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
> >   */
> >  QIOChannelSocket *
> >  qio_channel_socket_accept(QIOChannelSocket *ioc,
> > -                          Error **errp);
> > +                          int reuse_fd, Error **errp);
> >  
> >  
> >  #endif /* QIO_CHANNEL_SOCKET_H */
> > diff --git a/io/channel-socket.c b/io/channel-socket.c
> > index e1b4667..dde12bf 100644
> > --- a/io/channel-socket.c
> > +++ b/io/channel-socket.c
> > @@ -352,7 +352,7 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
> >  
> >  QIOChannelSocket *
> >  qio_channel_socket_accept(QIOChannelSocket *ioc,
> > -                          Error **errp)
> > +                          int reuse_fd, Error **errp)
> >  {
> >      QIOChannelSocket *cioc;
> >  
> > @@ -362,8 +362,14 @@ qio_channel_socket_accept(QIOChannelSocket *ioc,
> >  
> >   retry:
> >      trace_qio_channel_socket_accept(ioc);
> > -    cioc->fd = qemu_accept(ioc->fd, (struct sockaddr *)&cioc->remoteAddr,
> > -                           &cioc->remoteAddrLen);
> > +
> > +    if (reuse_fd != -1) {
> > +        cioc->fd = reuse_fd;
> > +    } else {
> > +        cioc->fd = qemu_accept(ioc->fd, (struct sockaddr *)&cioc->remoteAddr,
> > +                               &cioc->remoteAddrLen);
> > +    }
> > +
> >      if (cioc->fd < 0) {
> >          if (errno == EINTR) {
> >              goto retry;
> > diff --git a/io/net-listener.c b/io/net-listener.c
> > index 5d8a226..bbdea1e 100644
> > --- a/io/net-listener.c
> > +++ b/io/net-listener.c
> > @@ -45,7 +45,7 @@ static gboolean qio_net_listener_channel_func(QIOChannel *ioc,
> >      QIOChannelSocket *sioc;
> >  
> >      sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
> > -                                     NULL);
> > +                                     -1, NULL);
> >      if (!sioc) {
> >          return TRUE;
> >      }
> > @@ -194,7 +194,7 @@ static gboolean qio_net_listener_wait_client_func(QIOChannel *ioc,
> >      QIOChannelSocket *sioc;
> >  
> >      sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
> > -                                     NULL);
> > +                                     -1, NULL);
> >      if (!sioc) {
> >          return TRUE;
> >      }
> > diff --git a/scsi/qemu-pr-helper.c b/scsi/qemu-pr-helper.c
> > index 57ad830..0e6d683 100644
> > --- a/scsi/qemu-pr-helper.c
> > +++ b/scsi/qemu-pr-helper.c
> > @@ -800,7 +800,7 @@ static gboolean accept_client(QIOChannel *ioc, GIOCondition cond, gpointer opaqu
> >      PRHelperClient *prh;
> >  
> >      cioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
> > -                                     NULL);
> > +                                     -1, NULL);
> >      if (!cioc) {
> >          return TRUE;
> >      }
> > diff --git a/tests/qtest/tpm-emu.c b/tests/qtest/tpm-emu.c
> > index 2e8eb7b..19e5dab 100644
> > --- a/tests/qtest/tpm-emu.c
> > +++ b/tests/qtest/tpm-emu.c
> > @@ -83,7 +83,7 @@ void *tpm_emu_ctrl_thread(void *data)
> >      g_cond_signal(&s->data_cond);
> >  
> >      qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);
> > -    ioc = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));
> > +    ioc = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));
> >      g_assert(ioc);
> >  
> >      {
> > diff --git a/tests/test-char.c b/tests/test-char.c
> > index 614bdac..1bb6ae0 100644
> > --- a/tests/test-char.c
> > +++ b/tests/test-char.c
> > @@ -884,7 +884,7 @@ char_socket_client_server_thread(gpointer data)
> >      QIOChannelSocket *cioc;
> >  
> >  retry:
> > -    cioc = qio_channel_socket_accept(ioc, &error_abort);
> > +    cioc = qio_channel_socket_accept(ioc, -1, &error_abort);
> >      g_assert_nonnull(cioc);
> >  
> >      if (char_socket_ping_pong(QIO_CHANNEL(cioc), NULL) != 0) {
> > diff --git a/tests/test-io-channel-socket.c b/tests/test-io-channel-socket.c
> > index d43083a..0d410cf 100644
> > --- a/tests/test-io-channel-socket.c
> > +++ b/tests/test-io-channel-socket.c
> > @@ -75,7 +75,7 @@ static void test_io_channel_setup_sync(SocketAddress *listen_addr,
> >      qio_channel_set_delay(*src, false);
> >  
> >      qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);
> > -    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));
> > +    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));
> >      g_assert(*dst);
> >  
> >      test_io_channel_set_socket_bufs(*src, *dst);
> > @@ -143,7 +143,7 @@ static void test_io_channel_setup_async(SocketAddress *listen_addr,
> >      g_assert(!data.err);
> >  
> >      qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);
> > -    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));
> > +    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));
> >      g_assert(*dst);
> >  
> >      qio_channel_set_delay(*src, false);
> > -- 
> > 1.8.3.1
> > 
> -- 
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

Regards,
Daniel
Steven Sistare Sept. 24, 2020, 9:54 p.m. UTC | #3
On 9/15/2020 1:33 PM, Dr. David Alan Gilbert wrote:
> * Steve Sistare (steven.sistare@oracle.com) wrote:

>> From: Mark Kanda <mark.kanda@oracle.com>

>>

>> Add an fd argument to qio_channel_socket_accept.  If not -1, the channel

>> uses that fd instead of accepting a new socket connection.  All callers

>> pass -1 in this patch, so no functional change.

> 

> Doesn't some of this just come from the fact you're insisting on reusing

> the command line?   We should be able to open a chardev on an fd

> shouldn't we?


If the management layer originally added the char device via hot plug, then
we expect it to do so again after restart, following the typical practice for
live migration.  The device has no presence on the command line.

- Steve

>> Signed-off-by: Mark Kanda <mark.kanda@oracle.com>

>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>

>> ---

>>  include/io/channel-socket.h    |  3 ++-

>>  io/channel-socket.c            | 12 +++++++++---

>>  io/net-listener.c              |  4 ++--

>>  scsi/qemu-pr-helper.c          |  2 +-

>>  tests/qtest/tpm-emu.c          |  2 +-

>>  tests/test-char.c              |  2 +-

>>  tests/test-io-channel-socket.c |  4 ++--

>>  7 files changed, 18 insertions(+), 11 deletions(-)

>>

>> diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h

>> index 777ff59..0ffc560 100644

>> --- a/include/io/channel-socket.h

>> +++ b/include/io/channel-socket.h

>> @@ -248,6 +248,7 @@ qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,

>>  /**

>>   * qio_channel_socket_accept:

>>   * @ioc: the socket channel object

>> + * @reuse_fd: fd to reuse; -1 otherwise

>>   * @errp: pointer to a NULL-initialized error object

>>   *

>>   * If the socket represents a server, then this accepts

>> @@ -258,7 +259,7 @@ qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,

>>   */

>>  QIOChannelSocket *

>>  qio_channel_socket_accept(QIOChannelSocket *ioc,

>> -                          Error **errp);

>> +                          int reuse_fd, Error **errp);

>>  

>>  

>>  #endif /* QIO_CHANNEL_SOCKET_H */

>> diff --git a/io/channel-socket.c b/io/channel-socket.c

>> index e1b4667..dde12bf 100644

>> --- a/io/channel-socket.c

>> +++ b/io/channel-socket.c

>> @@ -352,7 +352,7 @@ void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,

>>  

>>  QIOChannelSocket *

>>  qio_channel_socket_accept(QIOChannelSocket *ioc,

>> -                          Error **errp)

>> +                          int reuse_fd, Error **errp)

>>  {

>>      QIOChannelSocket *cioc;

>>  

>> @@ -362,8 +362,14 @@ qio_channel_socket_accept(QIOChannelSocket *ioc,

>>  

>>   retry:

>>      trace_qio_channel_socket_accept(ioc);

>> -    cioc->fd = qemu_accept(ioc->fd, (struct sockaddr *)&cioc->remoteAddr,

>> -                           &cioc->remoteAddrLen);

>> +

>> +    if (reuse_fd != -1) {

>> +        cioc->fd = reuse_fd;

>> +    } else {

>> +        cioc->fd = qemu_accept(ioc->fd, (struct sockaddr *)&cioc->remoteAddr,

>> +                               &cioc->remoteAddrLen);

>> +    }

>> +

>>      if (cioc->fd < 0) {

>>          if (errno == EINTR) {

>>              goto retry;

>> diff --git a/io/net-listener.c b/io/net-listener.c

>> index 5d8a226..bbdea1e 100644

>> --- a/io/net-listener.c

>> +++ b/io/net-listener.c

>> @@ -45,7 +45,7 @@ static gboolean qio_net_listener_channel_func(QIOChannel *ioc,

>>      QIOChannelSocket *sioc;

>>  

>>      sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),

>> -                                     NULL);

>> +                                     -1, NULL);

>>      if (!sioc) {

>>          return TRUE;

>>      }

>> @@ -194,7 +194,7 @@ static gboolean qio_net_listener_wait_client_func(QIOChannel *ioc,

>>      QIOChannelSocket *sioc;

>>  

>>      sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),

>> -                                     NULL);

>> +                                     -1, NULL);

>>      if (!sioc) {

>>          return TRUE;

>>      }

>> diff --git a/scsi/qemu-pr-helper.c b/scsi/qemu-pr-helper.c

>> index 57ad830..0e6d683 100644

>> --- a/scsi/qemu-pr-helper.c

>> +++ b/scsi/qemu-pr-helper.c

>> @@ -800,7 +800,7 @@ static gboolean accept_client(QIOChannel *ioc, GIOCondition cond, gpointer opaqu

>>      PRHelperClient *prh;

>>  

>>      cioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),

>> -                                     NULL);

>> +                                     -1, NULL);

>>      if (!cioc) {

>>          return TRUE;

>>      }

>> diff --git a/tests/qtest/tpm-emu.c b/tests/qtest/tpm-emu.c

>> index 2e8eb7b..19e5dab 100644

>> --- a/tests/qtest/tpm-emu.c

>> +++ b/tests/qtest/tpm-emu.c

>> @@ -83,7 +83,7 @@ void *tpm_emu_ctrl_thread(void *data)

>>      g_cond_signal(&s->data_cond);

>>  

>>      qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);

>> -    ioc = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));

>> +    ioc = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));

>>      g_assert(ioc);

>>  

>>      {

>> diff --git a/tests/test-char.c b/tests/test-char.c

>> index 614bdac..1bb6ae0 100644

>> --- a/tests/test-char.c

>> +++ b/tests/test-char.c

>> @@ -884,7 +884,7 @@ char_socket_client_server_thread(gpointer data)

>>      QIOChannelSocket *cioc;

>>  

>>  retry:

>> -    cioc = qio_channel_socket_accept(ioc, &error_abort);

>> +    cioc = qio_channel_socket_accept(ioc, -1, &error_abort);

>>      g_assert_nonnull(cioc);

>>  

>>      if (char_socket_ping_pong(QIO_CHANNEL(cioc), NULL) != 0) {

>> diff --git a/tests/test-io-channel-socket.c b/tests/test-io-channel-socket.c

>> index d43083a..0d410cf 100644

>> --- a/tests/test-io-channel-socket.c

>> +++ b/tests/test-io-channel-socket.c

>> @@ -75,7 +75,7 @@ static void test_io_channel_setup_sync(SocketAddress *listen_addr,

>>      qio_channel_set_delay(*src, false);

>>  

>>      qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);

>> -    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));

>> +    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));

>>      g_assert(*dst);

>>  

>>      test_io_channel_set_socket_bufs(*src, *dst);

>> @@ -143,7 +143,7 @@ static void test_io_channel_setup_async(SocketAddress *listen_addr,

>>      g_assert(!data.err);

>>  

>>      qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);

>> -    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));

>> +    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));

>>      g_assert(*dst);

>>  

>>      qio_channel_set_delay(*src, false);

>> -- 

>> 1.8.3.1

>>
diff mbox series

Patch

diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h
index 777ff59..0ffc560 100644
--- a/include/io/channel-socket.h
+++ b/include/io/channel-socket.h
@@ -248,6 +248,7 @@  qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
 /**
  * qio_channel_socket_accept:
  * @ioc: the socket channel object
+ * @reuse_fd: fd to reuse; -1 otherwise
  * @errp: pointer to a NULL-initialized error object
  *
  * If the socket represents a server, then this accepts
@@ -258,7 +259,7 @@  qio_channel_socket_get_remote_address(QIOChannelSocket *ioc,
  */
 QIOChannelSocket *
 qio_channel_socket_accept(QIOChannelSocket *ioc,
-                          Error **errp);
+                          int reuse_fd, Error **errp);
 
 
 #endif /* QIO_CHANNEL_SOCKET_H */
diff --git a/io/channel-socket.c b/io/channel-socket.c
index e1b4667..dde12bf 100644
--- a/io/channel-socket.c
+++ b/io/channel-socket.c
@@ -352,7 +352,7 @@  void qio_channel_socket_dgram_async(QIOChannelSocket *ioc,
 
 QIOChannelSocket *
 qio_channel_socket_accept(QIOChannelSocket *ioc,
-                          Error **errp)
+                          int reuse_fd, Error **errp)
 {
     QIOChannelSocket *cioc;
 
@@ -362,8 +362,14 @@  qio_channel_socket_accept(QIOChannelSocket *ioc,
 
  retry:
     trace_qio_channel_socket_accept(ioc);
-    cioc->fd = qemu_accept(ioc->fd, (struct sockaddr *)&cioc->remoteAddr,
-                           &cioc->remoteAddrLen);
+
+    if (reuse_fd != -1) {
+        cioc->fd = reuse_fd;
+    } else {
+        cioc->fd = qemu_accept(ioc->fd, (struct sockaddr *)&cioc->remoteAddr,
+                               &cioc->remoteAddrLen);
+    }
+
     if (cioc->fd < 0) {
         if (errno == EINTR) {
             goto retry;
diff --git a/io/net-listener.c b/io/net-listener.c
index 5d8a226..bbdea1e 100644
--- a/io/net-listener.c
+++ b/io/net-listener.c
@@ -45,7 +45,7 @@  static gboolean qio_net_listener_channel_func(QIOChannel *ioc,
     QIOChannelSocket *sioc;
 
     sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
-                                     NULL);
+                                     -1, NULL);
     if (!sioc) {
         return TRUE;
     }
@@ -194,7 +194,7 @@  static gboolean qio_net_listener_wait_client_func(QIOChannel *ioc,
     QIOChannelSocket *sioc;
 
     sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
-                                     NULL);
+                                     -1, NULL);
     if (!sioc) {
         return TRUE;
     }
diff --git a/scsi/qemu-pr-helper.c b/scsi/qemu-pr-helper.c
index 57ad830..0e6d683 100644
--- a/scsi/qemu-pr-helper.c
+++ b/scsi/qemu-pr-helper.c
@@ -800,7 +800,7 @@  static gboolean accept_client(QIOChannel *ioc, GIOCondition cond, gpointer opaqu
     PRHelperClient *prh;
 
     cioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
-                                     NULL);
+                                     -1, NULL);
     if (!cioc) {
         return TRUE;
     }
diff --git a/tests/qtest/tpm-emu.c b/tests/qtest/tpm-emu.c
index 2e8eb7b..19e5dab 100644
--- a/tests/qtest/tpm-emu.c
+++ b/tests/qtest/tpm-emu.c
@@ -83,7 +83,7 @@  void *tpm_emu_ctrl_thread(void *data)
     g_cond_signal(&s->data_cond);
 
     qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);
-    ioc = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));
+    ioc = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));
     g_assert(ioc);
 
     {
diff --git a/tests/test-char.c b/tests/test-char.c
index 614bdac..1bb6ae0 100644
--- a/tests/test-char.c
+++ b/tests/test-char.c
@@ -884,7 +884,7 @@  char_socket_client_server_thread(gpointer data)
     QIOChannelSocket *cioc;
 
 retry:
-    cioc = qio_channel_socket_accept(ioc, &error_abort);
+    cioc = qio_channel_socket_accept(ioc, -1, &error_abort);
     g_assert_nonnull(cioc);
 
     if (char_socket_ping_pong(QIO_CHANNEL(cioc), NULL) != 0) {
diff --git a/tests/test-io-channel-socket.c b/tests/test-io-channel-socket.c
index d43083a..0d410cf 100644
--- a/tests/test-io-channel-socket.c
+++ b/tests/test-io-channel-socket.c
@@ -75,7 +75,7 @@  static void test_io_channel_setup_sync(SocketAddress *listen_addr,
     qio_channel_set_delay(*src, false);
 
     qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);
-    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));
+    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));
     g_assert(*dst);
 
     test_io_channel_set_socket_bufs(*src, *dst);
@@ -143,7 +143,7 @@  static void test_io_channel_setup_async(SocketAddress *listen_addr,
     g_assert(!data.err);
 
     qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);
-    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, &error_abort));
+    *dst = QIO_CHANNEL(qio_channel_socket_accept(lioc, -1, &error_abort));
     g_assert(*dst);
 
     qio_channel_set_delay(*src, false);