|
|
researchv10 Norman
/*
* hideblock filesystem(not raw) file b1 b2 ...
* -- puts blocks in named file in file system.
*/
#include <stdio.h>
#include <sys/param.h>
#include <sys/ino.h>
#include <sys/stat.h>
#ifdef BITFS
#define Bsize BSIZE(dev)
#define Inopb INOPB(dev)
#else
#define Bsize BSIZE
#define Inopb INOPB
#endif
int fd;
struct dinode di;
ino_t inode;
char cntflag;
long count;
long size;
dev_t dev;
int writing;
main(argc,argv)
char **argv;
{
long pos;
int i,j;
long addr[13];
char *file;
struct stat s;
if(argc<3) {
printf("usage: %s non-raw-fs file b1 b2 ... (512)\n", argv[0]);
exit(1);
}
writing = argc>3;
if ((fd=open(argv[1], writing?2:0)) < 0) {
perror(argv[1]);
printf("%s couldn't open %s\n", argv[0], argv[1]);
exit(1);
}
if (stat(argv[2], &s) < 0) {
printf("%s: %s must exist\n", argv[0], argv[2]);
exit(1);
}
if (s.st_size != 0 && argc>3) {
printf("%s: %s must be 0 length\n", argv[0], argv[2]);
exit(1);
}
inode = s.st_ino;
dev = s.st_dev;
pos = ((long)inode-1)/Inopb*Bsize+((inode-1)%Inopb)*sizeof(struct dinode);
pos += 2*Bsize;
lseek(fd, pos, 0);
bread(fd, &di, sizeof(di));
l3tol(addr, di.di_addr, 13);
for (i = 0; i < 10; i++) {
if (addr[i])
printf(" %ld", addr[i]*(Bsize/512));
else
break;
}
argc -= 2;
argv += 2;
while (argc > 1) {
if (i >= 10) {
printf("\nhideblock: at most 10 blocks\n");
break;
}
addr[i] = atol(argv[1])/(Bsize/512);
printf(" %ld", addr[i]*(Bsize/512));
i++;
argc--;
argv++;
}
printf("\n");
if (writing) {
ltol3(di.di_addr, addr, 13);
lseek(fd, pos, 0);
bwrite(fd, &di, sizeof(di));
}
return(0);
}
bread(f, b, c)
char *b;
{
register n;
n = read(f, b, c);
if (n!=c)
printf("bad read on %d: %d\n", f, n);
}
bwrite(f, b, c)
char *b;
{
register n;
n = write(f, b, c);
if (n!=c)
printf("bad write on %d: %d\n", f, n);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.