bug #1283: autofs'mount'ed drives ignored (e.g. "A:" on /vol/a via autofs master.vol)

Guido Draheim guidod-2003- at gmx.de
Thu Jun 26 15:05:42 CDT 2003


patch regenerated due to changes in cvs.
please bla bla bla, whatever.

bcc sent to selected wine rpm makers, if you are not yet
on my bcc list, please contact me, thank you, -- guidod

Guido Draheim schrieb:
> Patch regenerated - there's been a two line offset
> in documentation/configuring.sgml - three files affected:
> 
> $ patch -p0 < ../wine-vol-a/wine-20030420-autofs.patch
> patching file documentation/configuring.sgml
> patching file documentation/samples/config
> patching file files/drive.c
> 
> It's the six month anniversary of this patch and also
> two months after   Tony Lambregts   did kindly help me
> to clean this patch up ready for acceptance. -- guido
> 
> Guido Draheim schrieb:
> 
>> The following text is a shortened description of
>> the bug - a long description, screenshots and patches
>> can be found at
>>
>>      http://freespace.sf.net/guidod/wine-vol-a/
>>
>> further (lengthy) comments can be found in the bugzilla
>> logs where Tony Lambregts was kindly reviewing and
>> accepting the patch:
>>
>>      http://bugs.winehq.com/show_bug.cgi?id=1283
>>
>> The problem:
>>    If there is no medium in a autofs mounted floppy
>>    drive at startup of wine, then files on the floppy
>>    are inaccessible even when a medium is inserted later.
>>
>> The diagnosis:
>>    The DRIVE_Init will throw away any mount-point that
>>    does not exist at startup time - it does not make
>>    it to the internal drive. It will not check later
>>    whether the mount-point came into existance somewhen
>>    in between - you need to restart
>>
>> The real way:
>>    There is no need to keep this behaviour, the wine's
>>    drive access method can handle it that a mount-point
>>    is removed somewhere in between: it prints warning
>>    messages and continues to work properly. This is
>>    partly the windowish way: just say the drive is
>>    inaccessible as warning during runtime, do not
>>    kill it beforehand.
>>
>> The patch:
>>    A .wine/config boolean option "AutoMount" is introduced
>>    that will default to the old behavior. When being
>>    enabled then a warning-message logged but the drive
>>    is kept in the internal drivelist and can be seen in
>>    the file-open dialog-box.
>>
>> At the moment, applications work properly with wine cvs
>> but we still need to patch the sources like that to make
>> it useable for us.
>>
>> cheers, guido                   counter.li.org #81555
>>
> 
> ------------------------------------------------------------------------
> 
> Index: documentation/configuring.sgml
> ===================================================================
> RCS file: /home/wine/wine/documentation/configuring.sgml,v
> retrieving revision 1.25
> diff -u -r1.25 configuring.sgml
> --- documentation/configuring.sgml	19 Apr 2003 02:50:57 -0000	1.25
> +++ documentation/configuring.sgml	20 Apr 2003 11:52:56 -0000
> @@ -463,6 +463,16 @@
>  	    linkend="config-drive-main">Wine file system layer
>  	    configuration section</link>.
>            </para>
> +	  <para>
> +	    <programlisting>"Automount" = "1"</programlisting>
> +	    This option is useful with some automounters (e.g. 
> +	    "autofs" in Linux). These will only create the path 
> +	    when the target is accessible, e.g. a medium is 
> +	    inserted ("Type" = "cdrom|floppy") or the network share 
> +	    reachable. If this option is present and non-zero then 
> +	    the drive X is accepted with the given path/type/device 
> +	    even when the "Path" is not existant during startup.
> +	  </para>
>            <para>
>              <programlisting>"GraphicsDriver" = "x11drv|ttydrv"</programlisting>
>    	    Sets the graphics driver to use for Wine output.
> Index: documentation/samples/config
> ===================================================================
> RCS file: /home/wine/wine/documentation/samples/config,v
> retrieving revision 1.43
> diff -u -r1.43 config
> --- documentation/samples/config	7 Apr 2003 23:27:54 -0000	1.43
> +++ documentation/samples/config	20 Apr 2003 11:52:56 -0000
> @@ -21,6 +21,7 @@
>  ;;   - "msdos" for FAT16 (ugly, upgrading to VFAT driver strongly recommended)
>  ;;   DON'T use "unix" unless you intend to port programs using Winelib !
>  ;; "Device"="/dev/xx" (only if you want to allow raw device access)
> +;; "Automount"="x" "1"= Drive is Automounted by native file system
>  ;;
>  [Drive A]
>  "Path" = "/mnt/fd0"
> @@ -29,6 +30,7 @@
>  "Filesystem" = "win95"
>  "Serial" = "87654321"
>  "Device" = "/dev/fd0"
> +;"Automount" = "1"
>  
>  [Drive C]
>  "Path" = "/c"
> Index: files/drive.c
> ===================================================================
> RCS file: /home/wine/wine/files/drive.c,v
> retrieving revision 1.89
> diff -u -r1.89 drive.c
> --- files/drive.c	19 Apr 2003 02:48:34 -0000	1.89
> +++ files/drive.c	20 Apr 2003 11:53:00 -0000
> @@ -204,6 +204,7 @@
>      static const WCHAR ReadVolInfoW[] = {'R','e','a','d','V','o','l','I','n','f','o',0};
>      static const WCHAR FailReadOnlyW[] = {'F','a','i','l','R','e','a','d','O','n','l','y',0};
>      static const WCHAR driveC_labelW[] = {'D','r','i','v','e',' ','C',' ',' ',' ',' ',0};
> +    static const WCHAR AutoMountW[] = {'A','u','t','o','M','o','u','n','t',0};
>  
>      for (i = 0, drive = DOSDrives; i < MAX_DOS_DRIVES; i++, name[6]++, drive++)
>      {
> @@ -235,15 +236,24 @@
>                  WideCharToMultiByte(drive->codepage, 0, path, -1, drive->root + strlen(drive->root), len, NULL, NULL);
>              }
>  
> -            if (stat( drive->root, &drive_stat_buffer ))
> +            if (stat( drive->root, &drive_stat_buffer )) 
>              {
> -                MESSAGE("Could not stat %s (%s), ignoring drive %c:\n",
> -                        drive->root, strerror(errno), 'A' + i);
> -                HeapFree( GetProcessHeap(), 0, drive->root );
> -                drive->root = NULL;
> -                continue;
> +                if (PROFILE_GetWineIniBool (name, AutoMountW, 0))
> +                {
> +                    MESSAGE("Could not stat %s (%s), keeping automount drive %c:\n",
> +                            drive->root, strerror(errno), 'A' + i);
> +                    /* never match in DRIVE_FindDriveRoot */
> +                    drive_stat_buffer.st_dev = 0;
> +                    drive_stat_buffer.st_ino = 0;
> +                }else{
> +                    MESSAGE("Could not stat %s (%s), ignoring drive %c:\n",
> +                            drive->root, strerror(errno), 'A' + i);
> +                    HeapFree( GetProcessHeap(), 0, drive->root );
> +                    drive->root = NULL;
> +                    continue;
> +                }
>              }
> -            if (!S_ISDIR(drive_stat_buffer.st_mode))
> +            else if (!S_ISDIR(drive_stat_buffer.st_mode))
>              {
>                  MESSAGE("%s is not a directory, ignoring drive %c:\n",
>                          drive->root, 'A' + i );

-- 
-- guido                                  http://google.de/search?q=guidod
GCS/E/S/P C++/++++$ ULHS L++w- N++@ d(+-) s+a- r+@>+++ y++ 5++X- (geekcode)
-------------- next part --------------
Index: documentation/configuring.sgml
===================================================================
RCS file: /home/wine/wine/documentation/configuring.sgml,v
retrieving revision 1.26
diff -u -r1.26 configuring.sgml
--- documentation/configuring.sgml	6 May 2003 18:36:09 -0000	1.26
+++ documentation/configuring.sgml	26 Jun 2003 19:53:15 -0000
@@ -470,6 +470,16 @@
 	    linkend="config-drive-main">Wine file system layer
 	    configuration section</link>.
           </para>
+	  <para>
+	    <programlisting>"Automount" = "1"</programlisting>
+	    This option is useful with some automounters (e.g. 
+	    "autofs" in Linux). These will only create the path 
+	    when the target is accessible, e.g. a medium is 
+	    inserted ("Type" = "cdrom|floppy") or the network share 
+	    reachable. If this option is present and non-zero then 
+	    the drive X is accepted with the given path/type/device 
+	    even when the "Path" is not existant during startup.
+	  </para>
           <para>
             <programlisting>"GraphicsDriver" = "x11drv|ttydrv"</programlisting>
   	    Sets the graphics driver to use for Wine output.
Index: documentation/samples/config
===================================================================
RCS file: /home/wine/wine/documentation/samples/config,v
retrieving revision 1.45
diff -u -r1.45 config
--- documentation/samples/config	7 Jun 2003 00:36:18 -0000	1.45
+++ documentation/samples/config	26 Jun 2003 19:53:16 -0000
@@ -21,6 +21,7 @@
 ;;   - "msdos" for FAT16 (ugly, upgrading to VFAT driver strongly recommended)
 ;;   DON'T use "unix" unless you intend to port programs using Winelib !
 ;; "Device"="/dev/xx" (only if you want to allow raw device access)
+;; "Automount"="x" "1"= Drive is Automounted by native file system
 ;;
 [Drive A]
 "Path" = "/mnt/fd0"
@@ -29,6 +30,7 @@
 "Filesystem" = "win95"
 "Serial" = "87654321"
 "Device" = "/dev/fd0"
+;"Automount" = "1"
 
 [Drive C]
 "Path" = "/c"
Index: files/drive.c
===================================================================
RCS file: /home/wine/wine/files/drive.c,v
retrieving revision 1.90
diff -u -r1.90 drive.c
--- files/drive.c	4 Jun 2003 20:17:52 -0000	1.90
+++ files/drive.c	26 Jun 2003 19:53:19 -0000
@@ -204,6 +204,7 @@
     static const WCHAR ReadVolInfoW[] = {'R','e','a','d','V','o','l','I','n','f','o',0};
     static const WCHAR FailReadOnlyW[] = {'F','a','i','l','R','e','a','d','O','n','l','y',0};
     static const WCHAR driveC_labelW[] = {'D','r','i','v','e',' ','C',' ',' ',' ',' ',0};
+    static const WCHAR AutoMountW[] = {'A','u','t','o','M','o','u','n','t',0};
 
     for (i = 0, drive = DOSDrives; i < MAX_DOS_DRIVES; i++, name[6]++, drive++)
     {
@@ -235,15 +236,24 @@
                 WideCharToMultiByte(drive->codepage, 0, path, -1, drive->root + strlen(drive->root), len, NULL, NULL);
             }
 
-            if (stat( drive->root, &drive_stat_buffer ))
+            if (stat( drive->root, &drive_stat_buffer )) 
             {
-                MESSAGE("Could not stat %s (%s), ignoring drive %c:\n",
-                        drive->root, strerror(errno), 'A' + i);
-                HeapFree( GetProcessHeap(), 0, drive->root );
-                drive->root = NULL;
-                continue;
+                if (PROFILE_GetWineIniBool (name, AutoMountW, 0))
+                {
+                    MESSAGE("Could not stat %s (%s), keeping automount drive %c:\n",
+                            drive->root, strerror(errno), 'A' + i);
+                    /* never match in DRIVE_FindDriveRoot */
+                    drive_stat_buffer.st_dev = 0;
+                    drive_stat_buffer.st_ino = 0;
+                }else{
+                    MESSAGE("Could not stat %s (%s), ignoring drive %c:\n",
+                            drive->root, strerror(errno), 'A' + i);
+                    HeapFree( GetProcessHeap(), 0, drive->root );
+                    drive->root = NULL;
+                    continue;
+                }
             }
-            if (!S_ISDIR(drive_stat_buffer.st_mode))
+            else if (!S_ISDIR(drive_stat_buffer.st_mode))
             {
                 MESSAGE("%s is not a directory, ignoring drive %c:\n",
                         drive->root, 'A' + i );


More information about the wine-patches mailing list