X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=src%2Flibcaptive%2Fclient%2Flib.c;h=01bc7bf05542cfdae74befc3158ccb49f757916c;hb=a2dd38f86df22c46ae18f3ad7d9850eaacb02b92;hp=da2d5d737952dda5393a520c8e8487ef968e1f91;hpb=ac28659efaaf1cdc02581d54ea3813d8dfc998ab;p=captive.git diff --git a/src/libcaptive/client/lib.c b/src/libcaptive/client/lib.c index da2d5d7..01bc7bf 100644 --- a/src/libcaptive/client/lib.c +++ b/src/libcaptive/client/lib.c @@ -87,6 +87,7 @@ GnomeVFSResult captive_ObjectAttributes_init(const gchar *pathname,OBJECT_ATTRIB { gchar *w32_path,*s,*d; const gchar *media_root; +gchar *pathname_normalized; g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(ObjectAttributes!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); @@ -101,6 +102,8 @@ const gchar *media_root; * and later IopCreateFile() would not consider it FO_DIRECT_DEVICE_OPEN (e.g. w/o any direct mount!). * On the other side it will somehow get managed automatically and it works even * without the trailing "\\." for root directory open - don't ask me why. :-) + * Tested: \\Device\\CaptiveHarddisk0\\. FAIL + * \\Device\\CaptiveHarddisk0\\ OK */ switch (captive_options->media) { case CAPTIVE_OPTION_MEDIA_CDROM: media_root="\\Device\\CdRom0"; break; /* libcaptive/storage/cdrom.c */ @@ -110,8 +113,10 @@ const gchar *media_root; media_root=""; } + pathname_normalized=captive_path_normalize(pathname); w32_path=(gchar *)/* de-const it as we can modify it but we must not free() it */ - captive_printf_alloca("%s\\%s",media_root,pathname); + captive_printf_alloca("%s\\%s",media_root,pathname_normalized); + g_free(pathname_normalized); /* translate '/' -> '\' */ for (s=w32_path;(s=strchr(s,'/'));s++) *s='\\'; @@ -129,3 +134,24 @@ const gchar *media_root; return GNOME_VFS_OK; } + + +void captive_giochannel_setup(GIOChannel *giochannel) +{ +GIOStatus erriostatus; + + g_return_if_fail(giochannel!=NULL); + + if (g_io_channel_get_encoding(giochannel)) { + if (!g_io_channel_get_buffered(giochannel)) /* Prevent: Need to have NULL encoding to set the buffering state ... */ + g_io_channel_set_buffered(giochannel,TRUE); /* Prevent: Need to set the channel buffered before setting the encoding. */ + erriostatus=g_io_channel_set_encoding(giochannel, + NULL, /* encoding; force binary data */ + NULL); /* error */ + g_assert(erriostatus==G_IO_STATUS_NORMAL); + } + erriostatus=g_io_channel_flush(giochannel, + NULL); /* error */ + g_assert(erriostatus==G_IO_STATUS_NORMAL); + g_io_channel_set_buffered(giochannel,FALSE); +}