V10/cmd/worm/crap

#include	<libc.h>
#include	"sym.h"
#include	"worm.h"

main(argc, argv)
	char **argv;
{
	Superblock s;
	char *e;
	Inode *i;
	int c;
	char *dev = "/dev/worm0";
	extern char *optarg;
	extern int optind;

	while((c = getopt(argc, argv, "f:")) != -1)
		switch(c)
		{
		case 'f':	dev = optarg; break;
		case '?':	usage();
		}
	if(optind+2 != argc)
		usage();
	dev = mapdev(dev);
	if((s.fd = open(dev, 0)) < 0){
		perror(dev);
		exit(1);
	}
	if(e = openinode(&s, DO_INODE|SPIN_DOWN)){
		fprint(2, "%s: %s\n", dev, e);
		exit(1);
	}
	if(strcmp(s.vol_id, argv[optind])){
		fprint(2, "vol_id mismatch: wanted %s, got %s\n", argv[optind], s.vol_id);
		exit(1);
	}
	if(i = inodeof(argv[++optind]))
		c = pr(&s, i);
	else {
		fprint(2, "wcat: can't find %s\n", argv[optind]);
		c = 1;
	}
	exit(c);
}

usage()
{
	fprint(2, "Usage: worm cat [-fdevice] vol_id file\n");
	exit(1);
}

pr(s, i)
	Superblock *s;
	register Inode *i;
{
	char b[BIGBLOCK];
	register long len, n;
	long nb;
	int fd;

	fd = 1;
	nb = sizeof b / s->blocksize;
	Seek(s, i->block);
	for(n = i->nbytes, len = nb*s->blocksize; n > 0;){
		if(len > n){
			len = n;
			nb = (len+s->blocksize-1)/s->blocksize;
		}
		Read(s, b, nb);
		if(write(fd, b, (int)len) != len){
			perror("write");
			return(1);
		}
		n -= len;
	}
	close(fd);
	return(0);
}