[news.software.b] Spacefor.c for DECstation 3100's...

stealth@caen.engin.umich.edu (Mike Pelletier) (07/27/90)

As you may know, the spacefor.c program from the C-news source library will
not compile on DECstation 3100's and their kin, due to the fact that the
statfs() call uses a different style data structre than other machines.
Here's the source for a fixed version that's currently running on my DECstation
3100 news server.  (The patch was almost as long as the source...)
Enjoy....
	-Mike.

------->8 cut here 8<-----------
/*
  Spacefor.c V1.2

  Replacement for spacefor (shell script) in cnews.
  Change the values below as appropriate.

  Denny Page	July 25, 1989  (denny@mcmi.uucp)

  BSD added by Jon Zeeff (zeeff@b-tech.ann-arbor.mi.us)

  DEC Ultrix added by Mike Pelletier (stealth@m-net.ann-arbor.mi.us)

 About how many things of $1 bytes will fit in the available space for
 stuff of type $2 ("incoming", "articles", "control", "outbound $3",
 or "archive") without cramping things too badly?

*/

#define HAVE_STATFS	/* If you have statfs() syscall */
#define BSD		/* Define on BSD sites */
#define ULTRIX		/* Define on sites running DEC Ultrix */
#define BLOCKSIZE 1024	/* try 512 for Sys V and 1024 for bsd */

/* Make these the mount points */

#define DIR_INCOMING	"/usr/var"
#define DIR_ARTS	"/usr/var"
#define DIR_NEWSCTL	"/usr"
#define DIR_OUTGOING	"/usr/var"
#define DIR_ARCHIVE	"/usr"

#define MIN_INCOMING 	400
#define MIN_ARTS	400
#define MIN_NEWSCTL	3000
#define MIN_OUTGOING 	400
#define MIN_ARCHIVE 	400

/***************************************************************************/

#include	<sys/types.h>
#include	<stdio.h>

#ifdef ULTRIX
#ifndef BSD
#define BSD
#endif
#ifndef HAVE_STATFS
#define HAVE_STATFS
#endif
#endif

#ifndef BSD
#ifdef HAVE_STATFS
#include <sys/statfs.h>
#define FREEBLOCKS statfsb.f_bfree
#define FREENODES statfsb.f_ffree
struct statfs statfsb;

#else /* !HAVE_STATFS */
#include <sys/stat.h>
#include <ustat.h>
#define FREEBLOCKS ustatb.f_tfree
#define FREENODES ustatb.f_tinode
struct stat statb;
struct ustat ustatb;
#endif /* HAVE_STATFS */
#else	/* BSD */

#ifdef ULTRIX
#include <sys/param.h>
#include <sys/mount.h>
struct fs_data statfsb;
#define FREEBLOCKS statfsb.fd_req.bfreen
#define FREENODES statfsb.fd_req.gfree

#else /* !ULTRIX */
#define HAVE_STATFS
#include <sys/vfs.h>
struct statfs statfsb;
#define FREEBLOCKS statfsb.f_bavail
#define FREENODES statfsb.f_ffree
#endif /* ULTRIX */
#endif /* BSD */

main(argc, argv)
    int argc;
    char **argv;
{
    long size, minblocks, available, atol();
    char *dirname;

    if (argc < 3) {
	fprintf(stderr, "usage: %s size place\n", argv[0]);
	exit(2);
    }

    if ((size = atol(argv[1])) == 0) {
	printf("10000\n");
	exit(0);
    }

    if (! strcmp (argv[2], "incoming")) {
	dirname = DIR_INCOMING;
	minblocks = MIN_INCOMING;
    }
    else if (! strcmp (argv[2], "articles")) {
	dirname = DIR_ARTS;
	minblocks = MIN_ARTS;
    }
    else if (! strcmp (argv[2], "control")) {
	dirname = DIR_NEWSCTL;
	minblocks = MIN_NEWSCTL;
    }
    else if (! strcmp (argv[2], "outbound")) {
	dirname = DIR_OUTGOING;
	minblocks = MIN_OUTGOING;
    }
    else if (! strcmp (argv[2], "archive")) {
	dirname = DIR_ARCHIVE;
	minblocks = MIN_ARCHIVE;
    }
    else {
	fprintf(stderr, "%s: bad argument type `%s'\n",
		       argv[0], argv[2]);
	exit(2);
    }


#ifdef HAVE_STATFS
#ifndef ULTRIX
    if (statfs(dirname, &statfsb, sizeof(statfsb), 0) != 0) {
	perror("statfs failed");
	exit(1);
    }
#else /* ULTRIX */
    if (statfs(dirname, &statfsb) != 1) {
	perror("statfs failed");
	exit(1);
    }
#endif
#else /* !HAVE_STATFS */
    if (stat(dirname, &statb) != 0) {
	perror("stat failed");
	exit(1);
    }
    if (ustat(statb.st_dev, &ustatb) != 0) {
	perror("ustat failed");
	exit(1);
    }
#endif /* HAVE_STATFS */

    available = ((FREEBLOCKS - minblocks) * BLOCKSIZE) / size;

    if (available <= 0 || FREENODES == 0)
	available = 0;

    if (available > 10000)
       available = 10000;

    printf("%ld\n", available);
    exit(0);
}
------->8 cut here 8<-----------


--
Michael V. Pelletier            | "We live our lives with our hands on the
 CAEN UseNet News Administrator |  rear-view mirror, striving to get a better
 Systems Group Programmer       |  view of the road behind us.  Imagine what's
                                |  possible if we look ahead and steer..."

henry@zoo.toronto.edu (Henry Spencer) (07/30/90)

In article <1990Jul27.143341.28425@caen.engin.umich.edu> stealth@caen.engin.umich.edu (Mike Pelletier) writes:
>As you may know, the spacefor.c program from the C-news source library will
>not compile on DECstation 3100's and their kin...

A small clarification:  there is no spacefor.c in the C News distribution,
as all implementations of spacefor supplied with C News are still shell
files.  However, I am seriously considering changing this, as the diversity
of df output formats approaches the ridiculous, and it looks like it may
actually be simpler (!) to use the C interface on systems that supply it.
At least there are only three or four variations on it...  Sigh.
-- 
The 486 is to a modern CPU as a Jules  | Henry Spencer at U of Toronto Zoology
Verne reprint is to a modern SF novel. |  henry@zoo.toronto.edu   utzoo!henry