157084Sakito /*
257084Sakito * Copyright (c) 1992 OMRON Corporation.
3*63199Sbostic * Copyright (c) 1992, 1993
4*63199Sbostic * The Regents of the University of California. 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*63199Sbostic * @(#)fsdump.c 8.1 (Berkeley) 06/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
fsdump(argc,argv)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 }
7457902Sakito if (i == 5 && argc > 1 && !strcmp(argv[1], "tailor"))
7557902Sakito 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
fsrestore(argc,argv)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