1*57084Sakito /* 2*57084Sakito * Copyright (c) 1992 OMRON Corporation. 3*57084Sakito * Copyright (c) 1992 The Regents of the University of California. 4*57084Sakito * All rights reserved. 5*57084Sakito * 6*57084Sakito * This code is derived from software contributed to Berkeley by 7*57084Sakito * OMRON Corporation. 8*57084Sakito * 9*57084Sakito * %sccs.include.redist.c% 10*57084Sakito * 11*57084Sakito * @(#)fsdump.c 7.1 (Berkeley) 12/13/92 12*57084Sakito */ 13*57084Sakito 14*57084Sakito /* 15*57084Sakito * fsdump.c -- dump and restore of File System 16*57084Sakito * by A.Fujita, APR-26-1992 17*57084Sakito */ 18*57084Sakito 19*57084Sakito #include <sys/param.h> 20*57084Sakito #include <sys/stat.h> 21*57084Sakito #define DKTYPENAMES 22*57084Sakito #include <sys/disklabel.h> 23*57084Sakito #include <luna68k/stand/status.h> 24*57084Sakito #include <luna68k/stand/omron_disklabel.h> 25*57084Sakito 26*57084Sakito #define LABEL_SIZE 512 27*57084Sakito 28*57084Sakito #define BUF_BLOCK (20 * 12 * 38) /* 20 Cylinder */ 29*57084Sakito #define BUF_BYTES BUF_BLOCK << DEV_BSHIFT 30*57084Sakito 31*57084Sakito static u_char index[LABEL_SIZE]; 32*57084Sakito 33*57084Sakito struct disklabel *lp = (struct disklabel *)((struct scd_dk_label *) index)->dkl_pad; 34*57084Sakito 35*57084Sakito extern dev_t rst0; 36*57084Sakito extern dev_t nrst0; 37*57084Sakito 38*57084Sakito static u_char *dump_buf = (u_char *) 0x100000; 39*57084Sakito 40*57084Sakito 41*57084Sakito int 42*57084Sakito fsdump(argc, argv) 43*57084Sakito int argc; 44*57084Sakito char *argv[]; 45*57084Sakito { 46*57084Sakito register int i, j, io; 47*57084Sakito register char *p; 48*57084Sakito register int status; 49*57084Sakito register int block, bytes; 50*57084Sakito int scsi_id, blk, nblks, size, mark; 51*57084Sakito struct stat boot_stat; 52*57084Sakito struct partition *pp; 53*57084Sakito 54*57084Sakito scsi_id = 6; 55*57084Sakito scsi_read_raw(scsi_id, 0, 1, index, LABEL_SIZE); 56*57084Sakito 57*57084Sakito for (i = 0; i < MAXPARTITIONS; i++) { 58*57084Sakito pp = &(lp->d_partitions[i]); 59*57084Sakito /* 60*57084Sakito if ((i != 0) && 61*57084Sakito (i != 4) && 62*57084Sakito (i != 5)) { 63*57084Sakito */ 64*57084Sakito if (i != 0) { 65*57084Sakito pp->p_size = 0; 66*57084Sakito } 67*57084Sakito } 68*57084Sakito 69*57084Sakito st_rewind(rst0); 70*57084Sakito 71*57084Sakito printf("Boot Program "); 72*57084Sakito io = open("sd(0,0)boot", 0); 73*57084Sakito if (io >= 0) { 74*57084Sakito printf("read ... "); 75*57084Sakito size = read(io, dump_buf, 1048576); 76*57084Sakito close(io); 77*57084Sakito printf("%d bytes ... ", size); 78*57084Sakito if (size <= 0) { 79*57084Sakito printf("failed\n"); 80*57084Sakito return(ST_ERROR); 81*57084Sakito } 82*57084Sakito boot_stat.st_size = size; 83*57084Sakito } 84*57084Sakito 85*57084Sakito printf("write ... "); 86*57084Sakito status = stwrite(rst0, dump_buf, size); 87*57084Sakito st_write_EOF(rst0); 88*57084Sakito 89*57084Sakito if (status < size) { 90*57084Sakito printf("failed\n"); 91*57084Sakito return(ST_ERROR); 92*57084Sakito } 93*57084Sakito 94*57084Sakito printf("done\n"); 95*57084Sakito 96*57084Sakito printf("disklabel (index)\t"); 97*57084Sakito 98*57084Sakito printf("write ... "); 99*57084Sakito status = stwrite(rst0, index, LABEL_SIZE); 100*57084Sakito st_write_EOF(rst0); 101*57084Sakito 102*57084Sakito if (status < LABEL_SIZE) { 103*57084Sakito printf("failed\n"); 104*57084Sakito return(ST_ERROR); 105*57084Sakito } 106*57084Sakito 107*57084Sakito printf("done\n\n"); 108*57084Sakito 109*57084Sakito for (i = 0; i < MAXPARTITIONS; i++) { 110*57084Sakito pp = &(lp->d_partitions[i]); 111*57084Sakito if (pp->p_size > 0) { 112*57084Sakito printf("%c: ", i + 'A'); 113*57084Sakito printf("size = %d(0x%s), ", pp->p_size, hexstr(pp->p_size, 8)); 114*57084Sakito printf("offset = %d(0x%s)\n", pp->p_offset, hexstr(pp->p_offset, 8)); 115*57084Sakito 116*57084Sakito blk = pp->p_offset; 117*57084Sakito nblks = pp->p_size; 118*57084Sakito size = nblks << DEV_BSHIFT; 119*57084Sakito 120*57084Sakito block = BUF_BLOCK; 121*57084Sakito bytes = BUF_BYTES; 122*57084Sakito 123*57084Sakito mark = nblks / block; 124*57084Sakito if (nblks % block) 125*57084Sakito mark++; 126*57084Sakito for (j = 0; j < mark; j++) 127*57084Sakito printf("-"); 128*57084Sakito for (j = 0; j < mark; j++) 129*57084Sakito printf("%c", '\x08'); 130*57084Sakito 131*57084Sakito while (nblks > 0) { 132*57084Sakito if (nblks < block) { 133*57084Sakito block = nblks; 134*57084Sakito bytes = nblks << DEV_BSHIFT; 135*57084Sakito } 136*57084Sakito 137*57084Sakito if (!scsi_read_raw(scsi_id, blk, block, dump_buf, bytes)) { 138*57084Sakito printf("disk read failed !!!\n"); 139*57084Sakito return(ST_ERROR); 140*57084Sakito } 141*57084Sakito 142*57084Sakito if (stwrite(rst0, dump_buf, bytes) < bytes) { 143*57084Sakito printf("tape write failed !!!\n"); 144*57084Sakito return(ST_ERROR); 145*57084Sakito } 146*57084Sakito 147*57084Sakito blk += block; 148*57084Sakito nblks -= block; 149*57084Sakito size -= bytes; 150*57084Sakito 151*57084Sakito printf("#"); 152*57084Sakito } 153*57084Sakito 154*57084Sakito st_write_EOF(rst0); 155*57084Sakito printf("\n\n"); 156*57084Sakito } 157*57084Sakito } 158*57084Sakito } 159*57084Sakito 160*57084Sakito extern int scsi_device; 161*57084Sakito char cons_buf[100]; 162*57084Sakito 163*57084Sakito int 164*57084Sakito fsrestore(argc, argv) 165*57084Sakito int argc; 166*57084Sakito char *argv[]; 167*57084Sakito { 168*57084Sakito register int i, j, status; 169*57084Sakito register int block, bytes; 170*57084Sakito int blk, nblks, size, mark; 171*57084Sakito struct partition *pp; 172*57084Sakito 173*57084Sakito printf("Current SCSI device = ID %d\n", scsi_device); 174*57084Sakito getline("Is it sure ? (y/n) ", cons_buf); 175*57084Sakito 176*57084Sakito if ((cons_buf[0] != 'y') && (cons_buf[0] != 'Y')) 177*57084Sakito return(ST_ERROR); 178*57084Sakito 179*57084Sakito st_rewind(rst0); 180*57084Sakito 181*57084Sakito st_skip(rst0); 182*57084Sakito 183*57084Sakito status = stread(rst0, index, LABEL_SIZE); 184*57084Sakito 185*57084Sakito st_skip(rst0); 186*57084Sakito 187*57084Sakito for (i = 0; i < MAXPARTITIONS; i++) { 188*57084Sakito pp = &(lp->d_partitions[i]); 189*57084Sakito if (pp->p_size > 0) { 190*57084Sakito printf("%c: ", i + 'A'); 191*57084Sakito printf("size = %d(0x%s), ", pp->p_size, hexstr(pp->p_size, 8)); 192*57084Sakito printf("offset = %d(0x%s)\n", pp->p_offset, hexstr(pp->p_offset, 8)); 193*57084Sakito 194*57084Sakito blk = pp->p_offset; 195*57084Sakito nblks = pp->p_size; 196*57084Sakito size = nblks << DEV_BSHIFT; 197*57084Sakito 198*57084Sakito block = BUF_BLOCK; 199*57084Sakito bytes = BUF_BYTES; 200*57084Sakito 201*57084Sakito mark = nblks / block; 202*57084Sakito if (nblks % block) 203*57084Sakito mark++; 204*57084Sakito for (j = 0; j < mark; j++) 205*57084Sakito printf("-"); 206*57084Sakito for (j = 0; j < mark; j++) 207*57084Sakito printf("%c", '\x08'); 208*57084Sakito 209*57084Sakito while (nblks > 0) { 210*57084Sakito if (nblks < block) { 211*57084Sakito block = nblks; 212*57084Sakito bytes = nblks << DEV_BSHIFT; 213*57084Sakito } 214*57084Sakito 215*57084Sakito if (stread(rst0, dump_buf, bytes) != bytes) { 216*57084Sakito printf("tape read failed !!!\n"); 217*57084Sakito return(ST_ERROR); 218*57084Sakito } 219*57084Sakito 220*57084Sakito if (!scsi_write(blk, dump_buf, bytes)) { 221*57084Sakito printf("disk write failed !!!\n"); 222*57084Sakito return(ST_ERROR); 223*57084Sakito } 224*57084Sakito 225*57084Sakito blk += block; 226*57084Sakito nblks -= block; 227*57084Sakito size -= bytes; 228*57084Sakito 229*57084Sakito printf("#"); 230*57084Sakito } 231*57084Sakito st_skip(rst0); 232*57084Sakito printf("\n\n"); 233*57084Sakito } 234*57084Sakito } 235*57084Sakito } 236