Implemented DirAccess get_drive and get_drive_count for Linux

This commit is contained in:
Marcelo Fernandez 2017-09-12 12:01:10 -03:00
parent 8f133e2c4d
commit e5f905a735
2 changed files with 93 additions and 2 deletions

View file

@ -14,4 +14,6 @@ f.close()
env.add_source_files(env.drivers_sources, "*.cpp") env.add_source_files(env.drivers_sources, "*.cpp")
env["check_c_headers"] = [ [ "mntent.h", "HAVE_MNTENT" ] ]
Export('env') Export('env')

View file

@ -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) {