C News patch of 7-Sep-1990

Jon Zeeff zeeff at b-tech.ann-arbor.mi.us
Wed Oct 10 23:29:06 AEST 1990


>>[...] The package installed smoothly
>>except for problems with one file -- spacefor.
>
>	Speaking of which, has anyone hacked the code from nntpd that reads
>free space out of the superblock and made a replacement for spacefor ? If
>anyone has, I'll be happy to test it under a few versions of Ultrix. :)

Not quite what you wanted, but this might work work.  Actually, I find 
this spacefor more portable (and much faster) than the cnews version.  

/*
  Spacefor.c V1.1

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

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

  BSD added by Jon Zeeff (zeeff at b-tech.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 BLOCKSIZE 1024   /* try 512 for Sys V and 1024 for bsd */

/* Make these the mount points */

#define DIR_INCOMING	"/news"
#define DIR_ARTS	"/news"
#define DIR_NEWSCTL	"/u"
#define DIR_OUTGOING	"/u"
#define DIR_ARCHIVE	"/news"

#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>

#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
#define HAVE_STATFS
#include <sys/vfs.h>
struct statfs statfsb;
#define FREEBLOCKS statfsb.f_bavail
#define FREENODES statfsb.f_ffree
#endif

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
    if (statfs(dirname, &statfsb, sizeof(statfsb), 0) != 0) {
	perror("statfs failed");
	exit(1);
    }
#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);
}



-- 
Jon Zeeff (NIC handle JZ)	 zeeff at b-tech.ann-arbor.mi.us



More information about the Comp.sources.bugs mailing list