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

Guido Draheim guidod-2003- at gmx.de
Sun Apr 20 07:18:07 CDT 2003


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
> 
-------------- next part --------------
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 );


More information about the wine-patches mailing list