#include #include #include #include #include #include #include void usage(){ puts("Usage: "); puts(" getvtoc /dev/name [block_offset [-i]]"); puts(" -i means 'ignore bad magic field and print anyway'"); puts(" NOTE: standard solaris p devs tend to need an offset of 1"); } int main(int argc, char *argv[]){ int fd, pc; struct vtoc *label; int offset; char buffer[1024]; if(argc<2){ puts("Need name of device!"); usage(); exit(1); } if(argc==3){ offset=atoi(argv[2]); printf("using block offset of %d blocks\n",offset); } fd=open(argv[1],O_RDONLY); if(fd==-1){ perror("could not open device"); exit(errno); } if(offset>0){ lseek(fd,offset*512, SEEK_SET); } if(read(fd,buffer,1024) !=1024){ perror("err reading initial 1k"); exit(errno); } label=(struct vtoc*)buffer; if(label->v_sanity != VTOC_SANE){ fprintf(stderr,"ERROR: No VTOC MAGIC. Bad VTOC\n"); if(offset!=1){ fprintf(stderr,"(maybe you should try offset=1)"); } if(argc <4) return 1; } puts("here is the vtoc we got"); printf("volume name %s\n",label->v_volume); for(pc=0;pc<10;pc++){ printf("%d: startblock %d, size %d, type %d\n", pc, label->v_part[pc].p_start, label->v_part[pc].p_size, label->v_part[pc].p_tag); } return 0; }