xref: /csrg-svn/sys/luna68k/stand/fsdump.c (revision 63199)
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