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