[Spice-devel] [phodav PATCH 1/2 v2] spice-webdavd: Automount shared folder on Windows

Lukas Venhoda lvenhoda at redhat.com
Thu Feb 25 15:45:13 UTC 2016


Hi

On Thu, Feb 25, 2016 at 4:21 PM, Marc-André Lureau <
marcandre.lureau at gmail.com> wrote:

> Hi
>
> On Thu, Feb 25, 2016 at 3:19 PM, Lukas Venhoda <lvenhoda at redhat.com>
> wrote:
> > +static void
> > +map_drive(GTask *task,
> > +          gpointer source_object,
> > +          gpointer task_data,
> > +          GCancellable *cancellable)
> > +{
> > +  static int loop_time = G_USEC_PER_SEC/10;
> > +  GCancellable * cancel_map = task_data;
> > +  gchar local_name[3];
> > +  gchar remote_name[] = "http://localhost:9843/";
> > +  NETRESOURCE net_resource;
> > +  guint32 retval;
> > +  gint i;
> > +
> > +  for (i = 0; i < 5; ++i)
> > +    {
> > +      if (g_cancellable_is_cancelled (cancel_map))
> > +        return;
> > +      else
> > +        g_usleep (loop_time);
> > +    }
> > +
>
> I am not sure I see the point of waiting 0.5s here. Add a comment? (a
> better way would be to use g_poll with the pollfd cancellable can
> creats: no need to loop)
>
>
I tryed this using g_io_channel_win32_make_pollfd(), but the way the FD
(well actually file handle) is created on windows, it doesn't support
polling.
It might require a more in depth rewrite of the windows part of webdavd to
make it work.


> > +  if ((drive_letter = get_free_drive_letter ()) == 0)
> > +      g_error ("all drive letters already assigned.");
>
> This will abort(), I think it's better to have simply a critical. The
> webdav folder can be accessed through other means (browser etc)
>

Will change to critical


>
> > +  local_name[0] = drive_letter;
> > +  local_name[1] = ':';
> > +  local_name[2] = 0;
>
> This is not strictly equivalent to "net use *", it will be racy. It
> probably needs to retry if the localname is already used.
>

That's why there's get_free_drive_letter function().
The localname will either be usable, or the driver cannot be mapped.
Do you know equivalent function to net use? I could find one.


>
> > +  net_resource.dwType = RESOURCETYPE_DISK;
> > +  net_resource.lpLocalName = local_name;
> > +  net_resource.lpRemoteName = remote_name;
> > +  net_resource.lpProvider = NULL;
> > +
> > +  retval = WNetAddConnection2 (&net_resource, NULL, NULL,
> CONNECT_TEMPORARY);
> > +
> > +  if (retval == NO_ERROR)
> > +    g_debug ("map_drive ok");
> > +  else if (retval == ERROR_ALREADY_ASSIGNED)
> > +    g_debug ("map_drive already asigned");
>
> here, goto getfreedriver?
>

If someone maps the drive before I can?
Well a simple do while loop can't hurt here.


>
> > +  else
> > +    g_error ("map_drive error %d", retval);
>
> Please avoid g_error for non-fatal issues.
>

Will change to critical


>
> The map-driver.bat file uses a nifty hack to name the folder "Spice
> client" (Spice folder would make more sense). It would be really nice
> to name the folder here too.
>
>
Yes, I forgot about that, because I already have the reg hack in my
registry.
I can try to reproduce it programatically.


> > +
> > +  return;
> > +}
> > +#endif
> > +
> >  static void
> >  run_service (void)
> >  {
> >    g_debug ("Run service");
> >
> > +#ifdef G_OS_WIN32
> > +  GCancellable * cancel_map = g_cancellable_new ();
> > +  GTask * map_drive_task = g_task_new (NULL, NULL, NULL, NULL);
>
> no unref? you probably should g_task_return() somewhere too.
>

If I don't set the GTask to return-on-cancel, I don't need to call
g_task_return(),
because the callback is empty.

>From the GTask doc:
Other than in that case, *task* will be completed when the GTaskThreadFunc
<https://developer.gnome.org/gio/stable/GTask.html#GTaskThreadFunc> returns,
not when it calls a g_task_return_ function.


>
> > +  g_task_set_task_data (map_drive_task, cancel_map, NULL);
> > +  g_task_run_in_thread (map_drive_task, map_drive);
>
> I think you could unref after this call, since run_in_thread() keeps a ref.
>
> Before adding and calling map_drive, I think you should implement the
> function to check if there is already a mapping.
>

Mapping should be always removed before starting the service.
It is removed when stopping the service, and automatically removed when
restarting Windows.


>
> > +#endif
> > +
> >    g_socket_service_start (socket_service);
> >
> >    cancel = g_cancellable_new ();
> > @@ -775,6 +852,10 @@ run_service (void)
> >    g_main_loop_run (loop);
> >    g_main_loop_unref (loop);
> >
> > +#ifdef G_OS_WIN32
> > +  g_cancellable_cancel (cancel_map);
>
> no unref either?
>

Will add the necessary unrefs.


>
> > +#endif
> > +
> >    g_cancellable_cancel (cancel);
> >
> >    g_clear_object (&mux_istream);
> > --
> > 2.5.0
> >
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/spice-devel
>
>
>
> --
> Marc-André Lureau
>

-- 
Lukas Venhoda
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20160225/054eeeda/attachment.html>


More information about the Spice-devel mailing list