- Split out filesystem functions in filesystem.h/.cpp

- Update Jamfile
This commit is contained in:
Vedran Ljubovic 2007-08-01 18:06:50 +00:00
parent a99c55b6f1
commit 10a579512b
3 changed files with 126 additions and 1 deletions

View File

@ -10,7 +10,7 @@
SubDir TOP efiler ;
SOURCE = Fl_Icon_Browser.cxx EDE_Browser.cpp Util.cpp efiler.cpp ;
SOURCE = Fl_Icon_Browser.cxx EDE_Browser.cpp Util.cpp efiler.cpp fileops.cpp filesystem.cpp ;
EdeProgram efiler : $(SOURCE) ;
#EdeManual doc/efiler.txt : doc/efiler.jpg ;

102
efiler/filesystem.cpp Normal file
View File

@ -0,0 +1,102 @@
/*
* $Id$
*
* EFiler - EDE File Manager
* Part of Equinox Desktop Environment (EDE).
* Copyright (c) 2000-2006 EDE Authors.
*
* This program is licenced under terms of the
* GNU General Public Licence version 2 or newer.
* See COPYING for details.
*/
// Functions for filesystems
#include "filesystem.h"
#include <string.h>
#include <stdio.h>
#include <sys/vfs.h> // used for statfs()
// for fltk compatibility:
#define PATH_MAX 256
char filesystems[50][PATH_MAX]; // must be global
// Read filesystems - adapted from fltk file chooser
int get_filesystems() {
FILE *mtab; // /etc/mtab or /etc/mnttab file
// Results are cached in a static array
static int fs_number=0;
// On first access read filesystems
if (fs_number == 0) {
mtab = fopen("/etc/mnttab", "r"); // Fairly standard
if (mtab == NULL)
mtab = fopen("/etc/mtab", "r"); // More standard
if (mtab == NULL)
mtab = fopen("/etc/fstab", "r"); // Otherwise fallback to full list
if (mtab == NULL)
mtab = fopen("/etc/vfstab", "r"); // Alternate full list file
char line[PATH_MAX]; // Input line
char device[PATH_MAX], mountpoint[PATH_MAX], fs[PATH_MAX];
while (mtab!= NULL && fgets(line, sizeof(line), mtab) != NULL) {
if (line[0] == '#' || line[0] == '\n')
continue;
if (sscanf(line, "%s%s%s", device, mountpoint, fs) != 3)
continue;
strcpy(filesystems[fs_number],mountpoint);
fs_number++;
}
fclose (mtab);
if (fs_number == 0) return 0; // error reading mtab/fstab
}
return fs_number;
}
// Get mount point of filesystem for given file
const char* find_fs_for(const char* file) {
int fs_number = get_filesystems();
if (fs_number==0) return 0; // error reading mtab/fstab
// Find filesystem for file (largest mount point match)
char *max;
int maxlen = 0;
for (int i=0; i<fs_number; i++) {
int mylen = strlen(filesystems[i]);
if ((strncmp(file,filesystems[i],mylen)==0) && (mylen>maxlen)) {
maxlen=mylen;
max = (char*)filesystems[i];
}
}
if (maxlen == 0) return 0; // doesn't match any fs? there should always be root
return max;
}
// Tests if two files are on the same filesystem
// This can't use statfs cause there is no way to compare
// two "struct statfs" values
bool is_on_same_fs(const char* file1, const char* file2) {
const char* fs1 = find_fs_for(file1);
const char* fs2 = find_fs_for(file2);
// See if file2 matches the same filesystem
return (strcmp(fs1,fs2)==0);
}
// Find filesystem total size and free space (in bytes)
// dir is any directory on the filesystem
bool fs_usage(const char* dir, double &total, double &free) {
static struct statfs statfs_buffer;
if (statfs(dir, &statfs_buffer)!=0) return false;
total = double(statfs_buffer.f_bsize) * statfs_buffer.f_blocks;
free = double(statfs_buffer.f_bsize) * statfs_buffer.f_bavail; // This is what df returns
return true;
}

23
efiler/filesystem.h Normal file
View File

@ -0,0 +1,23 @@
/*
* $Id$
*
* EFiler - EDE File Manager
* Part of Equinox Desktop Environment (EDE).
* Copyright (c) 2000-2006 EDE Authors.
*
* This program is licenced under terms of the
* GNU General Public Licence version 2 or newer.
* See COPYING for details.
*/
// Functions for filesystems
// Get mount point of filesystem for given file
const char* find_fs_for(const char* file);
// Tests if two files are on the same filesystem
bool is_on_same_fs(const char* file1, const char* file2);
// Find filesystem total size and free space (in bytes)
// dir is any directory on the filesystem
bool fs_usage(const char* dir, double &total, double &free);