V10/cmd/worm/wdir.c
#include <libc.h>
#include "worm.h"
#include "sym.h"
#include <sys/types.h>
#include <sys/stat.h>
char *dumpdir();
int verbose = 0;
main(argc, argv)
char **argv;
{
Superblock s, news;
char *e;
char *dev = "/dev/worm0";
int update = 0;
int c;
char buf[1024];
extern char *optarg;
extern int optind;
void blkfn();
while((c = getopt(argc, argv, "f:vu")) != -1)
switch(c)
{
case 'f': dev = optarg; break;
case 'u': update = 1; break;
case 'v': verbose = 1; break;
case '?': usage();
}
dev = mapdev(dev);
if(optind != argc-1)
usage();
if((s.fd = open(dev, 2)) < 0){
perror(dev);
exit(1);
}
if(e = openinode(&s, SPIN_DOWN)){
fprint(2, "%s: %s\n", dev, e);
exit(2);
}
if(s.version != VBTREE){
fprint(2, "%s is not a btree!\n", s.vol_id);
exit(2);
}
if(strcmp(argv[optind], s.vol_id)){
fprint(2, "wanted volid '%s'; got '%s'\n", argv[optind], s.vol_id);
exit(1);
}
if(e = dumpdir(&s, update)){
fprint(2, "%s: %s\n", dev, e);
exit(2);
}
sprint(buf, "/usr/worm/tmp/%s", s.vol_id);
unlink(buf);
exit(0);
}
usage()
{
fprint(2, "Usage: dir [-fdevice] -v] [-u] vol_id\n");
exit(2);
}
char *
dumpdir(s, update)
register Superblock *s;
{
char *b;
static char buf[64];
char name[256], buf1[256];
if((b = malloc(s->blocksize)) == 0){
sprint(buf, "couldn't malloc buffer (%d bytes)", s->blocksize);
return(buf);
}
numinodes = s->ninodes;
sprint(name, "/usr/worm/dirs/%s", s->vol_id);
Seek(s, s->binodes);
sprint(buf1, "%s.F", name);
copyout(s, buf1, s->nF, update, verbose);
sprint(buf1, "%s.T", name);
copyout(s, buf1, s->nT, update, verbose);
sprint(buf1, "%s.I", name);
copyout(s, buf1, s->ninochars, update, verbose);
free(b);
return((char *)0);
}