[CRIU] Re: [PATCH 2/4] image: add functions to close and re-open the
network listen socket
Adrian Reber
adrian at lisas.de
Thu Aug 16 11:56:43 EDT 2012
On Wed, Aug 15, 2012 at 02:53:13PM +0400, Pavel Emelyanov wrote:
> On 08/15/2012 01:54 PM, Adrian Reber wrote:
> > During the restore of the file descriptors all open network
> > sockets have to be closed.
>
> I don't quite understand this requirement. Can you elaborate, please?
I think it is during prepare_fs(). If the network socket is still open
(using fd=3) prepare_fs() fails if the program to restore wants to open
that file descriptor. Maybe there is another way to handle it but
closing and later reopening it was my only idea.
> > The network hostname and port are stored during open_listen_socket()
> > and after close_listen_socket() they can be re-used by calling
> > reopen_listen_socket().
> >
> > Signed-off-by: Adrian Reber <adrian at lisas.de>
> > ---
> > image.c | 28 ++++++++++++++++++++++++++++
> > include/crtools.h | 2 ++
> > 2 files changed, 30 insertions(+), 0 deletions(-)
> >
> > diff --git a/image.c b/image.c
> > index 2115412..969017a 100644
> > --- a/image.c
> > +++ b/image.c
> > @@ -218,6 +218,8 @@ struct cr_fdset *cr_glob_fdset_open(int mode)
> >
> > static int image_dir_fd = -1;
> > static int sockfd = -1;
> > +static char network_host[255] = "";
> > +static int network_port = -1;
> >
> > int open_image(int type, unsigned long flags, ...)
> > {
> > @@ -309,6 +311,15 @@ int open_listen_socket(char *host, int port)
> > struct hostent *server;
> > struct sockaddr_in serveraddr;
> >
> > + if (sockfd != -1)
> > + return sockfd;
> > +
> > + /* if host is not specified return early */
> > + if (host == NULL)
> > + return -1;
> > +
> > + pr_info("Listening on %s:%d\n", host, port);
> > +
> > sockfd = socket(AF_INET, SOCK_STREAM, 0);
> > if (sockfd < 0) {
> > pr_perror("ERROR opening socket");
> > @@ -336,5 +347,22 @@ int open_listen_socket(char *host, int port)
> > return -1;
> > }
> >
> > + strncpy(network_host, host, 255);
> > + network_port = port;
> > return sockfd;
> > }
> > +
> > +void close_listen_socket()
> > +{
> > + if (sockfd == -1)
> > + return;
> > + close_safe(&sockfd);
> > + sockfd = -1;
> > +}
> > +
> > +int reopen_listen_socket()
> > +{
> > + if (network_port != -1)
> > + return open_listen_socket(network_host, network_port);
> > + return 0;
> > +}
> > diff --git a/include/crtools.h b/include/crtools.h
> > index c2ccbe0..c092802 100644
> > --- a/include/crtools.h
> > +++ b/include/crtools.h
> > @@ -133,6 +133,8 @@ extern int open_image_dir(void);
> > extern void close_image_dir(void);
> >
> > extern int open_listen_socket(char *host, int port);
> > +extern void close_listen_socket();
> > +extern int reopen_listen_socket();
> >
> > int open_image(int type, unsigned long flags, ...);
> > #define open_image_ro(type, ...) open_image(type, O_RDONLY, ##__VA_ARGS__)
More information about the CRIU
mailing list