|
@@ -35,10 +35,17 @@
|
|
#include <sys/statvfs.h>
|
|
#include <sys/statvfs.h>
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+#include "core/list.h"
|
|
#include "os/memory.h"
|
|
#include "os/memory.h"
|
|
#include "print_string.h"
|
|
#include "print_string.h"
|
|
#include <errno.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
|
|
+#include <stdlib.h>
|
|
|
|
+#include <string.h>
|
|
|
|
+
|
|
|
|
+#ifdef HAVE_MNTENT
|
|
|
|
+#include <mntent.h>
|
|
|
|
+#endif
|
|
|
|
|
|
DirAccess *DirAccessUnix::create_fs() {
|
|
DirAccess *DirAccessUnix::create_fs() {
|
|
|
|
|
|
@@ -176,13 +183,95 @@ void DirAccessUnix::list_dir_end() {
|
|
_cisdir = false;
|
|
_cisdir = false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef HAVE_MNTENT
|
|
|
|
+static bool _filter_drive(struct mntent *mnt) {
|
|
|
|
+ // Ignore devices that don't point to /dev
|
|
|
|
+ if (strncmp(mnt->mnt_fsname, "/dev", 4) != 0) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Accept devices mounted at /media, /mnt or /home
|
|
|
|
+ if (strncmp(mnt->mnt_dir, "/media", 6) == 0 ||
|
|
|
|
+ strncmp(mnt->mnt_dir, "/mnt", 4) == 0 ||
|
|
|
|
+ strncmp(mnt->mnt_dir, "/home", 5) == 0) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Ignore everything else
|
|
|
|
+ return false;
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+static void _get_drives(List<String> *list) {
|
|
|
|
+
|
|
|
|
+#ifdef HAVE_MNTENT
|
|
|
|
+ // Check /etc/mtab for the list of mounted partitions
|
|
|
|
+ FILE *mtab = setmntent("/etc/mtab", "r");
|
|
|
|
+ if (mtab) {
|
|
|
|
+ struct mntent mnt;
|
|
|
|
+ char strings[4096];
|
|
|
|
+
|
|
|
|
+ while (getmntent_r(mtab, &mnt, strings, sizeof(strings))) {
|
|
|
|
+ if (mnt.mnt_dir != NULL && _filter_drive(&mnt)) {
|
|
|
|
+ // Avoid duplicates
|
|
|
|
+ if (!list->find(mnt.mnt_dir)) {
|
|
|
|
+ list->push_back(mnt.mnt_dir);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ endmntent(mtab);
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ // Add $HOME
|
|
|
|
+ const char *home = getenv("HOME");
|
|
|
|
+ if (home) {
|
|
|
|
+ // Only add if it's not a duplicate
|
|
|
|
+ if (!list->find(home)) {
|
|
|
|
+ list->push_back(home);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Check $HOME/.config/gtk-3.0/bookmarks
|
|
|
|
+ char path[1024];
|
|
|
|
+ snprintf(path, 1024, "%s/.config/gtk-3.0/bookmarks", home);
|
|
|
|
+ FILE *fd = fopen(path, "r");
|
|
|
|
+ if (fd) {
|
|
|
|
+ char string[1024];
|
|
|
|
+ while (fgets(string, 1024, fd)) {
|
|
|
|
+ // Parse only file:// links
|
|
|
|
+ if (strncmp(string, "file://", 7) == 0) {
|
|
|
|
+ // Strip any unwanted edges on the strings and push_back if it's not a duplicate
|
|
|
|
+ String fpath = String(string + 7).strip_edges();
|
|
|
|
+ if (!list->find(fpath)) {
|
|
|
|
+ list->push_back(fpath);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fclose(fd);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ list->sort();
|
|
|
|
+}
|
|
|
|
+
|
|
int DirAccessUnix::get_drive_count() {
|
|
int DirAccessUnix::get_drive_count() {
|
|
|
|
|
|
- return 0;
|
|
|
|
|
|
+ List<String> list;
|
|
|
|
+ _get_drives(&list);
|
|
|
|
+
|
|
|
|
+ return list.size();
|
|
}
|
|
}
|
|
|
|
+
|
|
String DirAccessUnix::get_drive(int p_drive) {
|
|
String DirAccessUnix::get_drive(int p_drive) {
|
|
|
|
|
|
- return "";
|
|
|
|
|
|
+ List<String> list;
|
|
|
|
+ _get_drives(&list);
|
|
|
|
+
|
|
|
|
+ ERR_FAIL_INDEX_V(p_drive, list.size(), "");
|
|
|
|
+
|
|
|
|
+ return list[p_drive];
|
|
}
|
|
}
|
|
|
|
|
|
Error DirAccessUnix::make_dir(String p_dir) {
|
|
Error DirAccessUnix::make_dir(String p_dir) {
|