|
|
researchv10 Norman
#include <libc.h>
#include "worm.h"
#include "sym.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <signal.h>
int lflag = 0;
int bflag = 0;
main(argc, argv)
char **argv;
{
Superblock s;
register Inode *i;
Inode newi;
char *e;
char *dev = "/dev/worm0";
int c;
extern char *optarg;
extern int optind;
void pr();
while((c = getopt(argc, argv, "lbf:")) != -1)
switch(c)
{
case 'f': dev = optarg; break;
case 'l': lflag = 1; break;
case 'b': bflag = 1; break;
case '?': usage();
}
dev = mapdev(dev);
if((s.fd = open(dev, 2)) < 0){
perror(dev);
exit(1);
}
if(e = openinode(&s, DO_INODE|SPIN_DOWN)){
fprint(2, "%s: %s\n", dev, e);
exit(1);
}
if(optind != argc-3)
usage();
if(strcmp(s.vol_id, argv[optind])){
fprint(2, "worm mv: vol_id mismatch: wanted %s, got %s\n", argv[optind], s.vol_id);
exit(1);
}
optind++;
if((i = inodeof(argv[optind])) == 0){
Fprint(2, "%s not found\n", argv[optind]);
exit(1);
}
optind++;
if(strlen(argv[optind]) < 1){
Fprint(2, "worm mv: destination name is null\n");
exit(1);
}
for(c = 1; c <= NSIG; c++)
signal(c, SIG_IGN);
ininit();
newi = *i;
i->block = -1;
inadd(&s, i);
newi.name.n = argv[optind];
inadd(&s, &newi);
if(inwrite(&s))
exit(1);
exit(0);
}
usage()
{
fprint(2, "Usage: worm mv [-fdevice] vol_id from to\n");
exit(2);
}
static Inode *inodes;
static long ip;
static long ninodes = 0;
static char *nameb;
static long np;
static long nnameb = 0;
static long nblocks;
#define IINC 1024
#define NINC (64*IINC)
ininit()
{
if(nnameb == 0){
nameb = malloc((unsigned)(nnameb = NINC));
if(nameb == 0){
fprint(2, "wmv: malloc fail, %d bytes\n", nnameb);
exit(1);
}
}
np = 0;
if(ninodes == 0){
inodes = (Inode *)malloc(sizeof(Inode)*(unsigned)(ninodes = IINC));
if(inodes == 0){
fprint(2, "wmv: malloc fail, %d inodes %d bytes\n", ninodes, ninodes*sizeof(Inode));
exit(1);
}
}
ip = 0;
}
inadd(s, i)
Superblock *s;
register Inode *i;
{
register long len;
len = strlen(i->name.n)+1;
if(np+len > nnameb){
while(np+len > nnameb)
nnameb += NINC;
nameb = realloc(nameb, (unsigned)nnameb);
if(nameb == 0){
fprint(2, "wmv: realloc fail, %d bytes\n", nnameb);
exit(1);
}
}
strcpy(nameb+np, i->name.n);
i->name.o = np;
np += len;
if(ip == ninodes){
ninodes += IINC;
inodes = (Inode *)realloc((char *)inodes, (unsigned)ninodes*sizeof(Inode));
if(inodes == 0){
fprint(2, "wmv: realloc fail, %d inodes %d bytes\n", ninodes, ninodes*sizeof(Inode));
exit(1);
}
}
inodes[ip++] = *i;
}
inwrite(s)
Superblock *s;
{
char *e;
if(e = lkwri(s, inodes, ip, nameb, np, 0L)){
fprint(2, "%s\n", e);
return(1);
}
return(0);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.