157084Sakito /* 257084Sakito * Copyright (c) 1992 OMRON Corporation. 357084Sakito * Copyright (c) 1992 The Regents of the University of California. 457084Sakito * All rights reserved. 557084Sakito * 657084Sakito * This code is derived from software contributed to Berkeley by 757084Sakito * OMRON Corporation. 857084Sakito * 957084Sakito * %sccs.include.redist.c% 1057084Sakito * 11*57902Sakito * @(#)fsdump.c 7.3 (Berkeley) 02/10/93 1257084Sakito */ 1357084Sakito 1457084Sakito /* 1557084Sakito * fsdump.c -- dump and restore of File System 1657084Sakito * by A.Fujita, APR-26-1992 1757084Sakito */ 1857084Sakito 1957084Sakito #include <sys/param.h> 2057084Sakito #include <sys/stat.h> 2157084Sakito #define DKTYPENAMES 2257084Sakito #include <sys/disklabel.h> 2357084Sakito #include <luna68k/stand/status.h> 2457084Sakito #include <luna68k/stand/omron_disklabel.h> 2557084Sakito 2657084Sakito #define LABEL_SIZE 512 2757084Sakito 2857084Sakito #define BUF_BLOCK (20 * 12 * 38) /* 20 Cylinder */ 2957084Sakito #define BUF_BYTES BUF_BLOCK << DEV_BSHIFT 3057084Sakito 3157084Sakito static u_char index[LABEL_SIZE]; 3257084Sakito 3357084Sakito struct disklabel *lp = (struct disklabel *)((struct scd_dk_label *) index)->dkl_pad; 3457084Sakito 3557084Sakito extern dev_t rst0; 3657084Sakito extern dev_t nrst0; 3757084Sakito 3857084Sakito static u_char *dump_buf = (u_char *) 0x100000; 3957084Sakito 4057884Sakito extern int scsi_device; 4157884Sakito char cons_buf[100]; 4257084Sakito 4357884Sakito 4457084Sakito int 4557084Sakito fsdump(argc, argv) 4657084Sakito int argc; 4757084Sakito char *argv[]; 4857084Sakito { 4957084Sakito register int i, j, io; 5057084Sakito register char *p; 5157084Sakito register int status; 5257084Sakito register int block, bytes; 5357084Sakito int scsi_id, blk, nblks, size, mark; 5457084Sakito struct stat boot_stat; 5557084Sakito struct partition *pp; 5657884Sakito scsi_id = scsi_device; 5757084Sakito 5857884Sakito printf("Current SCSI device = ID %d\n", scsi_id); 5957884Sakito getline("Is it sure ? (y/n) ", cons_buf); 6057884Sakito 6157884Sakito if ((cons_buf[0] != 'y') && (cons_buf[0] != 'Y')) 6257884Sakito return(ST_ERROR); 6357884Sakito 6457084Sakito scsi_read_raw(scsi_id, 0, 1, index, LABEL_SIZE); 6557084Sakito 6657084Sakito for (i = 0; i < MAXPARTITIONS; i++) { 6757084Sakito pp = &(lp->d_partitions[i]); 6857084Sakito if ((i != 0) && 6957884Sakito (i != 3) && 7057084Sakito (i != 4) && 7157084Sakito (i != 5)) { 7257084Sakito pp->p_size = 0; 7357084Sakito } 74*57902Sakito if (i == 5 && argc > 1 && !strcmp(argv[1], "tailor")) 75*57902Sakito pp->p_size = 0; 7657084Sakito } 7757084Sakito 7857084Sakito st_rewind(rst0); 7957084Sakito 8057084Sakito printf("Boot Program "); 8157084Sakito io = open("sd(0,0)boot", 0); 8257084Sakito if (io >= 0) { 8357084Sakito printf("read ... "); 8457084Sakito size = read(io, dump_buf, 1048576); 8557084Sakito close(io); 8657084Sakito printf("%d bytes ... ", size); 8757084Sakito if (size <= 0) { 8857084Sakito printf("failed\n"); 8957084Sakito return(ST_ERROR); 9057084Sakito } 9157084Sakito boot_stat.st_size = size; 9257084Sakito } 9357084Sakito 9457084Sakito printf("write ... "); 9557084Sakito status = stwrite(rst0, dump_buf, size); 9657084Sakito st_write_EOF(rst0); 9757084Sakito 9857084Sakito if (status < size) { 9957084Sakito printf("failed\n"); 10057084Sakito return(ST_ERROR); 10157084Sakito } 10257084Sakito 10357084Sakito printf("done\n"); 10457084Sakito 10557084Sakito printf("disklabel (index)\t"); 10657084Sakito 10757084Sakito printf("write ... "); 10857084Sakito status = stwrite(rst0, index, LABEL_SIZE); 10957084Sakito st_write_EOF(rst0); 11057084Sakito 11157084Sakito if (status < LABEL_SIZE) { 11257084Sakito printf("failed\n"); 11357084Sakito return(ST_ERROR); 11457084Sakito } 11557084Sakito 11657084Sakito printf("done\n\n"); 11757084Sakito 11857084Sakito for (i = 0; i < MAXPARTITIONS; i++) { 11957084Sakito pp = &(lp->d_partitions[i]); 12057084Sakito if (pp->p_size > 0) { 12157084Sakito printf("%c: ", i + 'A'); 12257084Sakito printf("size = %d(0x%s), ", pp->p_size, hexstr(pp->p_size, 8)); 12357084Sakito printf("offset = %d(0x%s)\n", pp->p_offset, hexstr(pp->p_offset, 8)); 12457084Sakito 12557084Sakito blk = pp->p_offset; 12657084Sakito nblks = pp->p_size; 12757084Sakito size = nblks << DEV_BSHIFT; 12857084Sakito 12957084Sakito block = BUF_BLOCK; 13057084Sakito bytes = BUF_BYTES; 13157084Sakito 13257084Sakito mark = nblks / block; 13357084Sakito if (nblks % block) 13457084Sakito mark++; 13557084Sakito for (j = 0; j < mark; j++) 13657084Sakito printf("-"); 13757084Sakito for (j = 0; j < mark; j++) 13857084Sakito printf("%c", '\x08'); 13957084Sakito 14057084Sakito while (nblks > 0) { 14157084Sakito if (nblks < block) { 14257084Sakito block = nblks; 14357084Sakito bytes = nblks << DEV_BSHIFT; 14457084Sakito } 14557084Sakito 14657084Sakito if (!scsi_read_raw(scsi_id, blk, block, dump_buf, bytes)) { 14757084Sakito printf("disk read failed !!!\n"); 14857084Sakito return(ST_ERROR); 14957084Sakito } 15057084Sakito 15157084Sakito if (stwrite(rst0, dump_buf, bytes) < bytes) { 15257084Sakito printf("tape write failed !!!\n"); 15357084Sakito return(ST_ERROR); 15457084Sakito } 15557084Sakito 15657084Sakito blk += block; 15757084Sakito nblks -= block; 15857084Sakito size -= bytes; 15957084Sakito 16057084Sakito printf("#"); 16157084Sakito } 16257084Sakito 16357084Sakito st_write_EOF(rst0); 16457084Sakito printf("\n\n"); 16557084Sakito } 16657084Sakito } 16757084Sakito } 16857084Sakito 16957084Sakito int 17057084Sakito fsrestore(argc, argv) 17157084Sakito int argc; 17257084Sakito char *argv[]; 17357084Sakito { 17457084Sakito register int i, j, status; 17557084Sakito register int block, bytes; 17657084Sakito int blk, nblks, size, mark; 17757084Sakito struct partition *pp; 17857084Sakito 17957084Sakito printf("Current SCSI device = ID %d\n", scsi_device); 18057084Sakito getline("Is it sure ? (y/n) ", cons_buf); 18157084Sakito 18257084Sakito if ((cons_buf[0] != 'y') && (cons_buf[0] != 'Y')) 18357084Sakito return(ST_ERROR); 18457084Sakito 18557084Sakito st_rewind(rst0); 18657084Sakito 18757084Sakito st_skip(rst0); 18857084Sakito 18957084Sakito status = stread(rst0, index, LABEL_SIZE); 19057084Sakito 19157084Sakito st_skip(rst0); 19257084Sakito 19357084Sakito for (i = 0; i < MAXPARTITIONS; i++) { 19457084Sakito pp = &(lp->d_partitions[i]); 19557084Sakito if (pp->p_size > 0) { 19657084Sakito printf("%c: ", i + 'A'); 19757084Sakito printf("size = %d(0x%s), ", pp->p_size, hexstr(pp->p_size, 8)); 19857084Sakito printf("offset = %d(0x%s)\n", pp->p_offset, hexstr(pp->p_offset, 8)); 19957084Sakito 20057084Sakito blk = pp->p_offset; 20157084Sakito nblks = pp->p_size; 20257084Sakito size = nblks << DEV_BSHIFT; 20357084Sakito 20457084Sakito block = BUF_BLOCK; 20557084Sakito bytes = BUF_BYTES; 20657084Sakito 20757084Sakito mark = nblks / block; 20857084Sakito if (nblks % block) 20957084Sakito mark++; 21057084Sakito for (j = 0; j < mark; j++) 21157084Sakito printf("-"); 21257084Sakito for (j = 0; j < mark; j++) 21357084Sakito printf("%c", '\x08'); 21457084Sakito 21557084Sakito while (nblks > 0) { 21657084Sakito if (nblks < block) { 21757084Sakito block = nblks; 21857084Sakito bytes = nblks << DEV_BSHIFT; 21957084Sakito } 22057084Sakito 22157084Sakito if (stread(rst0, dump_buf, bytes) != bytes) { 22257084Sakito printf("tape read failed !!!\n"); 22357084Sakito return(ST_ERROR); 22457084Sakito } 22557084Sakito 22657084Sakito if (!scsi_write(blk, dump_buf, bytes)) { 22757084Sakito printf("disk write failed !!!\n"); 22857084Sakito return(ST_ERROR); 22957084Sakito } 23057084Sakito 23157084Sakito blk += block; 23257084Sakito nblks -= block; 23357084Sakito size -= bytes; 23457084Sakito 23557084Sakito printf("#"); 23657084Sakito } 23757084Sakito st_skip(rst0); 23857084Sakito printf("\n\n"); 23957084Sakito } 24057084Sakito } 24157084Sakito } 242