That makes sense.  I wish Unix had a delete-on-close flag, it would save
a lot of trouble sometimes.

On Thu, Nov 15, 2018 at 04:22:59PM +0000, Alin Serdean wrote:
> Thanks for the suggestion Ben.
> 
> I was thinking about changing the regular open to a CreateFile on
> Windows with the flag:
> `
> FILE_FLAG_DELETE_ON_CLOSE
> 0x04000000
> 
> The file is to be deleted immediately after all of its handles are closed,
> which includes the specified handle and any other open or
> duplicated handles.
> 
> If there are existing open handles to a file, the call fails unless
> they were all opened with the FILE_SHARE_DELETE share mode.
> 
> Subsequent open requests for the file fail, unless the
> FILE_SHARE_DELETE share mode is specified.`
> 
> https://docs.microsoft.com/en-us/windows/desktop/api/FileAPI/nf-fileapi-createfilea
> 
> But both can work.
> 
> > -----Mesaj original-----
> > De la: [email protected] <ovs-dev-
> > [email protected]> În numele Ben Pfaff
> > Trimis: Thursday, November 15, 2018 6:11 PM
> > Către: [email protected]
> > Cc: [email protected]
> > Subiect: Re: [ovs-dev] [PATCH] Tests: Fix testing bridge - add port after
> > stopping controller on Windows
> > 
> > On Thu, Nov 15, 2018 at 03:23:28PM +0200, [email protected] wrote:
> > > I have opened an issue for it:
> > > https://github.com/openvswitch/ovs-issues/issues/165
> > >
> > > It's not test specific unfortunately. The file is put up for unlink on
> > > exit, but I'm guessing someone still has an opened handle at that point.
> > >
> > > I'm applying this patch for the moment and following up with the
> > > actual fix for the userspace.
> > 
> > Unix has similar-sounding issues with dangling Unix domain sockets.  On
> > Unix, the customary way to solve it is to delete an existing socket before
> > trying to create one with the same name.  You can see that in
> > make_unix_socket() in socket-util-unix.c:
> > 
> >     if (bind_path) {
> >         char linkname[MAX_UN_LEN + 1];
> >         struct sockaddr_un un;
> >         socklen_t un_len;
> >         int dirfd;
> > 
> >         if (unlink(bind_path) && errno != ENOENT) {
> >             VLOG_WARN("unlinking \"%s\": %s\n",
> >                       bind_path, ovs_strerror(errno));
> >         }
> >         fatal_signal_add_file_to_unlink(bind_path);
> > 
> > If that approach is appropriate under Windows as well, it might be
> > implemented something like this:
> > diff --git a/lib/stream-windows.c b/lib/stream-windows.c index
> > 34bc610b6f49..b027e48b4f8d 100644
> > --- a/lib/stream-windows.c
> > +++ b/lib/stream-windows.c
> > @@ -616,6 +616,11 @@ pwindows_open(const char *name OVS_UNUSED,
> > char *suffix,
> >          path = xstrdup(suffix);
> >      }
> > 
> > +    /* Remove any existing named pipe. */
> > +    if (remove(bind_path) && errno != ENOENT) {
> > +        VLOG_WARN("removing \"%s\": %s\n", bind_path,
> > ovs_strerror(errno));
> > +    }
> > +
> >      /* Try to create a file under the path location. */
> >      FILE *file = fopen(path, "w");
> >      if (!file) {
> > _______________________________________________
> > dev mailing list
> > [email protected]
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to