View Issue Details

IDProjectCategoryView StatusLast Update
0000325Double CommanderFile operationspublic2014-01-14 22:52
ReporterVaka2 Assigned ToAlexx2000  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
ProjectionnoneETAnone 
Product Version0.6.0 (trunk)Product Build4282 
Target Version0.5.5Fixed in Version0.5.5 
Summary0000325: Внесите патч для uam
Descriptionподробнее тут
http://doublecmd.sourceforge.net/forum/viewtopic.php?f=10&t=1194


Если на компе нету udisks,
а вместо них используется uam и pmount.

Патч немного костыльный.. но уж лучше пока так..

вот сам патч для версии 0.5.5 4282

TagsNo tags attached.
Attached Files
udrivewatcher.pas.patch (2,676 bytes)   
--- ./udrivewatcher.pas	2012-02-07 09:53:25.000000000 +0400
+++ ./udrivewatcher.pas	2012-02-07 12:30:39.000000000 +0400
@@ -708,6 +708,7 @@
   DeviceFile: String;
   MountPoint: String;
   HandledByUDisks: Boolean = False;
+  HaveUAM: Boolean = False;
 begin
   Result := TDrivesList.Create;
   try
@@ -717,6 +718,9 @@
     if IsUDisksAvailable then
       HaveUDisksDevices := uUDisks.EnumerateDevices(UDisksDevices);
 
+    // fix me. If uam installed, usb and mmc mounted automatic.
+    HaveUAM := (fpSystemStatus('stat -c %s /lib/udev/uam/find-helper.sh > /dev/null') = 0);
+
     // Storage devices have to be in fstab or mtab and reported by UDisks.
     for I:= Low(MntEntFileList) to High(MntEntFileList) do
     begin
@@ -795,12 +799,27 @@
                 DriveLabel := Path;
                 FileSystem := StrPas(pme^.mnt_type);
 
-                if IsPartOfString(['ISO9660', 'CDROM', 'CDRW', 'DVD'], UpperCase(FileSystem)) then
+                IsMounted:= False; // Checked via mtab below.
+                if IsPartOfString(['ISO9660', 'CDROM', 'CDRW', 'DVD'], UpperCase(FileSystem)) then // for external usb cdrom and dvd
+                  begin
+                    DriveType := dtOptical;
+                    if HaveUAM then
+                      IsMounted:= True;
+                  end else
+                if IsPartOfString(['ISO9660', 'CDROM', 'CDRW', 'DVD'], UpperCase(DeviceFile)) then
                   DriveType := dtOptical else
                 if IsPartOfString(['FLOPPY'], UpperCase(FileSystem)) then
                   DriveType := dtFloppy else
+                if IsPartOfString(['FLOPPY', '/DEV/FD'], UpperCase(DeviceFile)) then
+                  DriveType := dtFloppy else
                 if IsPartOfString(['ZIP', 'USB', 'CAMERA'], UpperCase(FileSystem)) then
                   DriveType := dtFlash else
+                if IsPartOfString(['/MEDIA/'], UpperCase(MountPoint)) then
+                  begin
+                    DriveType := dtFlash;
+                    if HaveUAM then
+                      IsMounted:= True;
+                  end else
                 if IsPartOfString(['NFS', 'SMB', 'NETW', 'CIFS'], UpperCase(FileSystem)) then
                   DriveType := dtNetwork
                 else
@@ -809,7 +828,6 @@
                 IsMediaAvailable:= True;
                 IsMediaEjectable:= (DriveType = dtOptical);
                 IsMediaRemovable:= DriveType in [dtFloppy, dtOptical, dtFlash];
-                IsMounted:= False; // Checked via mtab below.
               end;
             end
             // Mark drive as mounted if found in mtab.
udrivewatcher.pas.patch (2,676 bytes)   
drivewatcher.test.patch (1,965 bytes)   
Index: udrivewatcher.pas
===================================================================
--- udrivewatcher.pas	(revision 4284)
+++ udrivewatcher.pas	(working copy)
@@ -795,12 +795,18 @@
                 DriveLabel := Path;
                 FileSystem := StrPas(pme^.mnt_type);
 
-                if IsPartOfString(['ISO9660', 'CDROM', 'CDRW', 'DVD'], UpperCase(FileSystem)) then
+                if IsPartOfString(['ISO9660', 'CDROM', 'CDRW', 'DVD'], UpperCase(FileSystem)) then // for external usb cdrom and dvd
+                    DriveType := dtOptical else
+                if IsPartOfString(['ISO9660', 'CDROM', 'CDRW', 'DVD'], UpperCase(DeviceFile)) then
                   DriveType := dtOptical else
                 if IsPartOfString(['FLOPPY'], UpperCase(FileSystem)) then
                   DriveType := dtFloppy else
+                if IsPartOfString(['FLOPPY', '/DEV/FD'], UpperCase(DeviceFile)) then
+                  DriveType := dtFloppy else
                 if IsPartOfString(['ZIP', 'USB', 'CAMERA'], UpperCase(FileSystem)) then
                   DriveType := dtFlash else
+                if IsPartOfString(['/MEDIA/'], UpperCase(MountPoint)) then
+                    DriveType := dtFlash else
                 if IsPartOfString(['NFS', 'SMB', 'NETW', 'CIFS'], UpperCase(FileSystem)) then
                   DriveType := dtNetwork
                 else
@@ -809,7 +815,9 @@
                 IsMediaAvailable:= True;
                 IsMediaEjectable:= (DriveType = dtOptical);
                 IsMediaRemovable:= DriveType in [dtFloppy, dtOptical, dtFlash];
-                IsMounted:= False; // Checked via mtab below.
+                // If drive from /etc/mtab then it is mounted
+                // else it will be checked via mtab below
+                IsMounted:= (MntEntFileList[I] = _PATH_MOUNTED);
               end;
             end
             // Mark drive as mounted if found in mtab.
drivewatcher.test.patch (1,965 bytes)   
Fixed in Revision4288
Operating systemLinux
Widgetset
Architecture

Activities

Alexx2000

2012-02-07 15:19

administrator   ~0000343

Насколько я понимаю uam не обновляет файл /etc/mtab при автомонтировании?

Vaka2

2012-02-07 16:05

reporter   ~0000347

uam прекрасно обновляет mtab при втыкании флешки и монтирует её в /media.
а вот dc ищет в массиве Result, который составляется из fstab.

            // Mark drive as mounted if found in mtab.
            else if MntEntFileList[I] = _PATH_MOUNTED then
            begin
              ExistingDrive := GetDrive(Result, DeviceFile, MountPoint);

здесь ExistingDrive пустой. соответственно флешка не помечается как примонтированная, хотя появляется в списке. при нажатии пкм на ней выводится "Смонтировать".

можно как-то изменить функцию проверки установки uam, но я не нашел лучшего решения..

Alexx2000

2012-02-07 19:12

administrator   ~0000348

Если mtab обновляется, значит ошибка в текущей реализации, т.к. DC должен корректно определять подключенные и смонтированные устройства на основании записей в fstab и mtab, в не зависимости от используемой системы автомонтирования.

А замена строки 812
с
  IsMounted:= False;
на
  IsMounted:= (MntEntFileList[I] = _PATH_MOUNTED);

не решит проблему?

Vaka2

2012-02-07 19:54

reporter   ~0000351

Last edited: 2012-02-07 19:58

да, так считает, что уже примонтировано.
но,
1. при отмонтировании не отмонтируется, пишет :
umount: /media/FLASH не примонтирован (согласно mtab)

2. Иконки у дисков стали все одинаковые, как у hd.
нужно оставить разбор дисков на dtOptical dtFloppy dtFlash

Alexx2000

2012-02-08 07:58

administrator   ~0000352

Попробуйте модифицированную версию патча (drivewatcher.test.patch).

Вот только считать диск смонтированный в '/MEDIA/' флешкой не совсем корректно, это может быть и стационарный жесткий диск.

Vaka2

2012-02-08 08:44

reporter   ~0000354

Да, проверил ваш патч.
всё в порядке.
1. флешку считает примонтированной.
2. отмонтировывает.
3. иконки какие надо.

коммите ! :)

Vaka2

2012-02-08 19:36

reporter   ~0000358

Добавьте ещё 'UDF' в определение дисков . это для Video-DVD
чтобы иконка у dvdrom была как у cd, а не у винта.

+ if IsPartOfString(['ISO9660', 'CDROM', 'CDRW', 'DVD', 'UDF'], UpperCase(FileSystem)) then // for external usb cdrom and dvd

Issue History

Date Modified Username Field Change
2012-02-07 14:02 Vaka2 New Issue
2012-02-07 14:02 Vaka2 File Added: udrivewatcher.pas.patch
2012-02-07 15:19 Alexx2000 Note Added: 0000343
2012-02-07 15:19 Alexx2000 Status new => feedback
2012-02-07 16:05 Vaka2 Note Added: 0000347
2012-02-07 16:05 Vaka2 Status feedback => new
2012-02-07 19:12 Alexx2000 Note Added: 0000348
2012-02-07 19:12 Alexx2000 Assigned To => Alexx2000
2012-02-07 19:12 Alexx2000 Status new => feedback
2012-02-07 19:54 Vaka2 Note Added: 0000351
2012-02-07 19:54 Vaka2 Status feedback => assigned
2012-02-07 19:55 Vaka2 Note Edited: 0000351
2012-02-07 19:58 Vaka2 Note Edited: 0000351
2012-02-08 07:56 Alexx2000 File Added: drivewatcher.test.patch
2012-02-08 07:58 Alexx2000 Note Added: 0000352
2012-02-08 07:58 Alexx2000 Status assigned => feedback
2012-02-08 07:59 Alexx2000 Target Version => 0.5.5
2012-02-08 08:44 Vaka2 Note Added: 0000354
2012-02-08 08:44 Vaka2 Status feedback => assigned
2012-02-08 19:36 Vaka2 Note Added: 0000358
2012-02-09 07:58 Alexx2000 Fixed in Revision => 4288
2012-02-09 07:58 Alexx2000 Status assigned => resolved
2012-02-09 07:58 Alexx2000 Fixed in Version => 0.5.5
2012-02-09 07:58 Alexx2000 Resolution open => fixed
2014-01-14 22:52 Alexx2000 Status resolved => closed