Non compressing news batcher.
Lee McLoughlin
lee at kcl-cs.UUCP
Thu Feb 7 12:27:48 AEST 1985
I had the situation where I had free links to other sites but
virtually no free CPU/disc to store the uucp queues in. The
standard batchers seem to make copies of the news in the queue
area so I couldn't run them. It seems to truck along ok. Feel
free to hack it about, just mail me back any interesting mods
please. Undoubtly the include files will be wrong for *something*
out there, so look out for them.
In case you're wondering what you gain bear in mind the
following. Ten incoming news articles being fed to a single
neighbour using the :U: flag to the sys file will generate 10
calls to uux and involve 20 files in the uucp queue. Normally
with lotsend you'll have a single call to uux and only 2 files in
the uucp queue. This saves 9 uux calls and 18 blocks. Now given
that there are something like 200-300 articles a day and this
represents quite a saving.
However even with this I've come to the conclusion that you can't
fetch news and feed it onto three sites over 2 1200Bd lines
overnight only. So I'll have to get my Prime version of UUCP
running.
/*
* Simple news batcher.
* Rather than running compress and all that stuff simply submit a
* command like:
* uux -r -c remote!rnewsall !/news/net/oa/1 !/news/net/ai/276
* where rnewsall is a simple script which calls rnews on all its arguments.
* Its input can be generated by a news sysfile line like:
* ic-cs:uk,eunet,net,mod,fa:F:/usr/lib/news/lots.ic-cs
* Lotsend itself should be called (by cron) a few minutes before news is
* due to be sent. For example the following crontab entry.
0 0,1,2,3,4,5,6,7,8,23 * * * /usr/lib/news/lotsend ic-cs | su news
*
* CAREFULL: lotsend will zap the existing lots list. It also doesn't
* run any commands itself but rather prints them so that the above style
* of crontab entry will work.
*
* Note that you do not get the transmission saving that compress style
* batchers give you but you do save more blockspace since copies of the data
* are never stored in the spool area.
*
* L.M.McLoughlin.
*
* rnewsall:
for i
do if test -r $i
then rnews < $i
rm -f $i
else echo $0: failed to find $i >> $NEWS/rnewsall.log
fi
done
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#define BLK 512 /* Don't fiddle with this */
#define MAXBLKS 200
#define MAXARGS 20
int maxblks = MAXBLKS; /* Max blks of data per uux call. */
long maxsize;
int maxargs = MAXARGS; /* Max no. of args per uux call. */
char *site; /* Name of site to use */
/* Where the lists the news generates are kept
* This program MUST have write permission on that directory.
* Preferably run this program under the news id.
*/
#define LOTSDIR "/usr/lib/news"
main( argc, argv )
int argc;
char **argv;
{
int ma, mb;
FILE *lf;
char *lt, lotname[ BUFSIZ ];
char filename[ BUFSIZ ];
while( argv++, --argc ){
if( argv[ 0 ][ 0 ] != '-' )
break;
switch( argv[ 0 ][ 1 ] ){
case 'a':
ma = 0;
sscanf( &argv[ 0 ][ 2 ], "%d", &ma );
if( 0 < ma && ma <= MAXARGS )
maxargs = ma;
break;
case 'b':
mb = 0;
sscanf( &argv[ 0 ][ 2 ], "%d", &mb );
if( 0 < mb && mb <= MAXBLKS )
maxblks = mb;
break;
}
}
maxsize = (long)maxblks * BLK;
if( argc == 0 ){
fprintf( stderr, "Usage: lotsend [-aMAXARGS] [-bMAXBLKS] file\n" );
exit( 1 );
}
if( chdir( LOTSDIR ) == -1 ){
fprintf( stderr, "lotsend: cannot chdir to %s\n", LOTSDIR );
exit( 2 );
}
/* Move the given lot file into a temporary to avoid problems
* with inews updates.
*/
site = argv[ 0 ];
sprintf( lotname, "lots.%s", site );
lt = mktemp( "LOTS.XXXXXX" );
if( link( lotname, lt ) == -1 ){
fprintf( stderr, "lotsend: cannot link %s to %s\n",
lotname, lt );
exit( 3 );
}
unlink( lotname );
if( (lf = fopen( lt, "r" )) == NULL ){
fprintf( stderr, "lotsend: cannot open to %s\n", lt );
exit( 4 );
}
init(); /* Initialize the command generator */
while( fgets( filename, BUFSIZ, lf ) != NULL ){
filename[ strlen( filename ) - 1 ] = '\0';
addname( filename );
}
outcmd();
fclose( lf );
unlink( lt );
exit( 0 );
}
long size_sofar = 0;
int args_sofar = 0;
char cmd[ 5*1024 ];
/* Initialize the cmd.
*/
init()
{
size_sofar = 0l;
args_sofar = 0;
sprintf( cmd, "uux -r -z -c %.7s!rnewsall ", site );
}
/* Add the name to the list to be given to uux.
* If maxargs name in the list call outcmd.
* If the total size of all files > maxblks then call outcmd
*/
addname( name )
char *name;
{
struct stat sb;
long tot;
if( stat( name, &sb ) == -1 )
return; /* Its gone! Ignore it */
if( (tot = sb.st_size + size_sofar) > maxsize )
outcmd(); /* Send what we have sofar */
size_sofar = tot;
strcat( cmd, "!" );
strcat( cmd, name );
strcat( cmd, " " );
args_sofar++;
if( args_sofar >= maxargs )
outcmd();
}
outcmd()
{
if( args_sofar == 0 )
return;
printf( "%s\n", cmd );
init();
}
--
UKUUCP SUPPORT Lee McLoughlin <UK>!ukc!lmcl
kcl-cs!lee
"What you once thought was only a nightmare is now a reality!"
More information about the Comp.sources.unix
mailing list