]> Zhao Yanbai Git Server - minix.git/commitdiff
Import NetBSD df(1) 36/936/2
authorDavid van Moolenbroek <david@minix3.org>
Mon, 19 Aug 2013 18:34:15 +0000 (20:34 +0200)
committerLionel Sambuc <lionel@minix3.org>
Tue, 18 Feb 2014 10:25:02 +0000 (11:25 +0100)
Change-Id: I7a99e335da666a15b43b9daeb59dbfee516f0118

14 files changed:
bin/Makefile
bin/df/Makefile [new file with mode: 0644]
bin/df/df.1 [new file with mode: 0644]
bin/df/df.c [new file with mode: 0644]
commands/Makefile
commands/df/Makefile [deleted file]
commands/df/df.c [deleted file]
commands/setup/setup.sh
distrib/sets/lists/minix/mi
lib/libutil/Makefile
man/man1/Makefile
man/man1/df.1 [deleted file]
releasetools/nbsd_ports
releasetools/release.sh

index cfbbfbb1fd63200c5df8a4351d0ebd09409201d4..1d2a3c8a274c8c126852e1d4117a45f32bb6dec4 100644 (file)
@@ -1,7 +1,7 @@
 #      $NetBSD: Makefile,v 1.22 2007/12/31 15:31:24 ad Exp $
 #      @(#)Makefile    8.1 (Berkeley) 5/31/93
 
-SUBDIR=        cat date echo ed expr kill ksh ln ls \
+SUBDIR=        cat date df echo ed expr kill ksh ln ls \
        mkdir pax pwd rm rmdir sync test
 
 .include <bsd.subdir.mk>
diff --git a/bin/df/Makefile b/bin/df/Makefile
new file mode 100644 (file)
index 0000000..e3c5edb
--- /dev/null
@@ -0,0 +1,11 @@
+#      $NetBSD: Makefile,v 1.19 2011/08/28 08:20:58 christos Exp $
+#      @(#)Makefile    8.3 (Berkeley) 5/8/95
+
+.include <bsd.own.mk>
+
+PROG=  df
+
+LDADD+=-lutil
+DPADD+=${LIBUTIL}
+
+.include <bsd.prog.mk>
diff --git a/bin/df/df.1 b/bin/df/df.1
new file mode 100644 (file)
index 0000000..7ab3d0c
--- /dev/null
@@ -0,0 +1,206 @@
+.\"    $NetBSD: df.1,v 1.44 2010/04/05 21:17:28 joerg Exp $
+.\"
+.\" 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. 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.2 (Berkeley) 1/13/92
+.\"
+.Dd March 4, 2008
+.Dt DF 1
+.Os
+.Sh NAME
+.Nm df
+.Nd display free disk space
+.Sh SYNOPSIS
+.Nm
+.Op Fl agklmn
+.Op Fl G | Fl i | Fl P
+.Op Fl t Ar type
+.Op Ar file | Ar file_system ...
+.Sh DESCRIPTION
+.Nm
+displays statistics about the amount of free disk space on the specified
+.Ar file_system
+or on the file system of which
+.Ar file
+is a part.
+By default, all sizes are reported in 512-byte block counts.
+If neither a file or a
+.Ar file_system
+operand is specified,
+statistics for all mounted file systems are displayed
+(subject to the
+.Fl l
+and
+.Fl t
+options below).
+.Pp
+Note that the printed count of available blocks takes
+.Va minfree
+into account, and thus will be negative when the number of free blocks
+on the filesystem is less than
+.Va minfree .
+.Pp
+The following options are available:
+.Bl -tag -width Ds
+.It Fl a
+Show all mount points,
+including those that were mounted with the
+.Dv MNT_IGNORE
+flag.
+.It Fl G
+Display all the fields of the structure(s) returned by
+.Xr statvfs 2 .
+This option cannot be used with the
+.Fl i
+or
+.Fl P
+options, and it is modelled after the Solaris
+.Fl g
+option.
+This option will override the
+.Fl g ,
+.Fl h ,
+.Fl k ,
+and
+.Fl m
+options, as well as any setting of
+.Ev BLOCKSIZE .
+.It Fl g
+The
+.Fl g
+option causes the numbers to be reported in gigabytes (1024*1024*1024
+bytes).
+.It Fl h
+"Human-readable" output.
+Use unit suffixes: Byte, Kilobyte, Megabyte,
+Gigabyte, Terabyte, Petabyte, Exabyte in order to reduce the number of
+digits to four or less.
+.It Fl i
+Include statistics on the number of free inodes.
+.It Fl k
+By default, all sizes are reported in 512-byte block counts.
+The
+.Fl k
+option causes the numbers to be reported in kilobytes (1024 bytes).
+.It Fl l
+Display statistics only about mounted file systems with the
+.Dv MNT_LOCAL
+flag set.
+If a non-local file system is given as an argument, a
+warning is issued and no information is given on that file system.
+.It Fl m
+The
+.Fl m
+option causes the numbers to be reported in megabytes (1024*1024 bytes).
+.It Fl n
+Print out the previously obtained statistics from the file systems.
+This option should be used if it is possible that one or more
+file systems are in a state such that they will not be able to provide
+statistics without a long delay.
+When this option is specified,
+.Nm
+will not request new statistics from the file systems, but will respond
+with the possibly stale statistics that were previously obtained.
+.It Fl P
+Produce output in the following portable format:
+.Pp
+If both the
+.Fl P
+and
+.Fl k
+option are specified, the output will be preceded by the following header
+line, formatted to match the data following it:
+.Bd -literal
+"Filesystem 1024-blocks Used Available Capacity Mounted on\en"
+.Ed
+.Pp
+If the
+.Fl P
+option is specified without the
+.Fl k
+options, the output will be preceded by the following header line,
+formatted to match the data following it:
+.Bd -literal
+"Filesystem \*[Lt]blksize\*[Gt]-blocks Used Available Capacity Mounted on\en"
+.Ed
+.Pp
+The header line is followed by data formatted as follows:
+.Bd -literal
+"%s %d %d %d %d%% %s\en", \*[Lt]file system name\*[Gt], \*[Lt]total space\*[Gt],
+    \*[Lt]space used\*[Gt], \*[Lt]space free\*[Gt], \*[Lt]percentage used\*[Gt],
+    \*[Lt]file system root\*[Gt]
+.Ed
+.Pp
+Note that the
+.Fl i
+option may not be specified with
+.Fl P .
+.It Fl t Ar type
+Is used to indicate the actions should only be taken on
+filesystems of the specified type.
+More than one type may be specified in a comma-separated list.
+The list of filesystem types can be prefixed with
+.Dq no
+to specify the filesystem types for which action should
+.Em not
+be taken.
+If a file system is given on the command line that is not of
+the specified type, a warning is issued and no information is given on
+that file system.
+.El
+.Sh ENVIRONMENT
+.Bl -tag -width BLOCKSIZE
+.It Ev BLOCKSIZE
+If the environment variable
+.Ev BLOCKSIZE
+is set, and the
+.Fl g ,
+.Fl h ,
+.Fl k
+and
+.Fl m
+options are not specified, the block counts will be displayed in units of that
+size block.
+.El
+.Sh SEE ALSO
+.Xr quota 1 ,
+.Xr fstatvfs 2 ,
+.Xr getvfsstat 2 ,
+.Xr statvfs 2 ,
+.Xr getbsize 3 ,
+.Xr getmntinfo 3 ,
+.Xr fs 5 ,
+.Xr fstab 5 ,
+.Xr mount 8 ,
+.Xr quot 8 ,
+.Xr tunefs 8
+.Sh HISTORY
+A
+.Nm
+utility appeared in
+.At v6 .
diff --git a/bin/df/df.c b/bin/df/df.c
new file mode 100644 (file)
index 0000000..d361574
--- /dev/null
@@ -0,0 +1,520 @@
+/*     $NetBSD: df.c,v 1.90 2012/01/07 18:45:13 christos Exp $ */
+
+/*
+ * 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. 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.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT(
+"@(#) Copyright (c) 1980, 1990, 1993, 1994\
+ The Regents of the University of California.  All rights reserved.");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)df.c       8.7 (Berkeley) 4/2/94";
+#else
+__RCSID("$NetBSD: df.c,v 1.90 2012/01/07 18:45:13 christos Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+
+#include <assert.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <locale.h>
+#include <util.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <util.h>
+
+static char    *getmntpt(const char *);
+static void     prtstat(struct statvfs *, int);
+static int      selected(const char *, size_t);
+static void     maketypelist(char *);
+static size_t   regetmntinfo(struct statvfs **, size_t);
+__dead static void usage(void);
+static void     prthumanval(int64_t, const char *);
+static void     prthuman(struct statvfs *, int64_t, int64_t);
+
+static int      aflag, gflag, hflag, iflag, lflag, nflag, Pflag;
+static long     usize;
+static char    **typelist;
+
+int
+main(int argc, char *argv[])
+{
+       struct stat stbuf;
+       struct statvfs *mntbuf;
+       long mntsize;
+       int ch, i, maxwidth, width;
+       char *mntpt;
+
+       setprogname(argv[0]);
+       (void)setlocale(LC_ALL, "");
+
+       while ((ch = getopt(argc, argv, "aGghiklmnPt:")) != -1)
+               switch (ch) {
+               case 'a':
+                       aflag = 1;
+                       break;
+               case 'g':
+                       hflag = 0;
+                       usize = 1024 * 1024 * 1024;
+                       break;
+               case 'G':
+                       gflag = 1;
+                       break;
+               case 'h':
+                       hflag = 1;
+                       usize = 0;
+                       break;
+               case 'i':
+                       iflag = 1;
+                       break;
+               case 'k':
+                       hflag = 0;
+                       usize = 1024;
+                       break;
+               case 'l':
+                       lflag = 1;
+                       break;
+               case 'm':
+                       hflag = 0;
+                       usize = 1024 * 1024;
+                       break;
+               case 'n':
+                       nflag = 1;
+                       break;
+               case 'P':
+                       Pflag = 1;
+                       break;
+               case 't':
+                       if (typelist != NULL)
+                               errx(EXIT_FAILURE,
+                                   "only one -t option may be specified.");
+                       maketypelist(optarg);
+                       break;
+               case '?':
+               default:
+                       usage();
+               }
+
+       if (gflag && (Pflag || iflag))
+               errx(EXIT_FAILURE,
+                   "only one of -G and -P or -i may be specified");
+       if (Pflag && iflag)
+               errx(EXIT_FAILURE,
+                   "only one of -P and -i may be specified");
+#if 0
+       /*
+        * The block size cannot be checked until after getbsize() is called.
+        */
+       if (Pflag && (hflag || (usize != 1024 && usize != 512)))
+               errx(EXIT_FAILURE,
+                   "non-standard block size incompatible with -P");
+#endif
+       argc -= optind;
+       argv += optind;
+
+       mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
+       if (mntsize == 0)
+               err(EXIT_FAILURE,
+                   "retrieving information on mounted file systems");
+
+       if (*argv == NULL) {
+               mntsize = regetmntinfo(&mntbuf, mntsize);
+       } else {
+               if ((mntbuf = malloc(argc * sizeof(*mntbuf))) == NULL)
+                       err(EXIT_FAILURE, "can't allocate statvfs array");
+               mntsize = 0;
+               for (/*EMPTY*/; *argv != NULL; argv++) {
+                       if (stat(*argv, &stbuf) < 0) {
+                               if ((mntpt = getmntpt(*argv)) == 0) {
+                                       warn("%s", *argv);
+                                       continue;
+                               }
+                       } else if (S_ISBLK(stbuf.st_mode)) {
+                               if ((mntpt = getmntpt(*argv)) == 0)
+                                       mntpt = *argv;
+                       } else
+                               mntpt = *argv;
+                       /*
+                        * Statfs does not take a `wait' flag, so we cannot
+                        * implement nflag here.
+                        */
+                       if (!statvfs(mntpt, &mntbuf[mntsize]))
+                               if (lflag &&
+                                   (mntbuf[mntsize].f_flag & MNT_LOCAL) == 0)
+                                       warnx("Warning: %s is not a local %s",
+                                           *argv, "file system");
+                               else if
+                                   (!selected(mntbuf[mntsize].f_fstypename,
+                                       sizeof(mntbuf[mntsize].f_fstypename)))
+                                       warnx("Warning: %s mounted as a %s %s",
+                                           *argv,
+                                           mntbuf[mntsize].f_fstypename,
+                                           "file system");
+                               else
+                                       ++mntsize;
+                       else
+                               warn("%s", *argv);
+               }
+       }
+
+       maxwidth = 0;
+       for (i = 0; i < mntsize; i++) {
+               width = (int)strlen(mntbuf[i].f_mntfromname);
+               if (width > maxwidth)
+                       maxwidth = width;
+       }
+       for (i = 0; i < mntsize; i++)
+               prtstat(&mntbuf[i], maxwidth);
+       return 0;
+}
+
+static char *
+getmntpt(const char *name)
+{
+       size_t mntsize, i;
+       struct statvfs *mntbuf;
+
+       mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
+       if (mntsize == 0)
+               err(EXIT_FAILURE, "Can't get mount information");
+       for (i = 0; i < mntsize; i++) {
+               if (!strcmp(mntbuf[i].f_mntfromname, name))
+                       return mntbuf[i].f_mntonname;
+       }
+       return 0;
+}
+
+static enum { IN_LIST, NOT_IN_LIST } which;
+
+static int
+selected(const char *type, size_t len)
+{
+       char **av;
+
+       /* If no type specified, it's always selected. */
+       if (typelist == NULL)
+               return 1;
+       for (av = typelist; *av != NULL; ++av)
+               if (!strncmp(type, *av, len))
+                       return which == IN_LIST ? 1 : 0;
+       return which == IN_LIST ? 0 : 1;
+}
+
+static void
+maketypelist(char *fslist)
+{
+       size_t i;
+       char *nextcp, **av;
+
+       if ((fslist == NULL) || (fslist[0] == '\0'))
+               errx(EXIT_FAILURE, "empty type list");
+
+       /*
+        * XXX
+        * Note: the syntax is "noxxx,yyy" for no xxx's and
+        * no yyy's, not the more intuitive "noyyy,noyyy".
+        */
+       if (fslist[0] == 'n' && fslist[1] == 'o') {
+               fslist += 2;
+               which = NOT_IN_LIST;
+       } else
+               which = IN_LIST;
+
+       /* Count the number of types. */
+       for (i = 1, nextcp = fslist;
+           (nextcp = strchr(nextcp, ',')) != NULL; i++)
+               ++nextcp;
+
+       /* Build an array of that many types. */
+       if ((av = typelist = malloc((i + 1) * sizeof(*av))) == NULL)
+               err(EXIT_FAILURE, "can't allocate type array");
+       av[0] = fslist;
+       for (i = 1, nextcp = fslist;
+           (nextcp = strchr(nextcp, ',')) != NULL; i++) {
+               *nextcp = '\0';
+               av[i] = ++nextcp;
+       }
+       /* Terminate the array. */
+       av[i] = NULL;
+}
+
+/*
+ * Make a pass over the filesystem info in ``mntbuf'' filtering out
+ * filesystem types not in ``fsmask'' and possibly re-stating to get
+ * current (not cached) info.  Returns the new count of valid statvfs bufs.
+ */
+static size_t
+regetmntinfo(struct statvfs **mntbufp, size_t mntsize)
+{
+       size_t i, j;
+       struct statvfs *mntbuf;
+
+       if (!lflag && typelist == NULL && aflag)
+               return nflag ? mntsize : (size_t)getmntinfo(mntbufp, MNT_WAIT);
+
+       mntbuf = *mntbufp;
+       j = 0;
+       for (i = 0; i < mntsize; i++) {
+               if (!aflag && (mntbuf[i].f_flag & MNT_IGNORE) != 0)
+                       continue;
+               if (lflag && (mntbuf[i].f_flag & MNT_LOCAL) == 0)
+                       continue;
+               if (!selected(mntbuf[i].f_fstypename,
+                   sizeof(mntbuf[i].f_fstypename)))
+                       continue;
+               if (nflag)
+                       mntbuf[j] = mntbuf[i];
+               else {
+                       struct statvfs layerbuf = mntbuf[i];
+                       (void)statvfs(mntbuf[i].f_mntonname, &mntbuf[j]);
+                       /*
+                        * If the FS name changed, then new data is for
+                        * a different layer and we don't want it.
+                        */
+                       if (memcmp(layerbuf.f_mntfromname,
+                           mntbuf[j].f_mntfromname, MNAMELEN))
+                               mntbuf[j] = layerbuf;
+               }
+               j++;
+       }
+       return j;
+}
+
+static void
+prthumanval(int64_t bytes, const char *pad)
+{
+       char buf[6];
+
+       (void)humanize_number(buf, sizeof(buf) - (bytes < 0 ? 0 : 1),
+           bytes, "", HN_AUTOSCALE,
+           HN_B | HN_NOSPACE | HN_DECIMAL);
+
+       (void)printf("%s %6s", pad, buf);
+}
+
+static void
+prthuman(struct statvfs *sfsp, int64_t used, int64_t bavail)
+{
+
+       prthumanval((int64_t)(sfsp->f_blocks * sfsp->f_frsize), "   ");
+       prthumanval((int64_t)(used * sfsp->f_frsize), "    ");
+       prthumanval((int64_t)(bavail * sfsp->f_frsize), "    ");
+}
+
+/*
+ * Convert statvfs returned filesystem size into BLOCKSIZE units.
+ * Attempts to avoid overflow for large filesystems.
+ */
+#define fsbtoblk(num, fsbs, bs)                                        \
+       (((fsbs) != 0 && (uint64_t)(fsbs) < (uint64_t)(bs)) ?   \
+           (int64_t)(num) / (int64_t)((bs) / (fsbs)) :         \
+           (int64_t)(num) * (int64_t)((fsbs) / (bs)))
+
+/*
+ * Print out status about a filesystem.
+ */
+static void
+prtstat(struct statvfs *sfsp, int maxwidth)
+{
+       static long blocksize;
+       static int headerlen, timesthrough;
+       static const char *header;
+       static const char full[] = "100";
+       static const char empty[] = "  0";
+       int64_t used, availblks, inodes;
+       int64_t bavail;
+       char pb[64];
+
+       if (gflag) {
+               /*
+                * From SunOS-5.6:
+                *
+                * /var               (/dev/dsk/c0t0d0s3 ):         8192 block size          1024 frag size
+                *   984242 total blocks     860692 free blocks   859708 available         249984 total files
+                *   248691 free files      8388611 filesys id
+                *      ufs fstype       0x00000004 flag             255 filename length
+                *
+                */
+               (void)printf("%10s (%-12s): %7ld block size %12ld frag size\n",
+                   sfsp->f_mntonname, sfsp->f_mntfromname,
+                   sfsp->f_iosize,     /* On UFS/FFS systems this is
+                                        * also called the "optimal
+                                        * transfer block size" but it
+                                        * is of course the file
+                                        * system's block size too.
+                                        */
+                   sfsp->f_bsize);     /* not so surprisingly the
+                                        * "fundamental file system
+                                        * block size" is the frag
+                                        * size.
+                                        */
+               (void)printf("%10" PRId64 " total blocks %10" PRId64
+                   " free blocks  %10" PRId64 " available\n",
+                   (uint64_t)sfsp->f_blocks, (uint64_t)sfsp->f_bfree,
+                   (uint64_t)sfsp->f_bavail);
+               (void)printf("%10" PRId64 " total files  %10" PRId64
+                   " free files %12lx filesys id\n",
+                   (uint64_t)sfsp->f_ffree, (uint64_t)sfsp->f_files,
+                   sfsp->f_fsid);
+               (void)printf("%10s fstype  %#15lx flag  %17ld filename "
+                   "length\n", sfsp->f_fstypename, sfsp->f_flag,
+                   sfsp->f_namemax);
+               (void)printf("%10lu owner %17" PRId64 " syncwrites %12" PRId64
+                   " asyncwrites\n\n", (unsigned long)sfsp->f_owner,
+                   sfsp->f_syncwrites, sfsp->f_asyncwrites);
+
+               /*
+                * a concession by the structured programming police to the
+                * indentation police....
+                */
+               return;
+       }
+       if (maxwidth < 12)
+               maxwidth = 12;
+       if (++timesthrough == 1) {
+               switch (blocksize = usize) {
+               case 1024:
+                       header = Pflag ? "1024-blocks" : "1K-blocks";
+                       headerlen = (int)strlen(header);
+                       break;
+               case 1024 * 1024:
+                       header = "1M-blocks";
+                       headerlen = (int)strlen(header);
+                       break;
+               case 1024 * 1024 * 1024:
+                       header = "1G-blocks";
+                       headerlen = (int)strlen(header);
+                       break;
+               default:
+                       if (hflag) {
+                               header = "Size";
+                               headerlen = (int)strlen(header);
+                       } else
+                               header = getbsize(&headerlen, &blocksize);
+                       break;
+               }
+               if (Pflag) {
+                       /*
+                        * either:
+                        *  "Filesystem 1024-blocks Used Available Capacity Mounted on\n"
+                        * or:
+                        *  "Filesystem 512-blocks Used Available Capacity Mounted on\n"
+                        */
+                       if (blocksize != 1024 && blocksize != 512)
+                               errx(EXIT_FAILURE,
+                                   "non-standard block size incompatible with -P");
+                       (void)printf("Filesystem %s Used Available Capacity "
+                           "Mounted on\n", header);
+               } else {
+                       (void)printf("%-*.*s %s       Used      Avail %%Cap",
+                           maxwidth - (headerlen - 10),
+                           maxwidth - (headerlen - 10),
+                           "Filesystem", header);
+                       if (iflag)
+                               (void)printf("    iUsed   iAvail %%iCap");
+                       (void)printf(" Mounted on\n");
+               }
+       }
+       used = sfsp->f_blocks - sfsp->f_bfree;
+       bavail = sfsp->f_bfree - sfsp->f_bresvd;
+       availblks = bavail + used;
+       if (Pflag) {
+               assert(hflag == 0);
+               assert(blocksize > 0);
+               /*
+                * "%s %d %d %d %s %s\n", <file system name>, <total space>,
+                * <space used>, <space free>, <percentage used>,
+                * <file system root>
+                */
+               (void)printf("%s %" PRId64 " %" PRId64 " %" PRId64 " %s%% %s\n",
+                   sfsp->f_mntfromname,
+                   fsbtoblk(sfsp->f_blocks, sfsp->f_frsize, blocksize),
+                   fsbtoblk(used, sfsp->f_frsize, blocksize),
+                   fsbtoblk(bavail, sfsp->f_frsize, blocksize),
+                   availblks == 0 ? full : strspct(pb, sizeof(pb), used,
+                   availblks, 0), sfsp->f_mntonname);
+               /*
+                * another concession by the structured programming police to
+                * the indentation police....
+                *
+                * Note iflag cannot be set when Pflag is set.
+                */
+               return;
+       }
+
+       (void)printf("%-*.*s ", maxwidth, maxwidth, sfsp->f_mntfromname);
+
+       if (hflag)
+               prthuman(sfsp, used, bavail);
+       else
+               (void)printf("%10" PRId64 " %10" PRId64 " %10" PRId64,
+                   fsbtoblk(sfsp->f_blocks, sfsp->f_frsize, blocksize),
+                   fsbtoblk(used, sfsp->f_frsize, blocksize),
+                   fsbtoblk(bavail, sfsp->f_frsize, blocksize));
+       (void)printf(" %3s%%",
+           availblks == 0 ? full :
+           strspct(pb, sizeof(pb), used, availblks, 0));
+       if (iflag) {
+               inodes = sfsp->f_files;
+               used = inodes - sfsp->f_ffree;
+               (void)printf(" %8jd %8jd %3s%%",
+                   (intmax_t)used, (intmax_t)sfsp->f_ffree,
+                   inodes == 0 ? (used == 0 ? empty : full) :
+                   strspct(pb, sizeof(pb), used, inodes, 0));
+       }
+       (void)printf(" %s\n", sfsp->f_mntonname);
+}
+
+static void
+usage(void)
+{
+
+       (void)fprintf(stderr,
+           "Usage: %s [-aGgln] [-hkm|-ihkm|-Pk] [-t type] [file | "
+           "file_system ...]\n",
+           getprogname());
+       exit(1);
+       /* NOTREACHED */
+}
index 746e7d4370eb61ba1b1f63c392dc18e9e506dc40..57592b402d927bf5812959a9585ecd0980a0e6d0 100644 (file)
@@ -6,7 +6,7 @@ SUBDIR= add_route arp ash at backup btrace \
        cawf cd cdprobe cpp \
        chmod chown ci cleantmp cmp co \
        compress cp crc cron crontab \
-       dd decomp16 DESCRIBE devmand devsize df dhcpd \
+       dd decomp16 DESCRIBE devmand devsize dhcpd \
        dhrystone diff diskctl dumpcore \
        eject factor fbdctl \
        find fix format fortune fsck.mfs \
diff --git a/commands/df/Makefile b/commands/df/Makefile
deleted file mode 100644 (file)
index a77a7bf..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-PROG=  df
-MAN=
-
-.include <bsd.prog.mk>
diff --git a/commands/df/df.c b/commands/df/df.c
deleted file mode 100644 (file)
index f013772..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-/* df - disk free block printout       Author: Andy Tanenbaum
- *
- * 91/04/30 Kees J. Bot (kjb@cs.vu.nl)
- *     Map filename arguments to the devices they live on.
- *     Changed output to show percentages.
- *
- * 92/12/12 Kees J. Bot
- *     Posixized.  (Almost, the normal output is in kilobytes, it should
- *     be 512-byte units.  'df -P' and 'df -kP' are as it should be.)
- *
- */
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/statvfs.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <minix/minlib.h>
-
-struct mtab {  /* List of mounted devices from /etc/mtab. */
-       struct mtab     *next;
-       dev_t           device;
-       char            *devname;
-       char            *mountpoint;
-} *mtab= NULL;
-
-struct mtab *searchtab(char *name);
-static void readmtab(const char *type);
-int df(const struct mtab *mt);
-
-int iflag= 0;  /* Focus on inodes instead of blocks. */
-int Pflag= 0;  /* Posix standard output. */
-int kflag= 0;  /* Output in kilobytes instead of 512 byte units for -P. */
-int istty;     /* isatty(1) */
-
-void usage(void)
-{
-       fprintf(stderr, "Usage: df [-ikP] [-t type] [device]...\n");
-       exit(1);
-}
-
-int unitsize;
-
-int main(int argc, char *argv[])
-{
-  int i;
-  struct mtab *mt;
-  char *type= "dev";
-  int ex= 0;
-
-  while (argc > 1 && argv[1][0] == '-') {
-       char *opt= argv[1]+1;
-
-       while (*opt != 0) {
-               switch (*opt++) {
-               case 'i':       iflag= 1;       break;
-               case 'k':       kflag= 1;       break;
-               case 'P':       Pflag= 1;       break;
-               case 't':
-                       if (argc < 3) usage();
-                       type= argv[2];
-                       argv++;
-                       argc--;
-                       break;
-               default:
-                       usage();
-               }
-       }
-       argc--;
-       argv++;
-  }
-
-  istty= isatty(1);
-
-  readmtab(type);
-  if(!Pflag || (Pflag && kflag)) unitsize = 1024;
-  else unitsize = 512;
-
-  if (Pflag) {
-       if (!iflag)
-               printf("\
-Filesystem    %4d-blocks      Used    Available  Capacity  Mounted on\n",
-                       unitsize);
-       else
-               printf("\
-Filesystem         Inodes       IUsed      IFree    %%IUsed    Mounted on\n"
-               );
-  } else {
-       printf("%s\n", !iflag ? "\
-Filesystem      Size (kB)       Free       Used    % Files%   Mounted on" : "\
-Filesystem          Files       Free       Used    % BUsed%   Mounted on"
-       );
-  }
-
-  if (argc == 1) {
-       for (mt= mtab; mt != NULL; mt= mt->next) ex |= df(mt);
-  } else {
-       for (i = 1; i < argc; i++) ex |= df(searchtab(argv[i]));
-  }
-  exit(ex);
-}
-
-static void readmtab(const char *type)
-/* Turn the mounted file table into a list. */
-{
-  struct mtab **amt= &mtab, *new;
-  struct stat st;
-  char devname[PATH_MAX], mountpoint[PATH_MAX], version[MNTNAMELEN],
-       rw_flag[MNTFLAGLEN];
-
-  if (load_mtab("df") < 0) exit(1);
-
-  while (get_mtab_entry(devname, mountpoint, version, rw_flag),
-                                                         devname[0] != 0) {
-       if (strcmp(type, "dev") != 0 && strcmp(type, version) != 0) continue;
-
-       /* Make new list cell. */
-       if ((new= (struct mtab *) malloc(sizeof(*new))) == NULL
-         || (new->devname= (char *) malloc(strlen(devname) + 1)) == NULL
-         || (new->mountpoint= (char *) malloc(strlen(mountpoint) + 1)) == NULL
-       ) break;
-
-       if (strcmp(devname, "none") != 0 && stat(devname, &st) == 0 &&
-         S_ISBLK(st.st_mode)) {
-               new->device= st.st_rdev;
-       } else if (stat(mountpoint, &st) == 0) {
-               new->device= st.st_dev;
-       }
-       strcpy(new->devname, devname);
-       strcpy(new->mountpoint, mountpoint);
-
-       *amt= new;              /* Add the cell to the end. */
-       amt= &new->next;
-       *amt= NULL;
-  }
-}
-
-struct mtab *searchtab(char *name)
-/* See what we can do with a user supplied name, there are three possibilities:
- * 1. It's a device and it is in the mtab: Return mtab entry.
- * 2. It's a file and lives on a device in the mtab: Return mtab entry.
- * 3. It's anything else: Return something df() will choke on.
- */
-{
-  static struct mtab unknown;
-  struct mtab *mt;
-  struct stat st;
-
-  unknown.devname= name;
-  unknown.mountpoint= "";
-
-  if (stat(name, &st) < 0) return &unknown;    /* Case 3. */
-
-  unknown.device= S_ISBLK(st.st_mode) ? st.st_rdev : st.st_dev;
-
-  for (mt= mtab; mt != NULL; mt= mt->next) {
-       if (unknown.device == mt->device)
-               return mt;                      /* Case 1 & 2. */
-  }
-
-  return &unknown;                             /* Case 3. */
-}
-
-/* (num / tot) in percentages rounded up. */
-#define percent(num, tot) \
- ((tot > 0) ? ((int) ((100ULL * (num) + ((tot) - 1)) / (tot))) : 0)
-
-int df(const struct mtab *mt)
-{
-  fsblkcnt_t totblocks, busyblocks;
-  fsfilcnt_t totinodes, busyinodes;
-  struct statvfs sv;
-  int n;
-
-  if (statvfs(mt->mountpoint, &sv) < 0) {
-       fprintf(stderr, "df: %s: %s\n", mt->devname, strerror(errno));
-       return(1);
-  }
-
-  /* Print results. */
-  printf("%s", mt->devname);
-  n= strlen(mt->devname);
-  if (n > 15 && istty) { putchar('\n'); n= 0; }
-  while (n < 15) { putchar(' '); n++; }
-
-  totblocks = sv.f_blocks;
-  busyblocks = sv.f_blocks - sv.f_bfree;
-
-  busyblocks = busyblocks * (sv.f_bsize/512) / (unitsize/512);
-  totblocks = totblocks * (sv.f_bsize/512) / (unitsize/512);
-
-  totinodes = sv.f_files;
-  busyinodes = sv.f_files - sv.f_ffree;
-
-  if (!Pflag && !iflag) {
-       printf(" %9ld  %9ld  %9ld %3d%%   %3d%%   %s\n",
-               totblocks,                              /* Blocks */
-               totblocks - busyblocks,                 /* free */
-               busyblocks,                             /* used */
-               percent(busyblocks, totblocks),         /* % */
-               percent(busyinodes, totinodes),         /* FUsed% */
-               mt->mountpoint                          /* Mounted on */
-       );
-  }
-  if (!Pflag && iflag) {
-       printf(" %9ld  %9ld  %9ld %3d%%   %3d%%   %s\n",
-               totinodes,                              /* Files */
-               totinodes - busyinodes,                 /* free */
-               busyinodes,                             /* used */
-               percent(busyinodes, totinodes),         /* % */
-               percent(busyblocks, totblocks),         /* BUsed% */
-               mt->mountpoint                          /* Mounted on */
-       );
-  }
-  if (Pflag && !iflag) {
-       printf(" %9ld   %9ld  %9ld     %4d%%    %s\n",
-               totblocks,                              /* Blocks */
-               busyblocks,                             /* Used */
-               totblocks - busyblocks,                 /* Available */
-               percent(busyblocks, totblocks),         /* Capacity */
-               mt->mountpoint                          /* Mounted on */
-       );
-  }
-  if (Pflag && iflag) {
-       printf(" %9ld   %9ld  %9ld     %4d%%    %s\n",
-               totinodes,                              /* Inodes */
-               busyinodes,                             /* IUsed */
-               totinodes - busyinodes,                 /* IAvail */
-               percent(busyinodes, totinodes),         /* Capacity */
-               mt->mountpoint                          /* Mounted on */
-       );
-  }
-  return(0);
-}
index 918e228f89896cd83d523e2e7e550b7c856afdc5..173aacbe55894065b34d0fbfa9a0feae2152f591 100644 (file)
@@ -412,9 +412,9 @@ then
 
        # Get sizes and space availability while the file systems are still
        # mounted. Otherwise we have to mount them again just for this.
-       required_root_space=`df -k /dev/$root | awk '{print $4}' | tail -n 1`
-       free_root_space=`df -k /dev/$root | awk '{print $3}' | tail -n 1`
-       free_usr_space=`df -k /dev/$usr | awk '{print $3}' | tail -n 1`
+       required_root_space=`df -kP /dev/$root | awk '{print $3}' | tail -n 1`
+       free_root_space=`df -kP /dev/$root | awk '{print $4}' | tail -n 1`
+       free_usr_space=`df -kP /dev/$usr | awk '{print $4}' | tail -n 1`
 
        umount /mnt/usr && umount /mnt || exit
 
index 3bbf4e6b6852daf8c0b458478810558bc362b0be..eb77670d4580fedd9287659c44f9d6609d8c643b 100644 (file)
@@ -18,6 +18,7 @@
 ./bin/cpio                             minix-sys
 ./bin/date                             minix-sys
 ./bin/dev2name                         minix-sys       obsolete
+./bin/df                               minix-sys
 ./bin/echo                             minix-sys
 ./bin/ed                               minix-sys
 ./bin/expr                             minix-sys
 ./usr/bin/DESCRIBE                     minix-sys
 ./usr/bin/devmand                      minix-sys
 ./usr/bin/devsize                      minix-sys
-./usr/bin/df                           minix-sys
+./usr/bin/df                           minix-sys       obsolete
 ./usr/bin/dhcpd                                minix-sys
 ./usr/bin/dhrystone                    minix-sys
 ./usr/bin/diff                         minix-sys
 ./usr/man/man3/strnvis.3                       minix-sys
 ./usr/man/man3/strnvisx.3                      minix-sys
 ./usr/man/man3/strpbrk.3                                       minix-sys
+./usr/man/man3/strpct.3                                minix-sys
 ./usr/man/man3/strptime.3                                      minix-sys
 ./usr/man/man3/strrchr.3                                       minix-sys
 ./usr/man/man3/strsep.3                                        minix-sys
index 601fc4d813a1f91c02b0b71279d59c5c4c866487..8994b79aa84d642900b7b3568eab6f9772633d50 100644 (file)
@@ -42,7 +42,7 @@ SRCS+=        efun.c \
        passwd.c pw_scan.c pidfile.c pidlock.c pty.c \
        raise_default_signal.c \
        secure_path.c stat_flags.c \
-       ttyaction.c \
+       strpct.c ttyaction.c \
 
 MAN=   efun.3 \
        getmntopts.3 \
@@ -50,7 +50,7 @@ MAN=  efun.3 \
        opendisk.3 openpty.3 pidfile.3 pidlock.3 \
        pw_getconf.3 pw_init.3 pw_lock.3 secure_path.3 \
        raise_default_signal.3 \
-       snprintb.3 stat_flags.3 ttyaction.3 \
+       snprintb.3 stat_flags.3 strpct.3 ttyaction.3 \
        util.3
 .endif
 
index 9460797de87eb047fb302dc52e49770bbe4819bb..69d2d8a3510a0124ec23c109b2f4e70ce22e0563 100644 (file)
@@ -2,7 +2,7 @@ MAN=    ash.1 at.1 \
        bsfilt.1 cawf.1 chgrp.1 \
        chmod.1 cmp.1 compress.1 \
        cp.1 crc.1 crontab.1 dd.1 \
-       df.1 dhrystone.1 dosdir.1 dosread.1 doswrite.1 \
+       dhrystone.1 dosdir.1 dosread.1 doswrite.1 \
        dumpcore.1 eject.1 \
        factor.1 \
        flexdoc.1 format.1 fortune.1 \
diff --git a/man/man1/df.1 b/man/man1/df.1
deleted file mode 100644 (file)
index 7c9d757..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-.TH DF 1
-.SH NAME
-df \- report on free disk space
-.SH SYNOPSIS
-\fBdf\fP [\fB\-ikP\fP] [\fB\-t\fP \fItype\fP] [\fIfile\fP ...]
-.SH DESCRIPTION
-.B Df
-lists the amount of free space on the currently mounted devices (no arguments),
-or the devices given as arguments.  If the argument is not a device then the
-device it resides on is listed.
-.SH OPTIONS
-Without options,
-.B df
-will give a listing like this:
-.sp
-.nf
-.if t .ft C
-Filesystem    1k-Blocks     free     used    %  FUsed%  Mounted on
-/dev/c0d0p1s0      1440      635      805  56%    26%   /
-/dev/c0d0p1s1     32768    32390      378   2%     1%   /tmp
-/dev/c0d0p1s2    784657   517809   266848  35%    29%   /usr
-.if t .ft R
-.fi
-.PP
-The
-.B \-i
-option shifts the focus to the files:
-.sp
-.nf
-.if t .ft C
-Filesystem        Files     free     used    %  BUsed%  Mounted on
-/dev/c0d0p1s0      1024      759      265  26%    56%   /
-/dev/c0d0p1s1      5472     5468        4   1%     2%   /tmp
-/dev/c0d0p1s2     65535    46734    18801  29%    35%   /usr
-.if t .ft R
-.fi
-.PP
-Option
-.B \-P
-makes
-.B df
-use \s-2POSIX\s+2 defined output in 512 byte units:
-.sp
-.nf
-.if t .ft C
-Filesystem     512-blocks    Used  Available  Capacity  Mounted on
-/dev/c0d0p1s0      2880      1628     1252       57%    /
-/dev/c0d0p1s1     65536       756    64780        2%    /tmp
-/dev/c0d0p1s2   1569314    533748  1035566       35%    /usr
-.if t .ft R
-.fi
-.PP
-With
-.B \-k
-1024 byte units would be used.
-.PP
-The
-.B \-t
-option limits
-.BR df 's
-output to file systems of the given
-.IR type .
-.SH FILES
-.TP 15n
-.B /etc/mtab
-List of mounted file systems.
-.SH "SEE ALSO"
-.BR du (1),
-.BR fstab (5).
-.SH BUGS
-Default output should also be in 512 byte units says \s-2POSIX\s+2.
-.SH AUTHOR
-Kees J. Bot (kjb@cs.vu.nl)
-.\"
-.\" $PchId: df.1,v 1.5 1998/07/27 19:48:47 philip Exp $
index 62104e61d74095c1b9cd43cbf82596766f90c71d..e55078b9ea563fad35b9b48502c5e5c1ff16c389 100644 (file)
@@ -8,6 +8,7 @@
 # netbsdpath: path in BSD source tree (starting from src/)
 2012/10/17 12:00:00,bin/cat
 2011/08/27 12:55:09,bin/date
+2013/08/19 12:00:00,bin/df
 2012/10/17 12:00:00,bin/echo
 2012/01/16 18:47:57,bin/ed
 2012/10/17 12:00:00,bin/expr
index 5da125b752615021f9528199e6d4bb284d38a166..80b2b78c839c54a5033eb561c6463bb5918c7c8c 100755 (executable)
@@ -298,7 +298,7 @@ mount $TMPDISKUSR $RELEASEMNTDIR/usr || exit
 echo " * Copying files from staging to image"
 ##########################################################################
 synctree -f $RELEASEDIR $RELEASEMNTDIR > /dev/null || true
-expr `df -k $TMPDISKUSR | tail -1 | awk '{ print $4 }'` - $extrakb >$RELEASEMNTDIR/.usrkb
+expr `df -kP $TMPDISKUSR | tail -1 | awk '{ print $3 }'` - $extrakb >$RELEASEMNTDIR/.usrkb
 
 echo " * Unmounting $TMPDISKUSR from $RELEASEMNTDIR/usr"
 umount $TMPDISKUSR || exit