#ifdef ournix #include "ournix.h" #endif char sccsID[] = "@(#) filesize.c, V1.4, Copyright Julian H. Stacey, Munich, 23rd October 1988.\n" ; /* see manual for documentation */ #include #include #include char **ARGV ; int ARGC ; char bad_mode[] = "bad mode" ; typedef char FLAG ; FLAG quiet = 0 ; FLAG ignore = 0 ; #define NO_ERR 0 #define MATH_ERR 1 #define PROG_ERR 2 main(argc,argv) int argc; char **argv ; { long reference ; /* comparison yardstick for file lengths */ long actual ; /* actual file lengths */ char mode ; /* +, >, -, >, or = */ char second ; /* = or \0 */ struct stat stat_buf ; extern long atol() ; char *explain ; ARGV = argv ; ARGC = argc ; #ifdef VSL /* { */ #include "../../include/vsl.h" #endif /* } */ while (**++argv == '-') { argc-- ; switch ( *++*argv) { case 'q': quiet = 1 ; break ; case 'i': ignore = 1 ; break ; default : fprintf(stderr,"parameter %c not available\n", **argv) ; usage("") ; break ; } } argv--; if ( --argc <= 2) usage("insufficient parameters") ; if ( (reference = atol(*++argv) ) < 0L ) usage("-ve size") ; switch( (mode = **++argv) ) { case '=' : break ; case '+' : mode = '>' ; break ; case '>' : break ; case '-' : mode = '<' ; break ; case '<' : break ; default : usage(bad_mode) ; } if ((second = *++*argv) != '\0') { if (second != '=' ) usage(bad_mode) ; switch(mode) { case '=' : break ; case '>' : mode = '+' ; break ; /* >= */ case '<' : mode = '-' ; break ; /* <= */ } } /* one day may add le <= ge >= lt < gt > */ argc -= 2 ; while (argc--) { if (stat(*++argv, &stat_buf) != 0) { printf("%s: %sError stat failed on %s.\n",*ARGV, ignore? "Fatal " : "", *argv); if (!ignore) exit(PROG_ERR) ; } actual = stat_buf.st_size ; switch (mode) { /* typical usage: filesize 1000 >= /usr/adm/wtmp if $result truncate wtmp */ case '<': explain = "<" ; if (reference < actual ) continue ; break ; case '-': explain = "<=" ; if (reference <= actual ) continue ; break ; case '>': explain = ">" ; if (reference > actual ) continue ; break ; case '+': explain = ">=" ; if (reference >= actual ) continue ; break ; case '=': explain = "==" ; if (reference == actual ) continue ; break ; } if (!quiet) printf("%s %sError: %s %ld %s '%ld %s %s'.\n", *ARGV, ignore? "Fatal " : "", *argv, actual, "bytes, fails requirement:", reference, explain, *argv ) ; if (!ignore) exit(MATH_ERR) ; } exit(NO_ERR) ; } usage(str) char *str ; { fprintf(stderr,"%s.\n",str); fprintf(stderr, "Syntax:%s size +/+=/>/>=/-/-=/