summaryrefslogtreecommitdiff
path: root/x11-fm/4pane/files/patch-Devices.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'x11-fm/4pane/files/patch-Devices.cpp')
-rw-r--r--x11-fm/4pane/files/patch-Devices.cpp342
1 files changed, 342 insertions, 0 deletions
diff --git a/x11-fm/4pane/files/patch-Devices.cpp b/x11-fm/4pane/files/patch-Devices.cpp
new file mode 100644
index 000000000000..8866393bd213
--- /dev/null
+++ b/x11-fm/4pane/files/patch-Devices.cpp
@@ -0,0 +1,342 @@
+--- Devices.cpp.orig 2020-11-22 11:42:51 UTC
++++ Devices.cpp
+@@ -1357,7 +1357,7 @@ if (!wxFileExists(BLKID))
+ if (wxFileExists(wxT("/usr/bin/blkid"))) BLKID = wxT("/usr/bin/blkid");
+ else
+ { wxArrayString output, errors;long ans;
+- if (wxGetOsDescription().Contains(wxT("kFreeBSD"))) // The kFreeBSD forkpty hangs
++ if (wxGetOsDescription().Contains(wxT("FreeBSD"))) // FreeBSD's forkpty() hangs
+ ans = wxExecute(wxT("which blkid"), output, errors);
+ else
+ ans = ExecuteInPty(wxT("which blkid"), output, errors);
+@@ -1371,7 +1371,7 @@ if (!wxFileExists(LSBLK))
+ if (wxFileExists(wxT("/sbin/lsblk"))) LSBLK = wxT("/sbin/lsblk");
+ else
+ { wxArrayString output, errors; long ans;
+- if (wxGetOsDescription().Contains(wxT("kFreeBSD")))
++ if (wxGetOsDescription().Contains(wxT("FreeBSD")))
+ ans = wxExecute(wxT("which lsblk"), output, errors);
+ else
+ ans = ExecuteInPty(wxT("which lsblk"), output, errors);
+@@ -1590,14 +1590,22 @@ bool DeviceAndMountManager::Checkmtab(wxString& mountp
+ return DeviceAndMountManager::GnuCheckmtab(mountpoint, device);
+ #endif
+
++#ifdef __linux__
+ struct mntent* mnt = NULL;
+
+ FILE* fmp = setmntent (_PATH_MOUNTED, "r"); // Get a file* to (probably) /etc/mtab
+ if (fmp==NULL) return false;
++#else
++struct statfs* fslist;
+
++int numfs = getmntinfo(&fslist, MNT_NOWAIT);
++if (numfs < 1) return false;
++#endif
++
+ wxString mountpt(mountpoint); FileData mp(mountpt);
+ if (mp.IsSymlink()) mountpt = mp.GetUltimateDestination(); // Cope with a symlink
+
++#ifdef __linux__
+ while (1) // For every mtab entry
+ { mnt = getmntent(fmp); // Get a struct representing a mounted partition
+ if (mnt == NULL)
+@@ -1605,14 +1613,24 @@ while (1)
+
+ wxString mntdir(mnt->mnt_dir, wxConvUTF8);
+ wxString type(mnt->mnt_type, wxConvUTF8); type.MakeLower();
++#else
++for (int i = 0; i < numfs; ++i)
++ { wxString mntdir(fslist[i].f_mntonname, wxConvUTF8);
++ wxString type(fslist[i].f_fstypename, wxConvUTF8); type.MakeLower();
++#endif
+ // Don't try to create a FileData if we're testing a network mount. It's less likely to be symlinked, and e.g. a stale nfs mount hangs lstat!
+ if (!type.StartsWith(wxT("nfs")) && !type.Contains(wxT("sshfs")) && type != wxT("cifs") && type != wxT("smbfs"))
+ { FileData mt(mntdir); if (mt.IsSymlink()) mntdir = mt.GetUltimateDestination(); } // Cope with a symlink
+ if (mntdir == mountpt) // This is the one we're looking for
++#ifdef __linux__
+ { endmntent(fmp);
+ if (device.IsEmpty()) return true; // If we don't care which device is mounted there
+
+ wxString mntfsname(mnt->mnt_fsname, wxConvUTF8); // in case we DO care
++#else
++ { if (device.IsEmpty()) return true;
++ wxString mntfsname(fslist[i].f_mntfromname, wxConvUTF8);
++#endif
+ FileData dev(device); FileData mntfs(mntfsname); // Cope with any symlinks
+ if (dev.IsSymlink()) device = dev.GetUltimateDestination();
+ if (mntfs.IsSymlink()) mntfsname = mntfs.GetUltimateDestination();
+@@ -1649,6 +1667,7 @@ wxString DeviceAndMountManager::WhereIsDeviceMounted(w
+
+ wxString DeviceAndMountManager::WhereIsDeviceMounted(wxString device, size_t type)
+ {
++#ifdef __linux__
+ struct mntent* mnt = NULL;
+
+ FILE* fmp = setmntent (_PATH_MOUNTED, "r"); // Get a file* to (probably) /etc/mtab
+@@ -1660,6 +1679,17 @@ while (1)
+ wxString mntfsname(mnt->mnt_fsname, wxConvUTF8);
+ if (mntfsname == device)
+ { endmntent(fmp); return wxString(mnt->mnt_dir, wxConvUTF8); } // If it's the one we're looking for, return the associated mountpt
++#else
++struct statfs* fslist;
++
++int numfs = getmntinfo(&fslist, MNT_NOWAIT);
++if (numfs < 1) return wxEmptyString;
++
++for (int i = 0; i < numfs; ++i)
++ { wxString mntfsname(fslist[i].f_mntfromname, wxConvUTF8);
++ if (mntfsname == device)
++ return wxString(fslist[i].f_mntonname, wxConvUTF8);
++#endif
+ }
+
+ // If we're here, the device wasn't found. See if it's actually a symlink for a different device eg /dev/dvd -> /dev/hdc. If so, try that
+@@ -1678,17 +1708,27 @@ return wxEmptyString;
+ }
+
+ //static
++#ifdef __linux__
+ struct mntent* DeviceAndMountManager::ReadMtab(const wxString& partition, bool DvdRamFS /*=false*/) // Is 'partition' currently mounted? Returns struct of data if it is, NULL if it isn't
+ {
+ struct mntent* mnt = NULL;
+
+ FILE* fmp = setmntent (_PATH_MOUNTED, "r"); // Get a file* to (probably) /etc/mtab
+ if (fmp==NULL) return mnt;
++#else
++struct statfs* DeviceAndMountManager::ReadMtab(const wxString& partition, bool DvdRamFS /*=false*/)
++{
++struct statfs* fslist;
+
++int numfs = getmntinfo(&fslist, MNT_NOWAIT);
++if (numfs < 1) return NULL;
++#endif
++
+ wxString partitionwithsep(partition), partitionwithout(partition); // Avoid the usual '/' issue
+ if (partition.Right(1) == wxFILE_SEP_PATH) partitionwithout = partition.BeforeLast(wxFILE_SEP_PATH);
+ else partitionwithsep << wxFILE_SEP_PATH;
+
++#ifdef __linux__
+ while (1) // For every mtab entry
+ { mnt = getmntent(fmp); // Get a struct representing a mounted partition
+ if (mnt == NULL) break; // If it's null, we've run out of candidates. Return null as flag
+@@ -1706,6 +1746,22 @@ mnt = NULL; return mnt;
+ if (stat.IsSymlink()) { wxString target = stat.GetSymlinkDestination(); return ReadMtab(target, DvdRamFS); }
+
+ mnt = NULL; return mnt; // If we're here, it failed. Return null as flag
++#else
++for (int i = 0; i < numfs; ++i)
++ { wxString mntfsname(fslist[i].f_mntfromname, wxConvUTF8);
++ if (!mntfsname.empty() && ((mntfsname == partitionwithsep) || (mntfsname == partitionwithout)))
++ { if (!DvdRamFS) return &fslist[i];
++ wxString mnttype(fslist[i].f_fstypename, wxConvUTF8);
++ for (size_t n=0; n < RealFilesystemsArray.GetCount(); ++n)
++ if (mnttype.Left(3) == RealFilesystemsArray.Item(n).Left(3)) return &fslist[i];
++ }
++ }
++FileData stat(partition);
++if (stat.IsSymlink())
++ { wxString target = stat.GetSymlinkDestination();
++ return ReadMtab(target, DvdRamFS);
++ } else return NULL;
++#endif
+ }
+
+
+@@ -1887,14 +1943,25 @@ if (!FillPartitionArrayUsingLsblk(true))
+ { pstruct->mountpt = wxString(fs->fs_file, wxConvUTF8); // Store the mountpt
+ pstruct->IsMounted = Checkmtab(pstruct->mountpt, pstruct->device);// & whether it's mounted. Pass the device-name too, so that we only record if the mountpt contains THIS device
+ if (!pstruct->IsMounted) // If it isn't mounted where it's supposed to be, look elsewhere in case it was su-mounted in the 'wrong' place
++#ifdef __linux__
+ { struct mntent* mnt = ReadMtab(pstruct->device);
+ if (mnt != NULL) { pstruct->mountpt = wxString(mnt->mnt_dir, wxConvUTF8); pstruct->IsMounted = true; }
++#else
++ { struct statfs* mnt = ReadMtab(pstruct->device);
++ if (mnt != NULL) { pstruct->mountpt = wxString(mnt->f_mntonname, wxConvUTF8); pstruct->IsMounted = true; }
++#endif
+ }
+ }
+ else // If we didn't find it in fstab, check mtab anyway, in case someone mounted it the hard way
++#ifdef __linux__
+ { struct mntent* mnt = ReadMtab(pstruct->device);
+ if (mnt != NULL)
+ { pstruct->mountpt = wxString(mnt->mnt_dir, wxConvUTF8); // Store the mountpt
++#else
++ { struct statfs* mnt = ReadMtab(pstruct->device);
++ if (mnt != NULL)
++ { pstruct->mountpt = wxString(mnt->f_mntonname, wxConvUTF8);
++#endif
+ pstruct->IsMounted = true; // It's mounted by definition: it's in mtab
+ }
+ else pstruct->IsMounted = false; // Otherwise reset this bool, as it's otherwise undefined
+@@ -2027,6 +2094,7 @@ void DeviceAndMountManager::FindMountedImages() // Ad
+
+ void DeviceAndMountManager::FindMountedImages() // Add mounted iso-images from mtab to array
+ {
++#ifdef __linux__
+ FILE* fmp = setmntent (_PATH_MOUNTED, "r"); // Get a file* to (probably) /etc/mtab
+ if (fmp==NULL) return;
+
+@@ -2036,12 +2104,26 @@ while (1)
+ { endmntent(fmp); return; } // If it's null, we've finished mtab
+
+ wxString device(mnt->mnt_fsname, wxConvUTF8); // Make the 'device' into a wxString for convenience
++#else
++struct statfs* fslist;
++
++int numfs = getmntinfo(&fslist, MNT_NOWAIT);
++if (numfs < 1) return;
++
++for (int i = 0; i < numfs; ++i)
++ { wxString device(fslist[i].f_mntfromname, wxConvUTF8);
++#endif
+ // If it starts with a '/dev/loop' or with a '/' but not with /dev/ or // it's probably an iso-image
+ if ((device.Left(9) == wxT("/dev/loop")) || (device.GetChar(0) == wxT('/') &&
+ !(device.Left(5) == wxT("/dev/") || device.Left(2) == wxT("//"))))
+ { struct PartitionStruct* newmnt = new struct PartitionStruct; // store in structarray
++#ifdef __linux__
+ newmnt->device = wxString(mnt->mnt_fsname, wxConvUTF8);
+ newmnt->mountpt = wxString(mnt->mnt_dir, wxConvUTF8);
++#else
++ newmnt->device = wxString(fslist[i].f_mntfromname, wxConvUTF8);
++ newmnt->mountpt = wxString(fslist[i].f_mntonname, wxConvUTF8);
++#endif
+ newmnt->IsMounted = true; // By definition
+ PartitionArray->Add(newmnt);
+ }
+@@ -2153,6 +2235,7 @@ for (size_t n=0; n < partitions.GetCount(); ++n)
+ for (size_t n=0; n < partitions.GetCount(); ++n)
+ { wxString item = partitions.Item(n);
+ if (item == dev || item == symtarget)
++#ifdef __linux__
+ { struct mntent* mnt = NULL; // Found an entry. Look for it in mtab
+ FILE* fmp = setmntent (_PATH_MOUNTED, "r"); if (fmp==NULL) { endfsent(); return answerarray.GetCount() > 0; }
+ while (1)
+@@ -2166,6 +2249,16 @@ for (size_t n=0; n < partitions.GetCount(); ++n)
+ if (wxString(mnt->mnt_dir,wxConvUTF8) == mountpts.Item(n)) // but it's already mounted here
+ { endmntent(fmp); break; } // so look in 'partitions' array for another entry
+ }
++#else
++ { struct statfs* fslist;
++ int numfs = getmntinfo(&fslist, MNT_NOWAIT);
++ if (numfs < 1) return answerarray.GetCount() > 0;
++ for (int i = 0; i < numfs; ++i)
++ if (wxString(fslist[i].f_mntfromname, wxConvUTF8) == dev || wxString(fslist[i].f_mntfromname, wxConvUTF8) == symtarget)
++ if (wxString(fslist[i].f_mntonname, wxConvUTF8) == mountpts.Item(n)) goto another;
++ answerarray.Add(mountpts.Item(n));
++another:;
++#endif
+ }
+ }
+
+@@ -2921,8 +3014,13 @@ for (size_t n=0; n < allpartitions.GetCount(); ++n)
+ { if (allpartitions[n].Left(len) == dev.Left(len)) // If the 1st 'len' letters of the NAME bit of this partition match dev ie /dev/sda1 matches /dev/sda
+ { partitions.Add(allpartitions[n]); // store it in the real partition array
+
++#ifdef __linux__
+ struct mntent* mnt = ReadMtab(allpartitions[n]); // Now see if this partition is currently mounted
+ if (mnt != NULL) mountpts.Add(wxString(mnt->mnt_dir, wxConvUTF8)); // If so, store the mountpt
++#else
++ struct statfs* mnt = ReadMtab(allpartitions[n]);
++ if (mnt != NULL) mountpts.Add(wxString(mnt->f_mntonname, wxConvUTF8));
++#endif
+ else mountpts.Add(wxEmptyString); // Otherwise store ""
+ }
+ }
+@@ -2944,7 +3042,11 @@ wxTextFile file; //
+ void DeviceAndMountManager::CheckSupermountTab(wxArrayString& partitions, wxArrayString& mountpts, wxString dev, bool SearchMtab) // In Supermount systems, finds data for this device
+ {
+ wxTextFile file; // Create a textfile
++#ifdef __linux__
+ if (SearchMtab) file.Create(wxT(_PATH_MOUNTED)); // using mtab
++#else
++if (SearchMtab) return;
++#endif
+ else file.Create(wxT(_PATH_FSTAB)); // or fstab
+ if (!file.Exists()) return;
+ file.Open(); if (!file.IsOpened()) return;
+@@ -2971,17 +3073,27 @@ void DeviceAndMountManager::SearchMtab(wxArrayString&
+
+ void DeviceAndMountManager::SearchMtab(wxArrayString& partitions, wxArrayString& mountpts, wxString dev /*=wxEmptyString*/) // Loads arrays with data for the named device, or for all devices. NB Only finds mounted partitions
+ {
++#ifdef __linux__
+ struct mntent* mnt = NULL;
++#else
++struct statfs* fslist;
++#endif
+
+ partitions.Empty(); mountpts.Empty(); // Empty the arrays of any old data: we don't want to append!
+
++#ifdef __linux__
+ FILE* fmp = setmntent (_PATH_MOUNTED, "r"); // Get a file* to (probably) /etc/mtab
+ if (fmp==NULL) return;
++#else
++int numfs = getmntinfo(&fslist, MNT_NOWAIT);
++if (numfs < 1) return;
++#endif
+
+ wxString mask;
+ if (dev.IsEmpty()) mask = AUTOMOUNT_USB_PREFIX; // We normally search for all AUTOMOUNT_USB_PREFIX devices, probably "/dev/sd"
+ else mask = dev; // but if dev isn't empty, use this instead
+
++#ifdef __linux__
+ while (1) // For every mtab entry
+ { mnt = getmntent(fmp); // Get a struct representing a mounted partition
+ if (mnt == NULL) { endmntent(fmp); return; } // If it's null, we've run out of candidates
+@@ -2990,18 +3102,29 @@ while (1) //
+ if (wxString(mnt->mnt_fsname, wxConvUTF8).Left(mask.Len()) == mask)
+ { partitions.Add(wxString(mnt->mnt_fsname, wxConvUTF8)); // If so, store the devnode and mountpt
+ mountpts.Add(wxString(mnt->mnt_dir, wxConvUTF8));
++#else
++for (int i = 0; i < numfs; ++i)
++ { if (wxString(fslist[i].f_mntfromname, wxConvUTF8).Left(mask.Len()) == mask)
++ { partitions.Add(wxString(fslist[i].f_mntfromname, wxConvUTF8));
++ mountpts.Add(wxString(fslist[i].f_mntonname, wxConvUTF8));
++#endif
+ }
+ }
+ }
+
+ void DeviceAndMountManager::SearchMtabForStandardMounts(wxString& device, wxArrayString& mountpts) // Finds ext2 etc mountpts for the device ie not subfs. Used for DVD-RAM
+ {
++#ifdef __linux__
+ struct mntent* mnt = NULL;
++#else
++struct statfs* fslist;
++#endif
+ mountpts.Empty(); // Empty the array of any old data: we don't want to append!
+
+ wxString symtarget; FileData fd(device); // Beware of the symlink
+ if (fd.IsSymlink()) symtarget = fd.GetUltimateDestination();
+
++#ifdef __linux__
+ FILE* fmp = setmntent (_PATH_MOUNTED, "r"); // Get a file* to (probably) /etc/mtab
+ if (fmp==NULL) return;
+
+@@ -3012,12 +3135,26 @@ while (1) //
+ bool found = false;
+ if (wxString(mnt->mnt_fsname, wxConvUTF8).Left(device.Len()) == device) found=true; // See if this is a mount for the device we're interested in
+ else if (!symtarget.IsEmpty() && wxString(mnt->mnt_fsname, wxConvUTF8).Left(symtarget.Len()) == symtarget) found=true; // Try again with any symlink target
++#else
++int numfs = getmntinfo(&fslist, MNT_NOWAIT);
++if (numfs < 1) return;
+
++for (int i = 0; i < numfs; ++i)
++ { bool found = false;
++ if (wxString(fslist[i].f_mntfromname, wxConvUTF8).Left(device.Len()) == device) found=true;
++ else if (!symtarget.IsEmpty() && wxString(fslist[i].f_mntfromname, wxConvUTF8).Left(symtarget.Len()) == symtarget) found=true;
++#endif
++
+ if (!found) continue; // Wrong device
+
+ for (size_t n=0; n < RealFilesystemsArray.GetCount(); ++n) // For DVD-RAM, we're only interested in filesystems like ext2 not eg subfs
++#ifdef __linux__
+ if (wxString(mnt->mnt_type, wxConvUTF8).Left(3) == RealFilesystemsArray.Item(n).Left(3))
+ { mountpts.Add(wxString(mnt->mnt_dir, wxConvUTF8)); break; } // If the type is right, this mountpt is one we want to store
++#else
++ if (wxString(fslist[i].f_fstypename, wxConvUTF8).Left(3) == RealFilesystemsArray.Item(n).Left(3))
++ { mountpts.Add(wxString(fslist[i].f_mntonname, wxConvUTF8)); break; }
++#endif
+ }
+ }
+