initial checkin as provided by Evan Day, except for:

- minor reformatting in man page
	- corrected cvs identifiers
This commit is contained in:
gdr 1997-10-03 05:42:18 +00:00
parent c22bcee941
commit 5578ed663d
7 changed files with 1014 additions and 0 deletions

32
bin/df/Makefile Normal file
View File

@ -0,0 +1,32 @@
#
# This makefile is intended for use with dmake(1) on Apple IIGS
#
# Created by Dave Tribby, August 1997
# Modified by Evan Day, September 1997
#
# $Id: Makefile,v 1.1 1997/10/03 05:42:18 gdr Exp $
# Program name
PROG= df
# Source files
SRCS= df.c gnodf.c
# If optimization wasn't set on the command line use 79, since
# df has been tested to work at that level.
.IF $(OPTIMIZE) == $(NULL)
OPTIMIZE=79
.END
# Current implementation is using 960 bytes give or take
STACK = 1024
# Installation point
BINDIR = /bin
.INCLUDE : /src/gno/prog.mk
#
# Additional dependancies
#
tr.o:: df.h
str.o:: df.h

104
bin/df/df.1 Normal file
View File

@ -0,0 +1,104 @@
.\" Copyright (c) 1989, 1990, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
.\" This product includes software developed by the University of
.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)df.1 8.3 (Berkeley) 5/8/95
.\"
.\" $Id: df.1,v 1.1 1997/10/03 05:42:18 gdr Exp $
.\"
.TH DF 1 "04 August 1997" GNO "Commands and Applications"
.SH NAME
.BR df
\- display free disk space and disk usage statistics
.SH SYNOPSIS
.BR df " [" -k "] [" -t
.IR "FST list"
]
.IR devnum
|
.IR vol
|
.IR file ...
.SH DESCRIPTION
displays statistics about the amount of free disk space on the
specified device number
.IR devnum
(.d##), on the specified volume
.IR vol
or on the volume of which
.IR file
is a part. More than one device number, volume, or file may be
listed, and types can be mixed in the argument list.
.LP
Values are displayed in 512-byte per block block counts.
If neither a file or a filesystem operand is specified,
statistics for all mounted filesystems are displayed.
Devices without valid media (e.g. a 3.5" disk drive with
no disk in the drive) are not included in the output.
.SH OPTIONS
The following options are available:
.IP \fB-k\fR
Use 1024-byte (1-Kbyte) blocks rather than the default. Note
that this overrides the
.BR BLOCKSIZE
specification from the environment.
.IP "\fB-t\fR \fIfst1,...,fstN\fR"
Only print out statistics for filesystems of the specified types.
More than one type may be specified in a comma separated list.
The list of filesystem types can be prefixed with
.IR no
to specify the filesystem types for which action should
not be taken.
.LP
For example, the
.BR df
command:
.nf
df -t nohfs,msdos
.fi
lists all filesystems except those of type
.IR HFS
and
.IR MS-DOS
.LP
Acceptable filesystem types are as follows:
.IP
prodos, dos33, dos32, pascal, mfs, hfs, lisa, cpm,
msdos, highsierra, iso9660, appleshare.
.SH ENVIRONMENT VARIABLES
.IP \fBBLOCKSIZE\fR
If the environment variable
.BR BLOCKSIZE
is set, the block counts will be displayed in units of that size block.
.SH HISTORY
.BR df
for GNO/ME was originally built-in to gsh(1). The implementation of
.BR df
is based on FreeBSD source code and distributed with GNO/ME v2.0.6

510
bin/df/df.c Normal file
View File

@ -0,0 +1,510 @@
/*
* Copyright (c) 1980, 1990, 1993, 1994
* The Regents of the University of California. All rights reserved.
* (c) UNIX System Laboratories, Inc.
* All or some portions of this file are derived from material licensed
* to the University of California by American Telephone and Telegraph
* Co. or Unix System Laboratories, Inc. and are reproduced herein with
* the permission of UNIX System Laboratories, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: df.c,v 1.1 1997/10/03 05:42:18 gdr Exp $
*/
/*
* df for GNO/ME v2.0.6
* $ID$
*/
#ifndef __GNO__
#ifndef lint
static char const copyright[] =
"@(#) Copyright (c) 1980, 1990, 1993, 1994\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#endif
#ifndef __GNO__
#ifndef lint
static char const sccsid[] = "@(#)df.c 8.9 (Berkeley) 5/8/95";
#endif /* not lint */
#endif
#include <sys/param.h>
#include <sys/stat.h>
#ifndef __GNO__
#include <sys/mount.h>
#include <ufs/ufs/ufsmount.h>
#else
#include "df.h"
#endif
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#ifndef __GNO__
int checkvfsname __P((const char *, char **));
char **makevfslist __P((char *));
#else
void makevfslist __P((char *));
#endif
#ifndef __GNO__
long regetmntinfo __P((struct statfs **, long, char **));
int bread __P((off_t, void *, int));
char *getmntpt __P((char *));
#endif
void prtstat __P((struct statfs *, int));
#ifndef __GNO__
void ufs_df __P((char *, int));
#endif
void usage __P((void));
int iflag, nflag;
struct ufs_args mdev;
#ifdef __STACK_CHECK__
#include <gno/gno.h>
static void cleanup(void)
{
(void) fprintf(stderr, "Stack Usage: %d\n", _endStackCheck());
}
#endif
/*
The #ifdef's get quite messy, as there are certain filesystem things that
GNO/ME doesn't handle the same as UNIX. A lot of code is #ifdef'd out, but
left here with the thought that in the future some of it may be useful as
new libraries or FSTs are created.
The files gnodf.c contains a couple of UNIX library functions I've recreated
well enough to work for this applications, but I wouldn't even think of
adding to a library...
In particular, I muck with the statfs structure. DO NOT CALL statfs() or
fstatfs() with this structure. It may work and may cause a crash. This
structure is strictly for use with df(1) and the hacked functions in gnodf.c
which fill in fields with GS/OS calls, not kernel calls.
*/
int
#ifndef __STDC__
main(argc, argv)
int argc;
char *argv[];
#else
main(int argc, char *argv[])
#endif
{
struct stat stbuf;
struct statfs statfsbuf, *mntbuf;
long mntsize;
int ch, err, i, maxwidth, width;
#ifndef __GNO__
char *mntpt, **vfslist;
vfslist = NULL;
#else
char *mntpt;
#endif
#ifdef __STACK_CHECK__
atexit(cleanup);
_beginStackCheck();
#endif
#ifndef __GNO__
while ((ch = getopt(argc, argv, "iknt:")) != -1)
#else
while ((ch = getopt(argc, argv, "kt:")) != -1)
#endif
switch (ch) {
#ifndef __GNO__
case 'i':
iflag = 1;
break;
#endif
case 'k':
putenv("BLOCKSIZE=1k");
break;
#ifndef __GNO__
case 'n':
nflag = 1;
break;
#endif
case 't':
#ifndef __GNO__
if (vfslist != NULL)
#else
if (vfslist[14])
#endif
errx(1, "only one -t option may be specified.");
#ifndef __GNO__
vfslist = makevfslist(optarg);
#else
makevfslist(optarg);
#endif
break;
case '?':
default:
usage();
}
argc -= optind;
#ifndef __ORCAC__
argv += optind;
#else
argv = argv + optind;
#endif
mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
maxwidth = 0;
for (i = 0; i < mntsize; i++) {
width = strlen(mntbuf[i].f_mntfromname);
if (width > maxwidth)
maxwidth = width;
}
if (!*argv) {
#ifndef __GNO__
mntsize = regetmntinfo(&mntbuf, mntsize, vfslist);
if (vfslist != NULL) {
maxwidth = 0;
for (i = 0; i < mntsize; i++) {
width = strlen(mntbuf[i].f_mntfromname);
if (width > maxwidth)
maxwidth = width;
}
}
#endif
for (i = 0; i < mntsize; i++)
prtstat(&mntbuf[i], maxwidth);
exit(0);
}
for (; *argv; argv++) {
if (stat(*argv, &stbuf) < 0) {
err = errno;
#ifndef __GNO__
if ((mntpt = getmntpt(*argv)) == 0) {
warn("%s", *argv);
continue;
}
#else
warn("%s", *argv);
continue;
#endif
#ifndef __GNO__
} else if ((stbuf.st_mode & S_IFMT) == S_IFCHR) {
ufs_df(*argv, maxwidth);
continue;
} else if ((stbuf.st_mode & S_IFMT) == S_IFBLK) {
if ((mntpt = getmntpt(*argv)) == 0) {
mntpt = mktemp(strdup("/tmp/df.XXXXXX"));
mdev.fspec = *argv;
if (mkdir(mntpt, DEFFILEMODE) != 0) {
warn("%s", mntpt);
continue;
}
if (mount("ufs", mntpt, MNT_RDONLY,
&mdev) != 0) {
ufs_df(*argv, maxwidth);
(void)rmdir(mntpt);
continue;
} else if (statfs(mntpt, &statfsbuf) == 0) {
statfsbuf.f_mntonname[0] = '\0';
prtstat(&statfsbuf, maxwidth);
} else
warn("%s", *argv);
(void)unmount(mntpt, 0);
(void)rmdir(mntpt);
continue;
}
#endif
} else
mntpt = *argv;
/*
* Statfs does not take a `wait' flag, so we cannot
* implement nflag here.
*/
#ifndef __GNO__
if (statfs(mntpt, &statfsbuf) < 0) {
warn("%s", mntpt);
continue;
}
#else
strcpy(statfsbuf.f_mntonname, mntpt);
if (nameinfo(&statfsbuf) < 0) {
warn("%s", statfsbuf.f_mntonname);
continue;
}
#endif
if (argc == 1)
maxwidth = strlen(statfsbuf.f_mntfromname) + 1;
prtstat(&statfsbuf, maxwidth);
}
return (0);
}
#ifndef __GNO__
char *
#ifndef __STDC__
getmntpt(name)
char *name;
#else
getmntpt(char *name)
#endif
{
long mntsize, i;
struct statfs *mntbuf;
mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
for (i = 0; i < mntsize; i++) {
if (!strcmp(mntbuf[i].f_mntfromname, name))
return (mntbuf[i].f_mntonname);
}
return (0);
}
#endif
#ifndef __GNO__
/*
* Make a pass over the filesystem info in ``mntbuf'' filtering out
* filesystem types not in vfslist and possibly re-stating to get
* current (not cached) info. Returns the new count of valid statfs bufs.
*/
long
#ifndef __STDC__
regetmntinfo(mntbufp, mntsize, vfslist)
struct statfs **mntbufp;
long mntsize;
char **vfslist;
#else
regetmntinfo(struct fsinfo **mntbufp, long mntsize, char **vfslist)
#endif
{
int i, j;
struct statfs *mntbuf;
if (vfslist == NULL)
return (nflag ? mntsize : getmntinfo(mntbufp, MNT_WAIT));
mntbuf = *mntbufp;
for (j = 0, i = 0; i < mntsize; i++) {
if (checkvfsname(mntbuf[i].f_fstypename, vfslist))
continue;
if (!nflag)
(void)statfs(mntbuf[i].f_mntonname,&mntbuf[j]);
else if (i != j)
mntbuf[j] = mntbuf[i];
j++;
}
return (j);
}
#endif
/*
* Convert statfs returned filesystem size into BLOCKSIZE units.
* Attempts to avoid overflow for large filesystems.
*/
#define fsbtoblk(num, fsbs, bs) \
(((fsbs) != 0 && (fsbs) < (bs)) ? \
(num) / ((bs) / (fsbs)) : (num) * ((fsbs) / (bs)))
/*
* Print out status about a filesystem.
*/
void
#ifndef __STDC__
prtstat(sfsp, maxwidth)
struct statfs *sfsp;
int maxwidth;
#else
prtstat(struct statfs *sfsp, int maxwidth)
#endif
{
static long blocksize;
static int headerlen, timesthrough;
static char *header;
long used, availblks, inodes;
if (maxwidth < 11)
maxwidth = 11;
if (++timesthrough == 1) {
header = getbsize(&headerlen, &blocksize);
#ifdef __GNO__
(void)printf("Dev# ");
#endif
(void)printf("%-*.*s %s Used Avail Capacity",
maxwidth, maxwidth, "Filesystem", header);
if (iflag)
(void)printf(" iused ifree %%iused");
#ifdef __GNO__
(void)printf("%12s", "FST");
#endif
(void)printf(" Mounted on\n");
}
#ifdef __GNO__
if(!vfslist[sfsp->f_type])
return;
(void)printf(".d%-2ld ", (sfsp->f_fsid).lo);
#endif
(void)printf("%-*.*s", maxwidth, maxwidth, sfsp->f_mntfromname);
used = sfsp->f_blocks - sfsp->f_bfree;
availblks = sfsp->f_bavail + used;
(void)printf(" %*ld %7ld %7ld", headerlen,
fsbtoblk(sfsp->f_blocks, sfsp->f_bsize, blocksize),
fsbtoblk(used, sfsp->f_bsize, blocksize),
fsbtoblk(sfsp->f_bavail, sfsp->f_bsize, blocksize));
(void)printf(" %5.0f%%",
availblks == 0 ? 100.0 : (double)used / (double)availblks * 100.0);
if (iflag) {
inodes = sfsp->f_files;
used = inodes - sfsp->f_ffree;
(void)printf(" %7ld %7ld %5.0f%% ", used, sfsp->f_ffree,
inodes == 0 ? 100.0 : (double)used / (double)inodes * 100.0);
} else
(void)printf(" ");
#ifdef __GNO__
(void)printf("%12s", fs_name[sfsp->f_type]);
#endif
(void)printf(" %s\n", sfsp->f_mntonname);
}
#ifndef __GNO__
/*
* This code constitutes the pre-system call Berkeley df code for extracting
* information from filesystem superblocks.
*/
#include <ufs/ufs/dinode.h>
#include <ufs/ffs/fs.h>
#include <errno.h>
#include <fstab.h>
union {
struct fs iu_fs;
char dummy[SBSIZE];
} sb;
#define sblock sb.iu_fs
int rfd;
void
#ifndef __STDC__
ufs_df(file, maxwidth)
char *file;
int maxwidth;
#else
ufs_df(char *file, int maxwidth)
#endif
{
struct statfs statfsbuf;
struct statfs *sfsp;
char *mntpt;
static int synced;
if (synced++ == 0)
sync();
if ((rfd = open(file, O_RDONLY)) < 0) {
warn("%s", file);
return;
}
if (bread((off_t)SBOFF, &sblock, SBSIZE) == 0) {
(void)close(rfd);
return;
}
sfsp = &statfsbuf;
sfsp->f_type = 1;
strcpy(sfsp->f_fstypename, "ufs");
sfsp->f_flags = 0;
sfsp->f_bsize = sblock.fs_fsize;
sfsp->f_iosize = sblock.fs_bsize;
sfsp->f_blocks = sblock.fs_dsize;
sfsp->f_bfree = sblock.fs_cstotal.cs_nbfree * sblock.fs_frag +
sblock.fs_cstotal.cs_nffree;
sfsp->f_bavail = freespace(&sblock, sblock.fs_minfree);
sfsp->f_files = sblock.fs_ncg * sblock.fs_ipg;
sfsp->f_ffree = sblock.fs_cstotal.cs_nifree;
sfsp->f_fsid.val[0] = 0;
sfsp->f_fsid.val[1] = 0;
if ((mntpt = getmntpt(file)) == 0)
mntpt = "";
memmove(&sfsp->f_mntonname[0], mntpt, MNAMELEN);
memmove(&sfsp->f_mntfromname[0], file, MNAMELEN);
prtstat(sfsp, maxwidth);
(void)close(rfd);
}
int
#ifndef __STDC__
bread(off, buf, cnt)
off_t off;
void *buf;
int cnt;
#else
bread(off_t off, void *buf, int cnt)
#endif
{
int nr;
(void)lseek(rfd, off, SEEK_SET);
if ((nr = read(rfd, buf, cnt)) != cnt) {
/* Probably a dismounted disk if errno == EIO. */
if (errno != EIO)
(void)fprintf(stderr, "\ndf: %qd: %s\n",
off, strerror(nr > 0 ? EIO : errno));
return (0);
}
return (1);
}
#endif
void
#ifndef __STDC__
usage()
#else
usage(void)
#endif
{
(void)fprintf(stderr,
#ifndef __GNO__
"usage: df [-ikn] [-t type] [file | filesystem ...]\n");
#else
"usage: df [-k] [-t type] [devnum | volume | file ...]\n");
#endif
exit(1);
}

9
bin/df/df.desc Normal file
View File

@ -0,0 +1,9 @@
Name: df
Version: 1.0 (28 Sep 97)
Shell: GNO/ME
Author: Evan Day (from FreeBSD source)
Contact: day@engr.orst.edu
Where: /usr/bin
FTP:
Displays free disk space and disk usage statistics for GS/OS block devices.

61
bin/df/df.h Normal file
View File

@ -0,0 +1,61 @@
/*
* df.h
*
* Bastardized sys/mount.h with local constants and functions to provide
* functions not available in the gno libraries.
*
* $Id: df.h,v 1.1 1997/10/03 05:42:18 gdr Exp $
*/
#ifndef _SYS_TYPES_H_
#include <sys/types.h>
#endif
typedef quad_t fsid_t; /* formerly an equivalent struct */
struct statfs {
long f_type; /* FST type (see below) */
long f_bsize; /* fundamental file system block size */
long f_blocks; /* total blocks in file system */
long f_bfree; /* free blocks */
long f_bavail; /* free blocks available to non-superuser */
long f_files; /* total file nodes in file system */
long f_ffree; /* free file nodes in fs */
fsid_t f_fsid; /* file system id (GS/OS device number) */
long f_spare[7]; /* reserved */
char f_mntfromname[32]; /* device name */
char f_mntonname[32]; /* volume name */
};
#define MOUNT_PRODOS 0x0001 /* ProDOS or SOS */
#define MOUNT_DOS_33 0x0002 /* DOS 3.3 */
#define MOUNT_DOS_32 0x0003 /* DOS 3.1 or 3.2 */
#define MOUNT_PASCAL 0x0004 /* Apple II Pascal */
#define MOUNT_MFS 0x0005 /* Macintosh (MFS) */
#define MOUNT_HFS 0x0006 /* Macintosh (HFS) */
#define MOUNT_LISA 0x0007 /* Lisa */
#define MOUNT_CPM 0x0008 /* Apple CP/M */
#define MOUNT_MSDOS 0x000A /* MS/DOS */
#define MOUNT_HISHS 0x000B /* High Sierra */
#define MOUNT_CD9660 0x000C /* ISO 9660 (CD-ROM) */
#define MOUNT_APLSHAR 0x000D /* AppleShare */
#ifndef _SYS_CDEFS_H_
#include <sys/cdefs.h>
#endif
/* This constant is used in the one non-#ifdef'd getmntinfo() call */
#define MNT_NOWAIT 0
/* "Helper" functions to fill in the statfs structure where statfs() fails */
int nameinfo(struct statfs *);
void devinfo(struct statfs *);
long getmntinfo(struct statfs **, char);
char *getbsize(int *, long *);
/* Data structures */
extern char *fs_name[];
extern char vfslist[];

30
bin/df/df.rez Normal file
View File

@ -0,0 +1,30 @@
#include "Types.Rez"
#include "proginfo.rez"
resource rVersion (0x1, purgeable3, nocrossbank) {
{ 1, 0, 0, /* version 1.0.0 */
release, /* development|alpha|beta|final|release */
0 /* non-final release number */
},
verUS, /* country code -- only some are avail */
"df", /* name */
/* _Very_ brief descrition. Check "file info" */
/* shown in the Finder to see if it's too long */
/* Note that \n is used to separate lines here. */
"Display free disk space.\n"
"Requires GNO/ME Shell.\n"
"Evan Day <day@engr.orst.edu>"
};
resource rProgramInfo (0x1, purgeable3, nocrossbank) {
{ 6, 0, 1,
release,
0
},
30270,
32768,
1280,
progRequiresGNO+progAppleTalkOK+progAllowsCDAs,
piCompatible*ProgShellGSH+piSpecialFeatures*ProgShellGSH
};

268
bin/df/gnodf.c Normal file
View File

@ -0,0 +1,268 @@
/*
* gnodf.c
*
* Provide missing library functions to make df(1) work right
* $ID$
*/
#include <gsos.h>
#include <stdlib.h>
#include <string.h>
#include "df.h"
/* Array of FST names */
char *fs_name[] = {
"",
"ProDOS",
"DOS 3.3",
"DOS 3.2",
"Pascal",
"MFS",
"HFS",
"LISA",
"CP/M",
"",
"MS-DOS",
"High Sierra",
"ISO 9660",
"AppleShare"
};
/* vfsname is an array of fsts accepted by the -t flag */
static char *vfsname[15] = {
"",
"prodos",
"dos33",
"dos32",
"pascal",
"mfs",
"hfs",
"lisa",
"cpm",
"",
"msdos",
"highsierra",
"iso9660",
"appleshare"
};
/* Each member of the vfslist array reflects if the FST is included in the
* output (as affected by the -t flag).
* 1 = display
* 0 = don't display
*/
char vfslist[15] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0};
/* getbsize()
*
* in: pointer to int, pointer to long
* out: pointer to char
*
* getbsize() returns a string indicative of the current value of the
* BLOCKSIZE environment variable. If BLOCKSIZE is 1k or 1024, " kbytes"
* is returned. Otherwise, " blocks" is returned. If BLOCKSIZE is NULL,
* a standard 512 byte blocksize is returned. len is the strlen of the
* returned string, always 7 in this case.
*
* BLOCKSIZE may be a plain number, in which case the number represents the
* number of bytes in a block. It may also be #k, where # represents the
* number of kilobytes in a block.
*/
char *getbsize(int *len, long *blocksize)
{
char *size;
char *p;
size = getenv("BLOCKSIZE");
if(size == NULL)
*blocksize = 512;
else {
*blocksize = strtol(size, &p, 0);
if(*p == 'k')
*blocksize *= 1024;
}
*len = 7;
if(*blocksize != 1024)
return(" blocks");
else
return(" kbytes");
}
/* makevfslist()
*
* in: string containing a comma separated list of FSTs.
* (see manpage for the exact list of recognized strings)
*
* global: char vfslist[14]
*
* vfslist is a character array. Each entry determines if the FST number
* is to be displayed in the df list or not.
*
* makevfslist() parses the input string for valid FST names. If the name
* is specified, the FST is either included or excluded from the list.
* If the string starts with "no", all FSTs are included except those present
* in the string. Otherwise, only the FSTs specified are included.
*/
void makevfslist(char *list)
{
int def, include, i;
char *p, *str;
def = 0;
include = 1;
p = list;
if(*list == 'n') {
p += 2;
include = 0;
def = 1;
}
for(i = 1; i < 14; i++)
vfslist[i] = def;
str = strtok(p, ",");
do {
for(i=1; i < 14; i++) {
if(!strcmp(str, vfsname[i])) {
vfslist[i] = include;
break;
}
}
} while((str = strtok(NULL, NULL)) != NULL);
/* Mark that makevfslist() has been run */
vfslist[14] = 0xFF;
}
/* nameinfo()
*
* in: customize statfs structure pointer
*
* out: 0 = success, -1 = failure
*
* nameinfo() check the f_mntonname field of the statfs structure and calls
* the GetDevNumber and DInfo GS/OS calls to fill in the f_mntfromname field
* and the f_type field of the statfs structure.
*/
static ResultBuf32 devName = {35};
static DInfoRecGS dInfo = {3, 0, &devName};
int nameinfo(struct statfs *sbuf)
{
GSString255 dName = {strlen(sbuf->f_mntonname)};
DevNumRecGS dNum = {2, (GSString32 *) &dName};
strcpy(&dName.text[0], sbuf->f_mntonname);
GetDevNumberGS(&dNum);
if(_toolErr)
return(-1);
dInfo.devNum = dNum.devNum;
DInfoGS(&dInfo);
if(_toolErr)
return(-1);
devName.bufString.text[devName.bufString.length] = '\0';
strcpy(sbuf->f_mntfromname, devName.bufString.text);
(sbuf->f_fsid).lo = (long) dNum.devNum;
devinfo(sbuf);
return(0);
}
/* devinfo()
*
* in: customized statfs structure pointer
*
* devinfo() takes the f_mntfromname field of the statfs structure and fills
* in the fields used by df with the results of the GSOS Volume call.
* Devices with no valid media (i.e. a 3.5" drive with no disk) are filled
* with blank values and excluded from the resulting output.
*/
static ResultBuf255 vRes = {259};
void devinfo(struct statfs *sbuf)
{
GSString32 dname = {strlen(sbuf->f_mntfromname)};
VolumeRecGS vInfo = {6, &dname, &vRes};
strcpy(dname.text, sbuf->f_mntfromname);
VolumeGS(&vInfo);
if(_toolErr) {
strcpy(sbuf->f_mntonname, "");
sbuf->f_bsize = 0;
sbuf->f_blocks = 0;
sbuf->f_bfree = sbuf->f_bavail = 0;
sbuf->f_type = 0;
} else {
vRes.bufString.text[vRes.bufString.length] = '\0';
strcpy(sbuf->f_mntonname, vRes.bufString.text);
sbuf->f_bsize = vInfo.blockSize;
sbuf->f_blocks = vInfo.totalBlocks;
sbuf->f_bfree = sbuf->f_bavail = vInfo.freeBlocks;
sbuf->f_type = vInfo.fileSysID;
}
}
/* getmntinfo()
*
* in: struct statfs **, char
*
* out: number of block devices currently online.
*
* getmntinfo() first finds out how many devices are online and how many of
* them are block devices by repeated calls to DInfo. Then it dynamically
* creates and array of statfs structures and for each block devices fills in
* an entry in the array, returning the total number of block devices present.
*/
long getmntinfo(struct statfs **mntlist, char flags)
{
int n, b, i, j;
/* First find out how many devices exist, and how many are block
devices */
b = n = 0;
while(1) {
dInfo.devNum = n+1;
DInfoGS(&dInfo);
if(_toolErr)
break;
if(dInfo.characteristics & 0x80)
b++;
n++;
}
/* Prepare the mntlist array */
if((*mntlist = (struct statfs *) malloc(sizeof(struct statfs)*b)) == NULL)
return(0L);
/* Copy the device names of each block device to the array */
for(j=0,i=1;i<=n;i++) {
dInfo.devNum = i;
DInfoGS(&dInfo);
if(dInfo.characteristics & 0x80) {
devName.bufString.text[devName.bufString.length] = '\0';
strcpy((*mntlist)[j].f_mntfromname, devName.bufString.text);
(*mntlist)[j].f_fsid.lo = (long) dInfo.devNum;
devinfo(&(*mntlist)[j++]);
}
}
return((long) b);
}