1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-04-10 22:24:12 +02:00

(add_omitted_fs_type, fs_to_omit): New functions adding

support for --exclude-type option.  From Kaveh R. Ghazi
<ghazi@caip.rutgers.edu>.
This commit is contained in:
Jim Meyering
1993-03-28 18:22:47 +00:00
parent d446f94a60
commit 4e66f13a79

View File

@@ -15,8 +15,8 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Usage: df [-aikP] [-t fstype] [--all] [--inodes] [--type fstype]
[--kilobytes] [--portability] [path...]
/* Usage: df [-aikP] [-t fstype] [-x fstype] [--all] [--inodes]
[--type fstype] [--exclude-type fstype] [--kilobytes] [--portability] [path...]
Options:
-a, --all List all filesystems, even zero-size ones.
@@ -24,7 +24,9 @@
-k, --kilobytes Print sizes in 1K blocks instead of 512-byte blocks.
-P, --portability Use the POSIX output format (one line per filesystem).
-t, --type fstype Limit the listing to filesystems of type `fstype'.
Multiple -t options can be given.
-x, --exclude-type fstype
Limit the listing to filesystems not of type `fstype'.
Multiple -t and/or -x options can be given.
By default, all filesystem types are listed.
Written by David MacKenzie <djm@gnu.ai.mit.edu> */
@@ -41,7 +43,9 @@ char *xmalloc ();
char *xstrdup ();
void error ();
static int fs_to_list ();
static int selected_fstype ();
static int excluded_fstype ();
static void add_excluded_fs_type ();
static void add_fs_type ();
static void print_header ();
static void show_entry ();
@@ -72,14 +76,14 @@ char *program_name;
/* A filesystem type to display. */
struct fs_select
struct fs_type_list
{
char *fs_name;
struct fs_select *fs_next;
struct fs_type_list *fs_next;
};
/* Linked list of filesystem types to display.
If `fs_list' is NULL, list all types.
If `fs_select_list' is NULL, list all types.
This table is generated dynamically from command-line options,
rather than hardcoding into the program what it thinks are the
valid filesystem types; let the user specify any filesystem type
@@ -87,9 +91,14 @@ struct fs_select
will be shown.
Some filesystem types:
4.2 4.3 ufs nfs swap ignore io vm */
4.2 4.3 ufs nfs swap ignore io vm efs dbg */
static struct fs_select *fs_list;
static struct fs_type_list *fs_select_list;
/* Linked list of filesystem types to omit.
If the list is empty, don't exclude any types. */
static struct fs_type_list *fs_exclude_list;
/* Linked list of mounted filesystems. */
static struct mount_entry *mount_list;
@@ -101,6 +110,7 @@ static struct option const long_options[] =
{"kilobytes", no_argument, &kilobyte_blocks, 1},
{"portability", no_argument, &posix_format, 1},
{"type", required_argument, 0, 't'},
{"exclude-type", required_argument, 0, 'x'},
{NULL, 0, NULL, 0}
};
@@ -113,14 +123,15 @@ main (argc, argv)
struct stat *stats;
program_name = argv[0];
fs_list = NULL;
fs_select_list = NULL;
fs_exclude_list = NULL;
inode_format = 0;
show_all_fs = 0;
kilobyte_blocks = getenv ("POSIXLY_CORRECT") == 0;
posix_format = 0;
exit_status = 0;
while ((i = getopt_long (argc, argv, "aikPt:v", long_options, (int *) 0))
while ((i = getopt_long (argc, argv, "aikPt:vx:", long_options, (int *) 0))
!= EOF)
{
switch (i)
@@ -144,6 +155,9 @@ main (argc, argv)
break;
case 'v': /* For SysV compatibility. */
break;
case 'x':
add_excluded_fs_type (optarg);
break;
default:
usage ();
}
@@ -167,7 +181,10 @@ main (argc, argv)
}
}
mount_list = read_filesystem_list (fs_list != NULL, show_all_fs);
mount_list =
read_filesystem_list ((fs_select_list != NULL || fs_exclude_list != NULL),
show_all_fs);
if (mount_list == NULL)
error (1, errno, "cannot read table of mounted filesystems");
@@ -294,7 +311,7 @@ show_dev (disk, mount_point, fstype)
long inodes_percent_used;
char *stat_file;
if (!fs_to_list (fstype))
if (!selected_fstype (fstype) || excluded_fstype (fstype))
return;
/* If MOUNT_POINT is NULL, then the filesystem is not mounted, and this
@@ -363,37 +380,70 @@ static void
add_fs_type (fstype)
char *fstype;
{
struct fs_select *fsp;
struct fs_type_list *fsp;
fsp = (struct fs_select *) xmalloc (sizeof (struct fs_select));
fsp = (struct fs_type_list *) xmalloc (sizeof (struct fs_type_list));
fsp->fs_name = fstype;
fsp->fs_next = fs_list;
fs_list = fsp;
fsp->fs_next = fs_select_list;
fs_select_list = fsp;
}
/* Add FSTYPE to the list of filesystem types to be omitted. */
static void
add_excluded_fs_type (fstype)
char *fstype;
{
struct fs_type_list *fsp;
fsp = (struct fs_type_list *) xmalloc (sizeof (struct fs_type_list));
fsp->fs_name = fstype;
fsp->fs_next = fs_exclude_list;
fs_exclude_list = fsp;
}
/* If FSTYPE is a type of filesystem that should be listed,
return nonzero, else zero. */
static int
fs_to_list (fstype)
selected_fstype (fstype)
char *fstype;
{
struct fs_select *fsp;
struct fs_type_list *fsp;
if (fs_list == NULL || fstype == NULL)
if (fs_select_list == NULL || fstype == NULL)
return 1;
for (fsp = fs_list; fsp; fsp = fsp->fs_next)
for (fsp = fs_select_list; fsp; fsp = fsp->fs_next)
if (!strcmp (fstype, fsp->fs_name))
return 1;
return 0;
}
/* If FSTYPE is a type of filesystem that should be omitted,
return nonzero, else zero. */
static int
excluded_fstype (fstype)
char *fstype;
{
struct fs_type_list *fsp;
if (fs_exclude_list == NULL || fstype == NULL)
return 0;
for (fsp = fs_exclude_list; fsp; fsp = fsp->fs_next)
if (!strcmp (fstype, fsp->fs_name))
return 1;
return 0;
}
static void
usage ()
{
fprintf (stderr, "\
Usage: %s [-aikPv] [-t fstype] [--all] [--inodes] [--type fstype]\n\
[--kilobytes] [--portability] [path...]\n",
Usage: %s [-aikPv] [-t fstype] [-x fstype] [--all] [--inodes]\n\
\t[--type fstype] [--exclude-type fstype] [--kilobytes] [--portability]\n\
\t[path...]\n",
program_name);
exit (1);
}