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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux