[Spice-devel] [phodav PATCH 5/7 v3] spice-webdavd-windows: Automount shared folder
Pavel Grunt
pgrunt at redhat.com
Fri Mar 18 09:17:03 UTC 2016
Hi,
On Fri, 2016-03-18 at 08:53 +0100, Lukas Venhoda wrote:
> Hi
>
> Answers are below
>
> Lukáš Venhoda
>
> From: Pavel Grunt
> Sent: pátek 18. března 2016 7:21
> To: Lukas Venhoda; spice-devel at lists.freedesktop.org
> Subject: Re: [Spice-devel] [phodav PATCH 5/7 v3] spice-webdavd-
> windows: Automount shared folder
>
>
> > +gchar drive_letter;
>
> P: You don't need this variable. map_drive can accept const gchar
> instead
> of void.
>
> L: This variable is not because of map_drive, but because of
> unmap_drive.
> I need to remember to what letter I mapped the drive.
> I could pass a structure with cancel_map and drive_letter to
> map_drive_cb instead.
>
>
I don't see unmap_drive in your patch. If you need it for something in
the future, then change it in future :)
> > +
> > +static gchar
> > +get_free_drive_letter(void)
>
> P: Also would you mind adding some comments to this function ? To make it
> clear how it gets the free drive and what these masks represent.>
> L: Sure, I’ll add it as a comment.
> Basically GetLogicalDrives() returns bitfield of drives (A-Z … 1-26)
> The max_mask is Z, shifting causes going from Z to A.
>
> > +{
> > + const guint32 max_mask = 1 << 25;
> > + guint32 drives;
> > + guint32 mask;
> > + gint i;
> > +
> > + drives = GetLogicalDrives ();
> > +
> > + for (i = 0; i < 26; i++)
> > + {
> > + mask = max_mask >> i;
> > + if ((drives & mask) == 0)
> > + return 'z' - i;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +static map_drive_enum
> > +map_drive(void)
> > +{
> > + gchar local_name[3];
> > + gchar remote_name[] = "http://localhost:9843/> ";>
> P: it is only used in the net_resource
> L: Ok will change
> > + NETRESOURCE net_resource;
> > + guint32 retval;
> > +
> > + local_name[0] = drive_letter;>
> P: drive_letter should be parameter to this function
> L: See previous comment
> > + local_name[1] = ':';
> > + local_name[2] = 0;>
> I would prefer some sprintf-like function instead
> Ok will change
>
> > +
> > + net_resource.dwType = RESOURCETYPE_DISK;
> > + net_resource.lpLocalName = local_name;
> > + net_resource.lpRemoteName = remote_name;
> > + net_resource.lpProvider = NULL;>
> P:In my opinion setting up net_resource should go to a separate
> function,. You don't need 'local_name' and 'remote_name' to map the
> drive, you need the net_resource.
> L: Ok will change
> > +
> > + retval = WNetAddConnection2 (&net_resource, NULL, NULL,
> > CONNECT_TEMPORARY);
> > +
> > + if (retval == NO_ERROR) {
> > + g_debug ("map_drive ok");
> > + return MAP_DRIVE_OK;
> > + } else if (retval == ERROR_ALREADY_ASSIGNED) {
> > + g_debug ("map_drive already asigned");
> > + return MAP_DRIVE_TRY_AGAIN;
> > + } else {
> > + g_critical ("map_drive error %d", retval);>
> P: Is it critical enough to exit the program? I would use g_warning
> L: g_critical doesnt exit the program, but no other error then ALREADY_ASIGNED should happen here
It depends on env setting, see
https://developer.gnome.org/glib/stable/glib-Message-Logging.html#g-cri
tical
Also consider that there is no g_critical in currect codebase
> > + return MAP_DRIVE_ERROR;
> > + }
> > +}
> > +
> > +static void
> > +map_drive_cb(GTask *task,
> > + gpointer source_object,
> > + gpointer task_data,
> > + GCancellable *cancellable)
> > +{
> > + guint32 timeout = 500; //half a second
> > + GCancellable * cancel_map = task_data;
> > + GPollFD cancel_pollfd;
> > +
> > + if (!g_cancellable_make_pollfd (cancel_map, &cancel_pollfd))
> > + {
> > + g_critical ("GPollFD failed to create.");>
> P: critical/warning
> L: See ^
>
> > + return;
> > + }
> > +
> > + if (g_poll (&cancel_pollfd, 1, timeout) <= 0)
> > + {
> > + while (TRUE)
> > + {
> > + if ((drive_letter = get_free_drive_letter ()) == 0)>
> P: I would move assignment from the condition
> L: Ok will change>
> > + {
> > + g_critical ("all drive letters already assigned.");>
> P: critical/warning
> L: Warning might be better here
> > + break;
> > + }
> > +
> > + if (map_drive () != MAP_DRIVE_TRY_AGAIN)
> > + break;
> > + }
> > +
> > + //TODO: Rename network drive after mapping>
> P: Can you please add more info? What is the name ?
> L: Sure
>
> > + }
> > +
> > + g_cancellable_release_fd (cancel_map);
> > + return;
> > +}
> > +#endif
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20160318/4434d303/attachment.html>
More information about the Spice-devel
mailing list