shithub: riscv

ref: 466cf20d3524b8e42edc333a6d2df2a01e99a95b
dir: /sys/src/cmd/upas/fs/extra/infotst.c/

View raw version
/*
 * simulate the read patterns of external programs for testing
 * info file. "infotest 511 512" simulates what ned does today.
 *
 * here's how the new info scheme was verified:
 *
	ramfs
	s=/sys/src/cmd/upas
	unmount /mail/fs
	$s/fs/8.out -p
	for(f in /mail/fs/mbox/*/info){
		for(i in `{seq 1 1026})
			$s/fs/infotst $i `{echo $i + 1 | hoc} > /tmp/$i < $f
		for(i in /tmp/*)
			cmp $i /tmp/1
		rm /tmp/*
	}

	# now test for differences with old scheme under
	# ideal reading conditions
	for(f in /mail/fs/mbox/*/info){
		i = `{echo $f | sed 's:/mail/fs/mbox/([^/]+)/info:\1:g'}
		$s/fs/infotst 2048 > /tmp/$i < $f
	}
	unmount /mail/fs
	upas/fs -p
	for(f in /mail/fs/mbox/*/info){
		i = `{echo $f | sed 's:/mail/fs/mbox/([^/]+)/info:\1:g'}
		$s/fs/infotst 2048 > /tmp/$i.o < $f
	}
	for(i in /tmp/*.o)
		cmp $i `{echo $i | sed 's:\.o$::g'}
	rm /tmp/*
 */
#include <u.h>
#include <libc.h>

enum{
	Ntab	= 100,
};

int	tab[Ntab];
int	ntab;
int	largest;

void
usage(void)
{
	fprint(2, "usage: infotest n1 n2 ... nm\n");
	exits("usage");
}

void
main(int argc, char **argv)
{
	char *buf;
	int i, n;

	ARGBEGIN{
	default:
		usage();
	}ARGEND
	if(argc == 0)
		usage();
	for(; *argv; argv++){
		if(ntab == nelem(tab))
			break;
		i = atoi(*argv);
		if(i > largest)
			largest = i;
		tab[ntab++] = i;
	}
	buf = malloc(largest);
	if(!buf)
		sysfatal("malloc: %r");
	for(i = 0;; ){
		switch(n = read(0, buf, tab[i])){
		case -1:
			sysfatal("read: %r");
		case 0:
			exits("");
		default:
			write(1, buf, n);
			break;
		}
		if(i < ntab-1)
			i++;
	}
}