* fhandler_proc.cc: Add /proc/filesystems virtual file.

(format_proc_filesystems): New function.
	* mount.cc (fs_names): Move to global scope. Redefine as array
	of { "name", block_device? } structs.
	(fillout_mntent): Use name member of fs_names.
	* mount.h (fs_names): New prototype.
This commit is contained in:
Corinna Vinschen 2010-08-09 08:18:30 +00:00
parent 99006a85e2
commit a52993d426
4 changed files with 55 additions and 20 deletions

View File

@ -1,3 +1,12 @@
2010-08-09 Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
* fhandler_proc.cc: Add /proc/filesystems virtual file.
(format_proc_filesystems): New function.
* mount.cc (fs_names): Move to global scope. Redefine as array
of { "name", block_device? } structs.
(fillout_mntent): Use name member of fs_names.
* mount.h (fs_names): New prototype.
2010-08-09 Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
* include/dlfcn.h (RTLD_LOCAL): Define.

View File

@ -1,6 +1,6 @@
/* fhandler_proc.cc: fhandler for /proc virtual filesystem
Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2009 Red Hat, Inc.
Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 Red Hat, Inc.
This file is part of Cygwin.
@ -28,6 +28,7 @@ details. */
#include <winioctl.h>
#include <wchar.h>
#include "cpuid.h"
#include "mount.h"
#define _COMPILING_NEWLIB
#include <dirent.h>
@ -41,6 +42,7 @@ static _off64_t format_proc_cpuinfo (void *, char *&);
static _off64_t format_proc_partitions (void *, char *&);
static _off64_t format_proc_self (void *, char *&);
static _off64_t format_proc_mounts (void *, char *&);
static _off64_t format_proc_filesystems (void *, char *&);
/* names of objects in /proc */
static const virt_tab_t proc_tab[] = {
@ -59,6 +61,7 @@ static const virt_tab_t proc_tab[] = {
{ "registry32", FH_REGISTRY, virt_directory, NULL },
{ "registry64", FH_REGISTRY, virt_directory, NULL },
{ "net", FH_PROCNET, virt_directory, NULL },
{ "filesystems", FH_PROC, virt_file, format_proc_filesystems },
{ NULL, 0, virt_none, NULL }
};
@ -1220,4 +1223,22 @@ format_proc_mounts (void *, char *&destbuf)
return __small_sprintf (destbuf, "self/mounts");
}
static _off64_t
format_proc_filesystems (void *, char *&destbuf)
{
tmp_pathbuf tp;
char *buf = tp.c_get ();
char *bufptr = buf;
/* start at 1 to skip type "none" */
for (int i = 1; fs_names[i].name; i++)
bufptr += __small_sprintf(bufptr, "%s\t%s\n",
fs_names[i].block_device ? "" : "nodev",
fs_names[i].name);
destbuf = (char *) crealloc_abort (destbuf, bufptr - buf);
memcpy (destbuf, buf, bufptr - buf);
return bufptr - buf;
}
#undef print

View File

@ -1472,6 +1472,24 @@ mount_info::del_item (const char *path, unsigned flags)
/************************* mount_item class ****************************/
/* Order must be identical to mount.h, enum fs_info_type. */
fs_names_t fs_names[] = {
{ "none", false },
{ "vfat", true },
{ "ntfs", true },
{ "smbfs", false },
{ "nfs", false },
{ "netapp", false },
{ "iso9660", true },
{ "udf", true },
{ "csc-cache", false },
{ "sunwnfs", false },
{ "unixfs", false },
{ "mvfs", false },
{ "cifs", false },
{ "nwfs", false }
};
static mntent *
fillout_mntent (const char *native_path, const char *posix_path, unsigned flags)
{
@ -1509,26 +1527,8 @@ fillout_mntent (const char *native_path, const char *posix_path, unsigned flags)
RtlAppendUnicodeToString (&unat, L"\\");
mntinfo.update (&unat, NULL);
/* Order must be identical to mount.h, enum fs_info_type. */
const char *fs_names[] = {
"none",
"vfat",
"ntfs",
"smbfs",
"nfs",
"netapp",
"iso9660",
"udf",
"csc-cache",
"sunwnfs",
"unixfs",
"mvfs",
"cifs",
"nwfs"
};
if (mntinfo.what_fs () > 0 && mntinfo.what_fs () < max_fs_type)
strcpy (_my_tls.locals.mnt_type, fs_names[mntinfo.what_fs ()]);
strcpy (_my_tls.locals.mnt_type, fs_names[mntinfo.what_fs ()].name);
else
strcpy (_my_tls.locals.mnt_type, mntinfo.fsname ());

View File

@ -32,6 +32,11 @@ enum fs_info_type
max_fs_type
};
extern struct fs_names_t {
const char *name;
bool block_device;
} fs_names[];
#define IMPLEMENT_FS_FLAG(func, flag) \
bool func (bool val) { if (val) status.fs_type = flag; return val; } \
bool func () const { return status.fs_type == flag; }