* Copyright (c) 1990 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* %sccs.include.noredist.c%
* @(#)disklabel.c 7.1 (Berkeley) %G%
#define BOOTSIZE (8*1024) /* size of boot "block" */
char *standdisk
= "cst2d:" ;
char *st506boot
= "cst2e:"; /* ST506 boot block */
char *scsiboot
= "cst2f:"; /* SCSI boot block */
char *standdisk
= "/etc/disktab" ;
char *st506boot
= "/stand/bootwd"; /* ST506 boot block */
char *scsiboot
= "/stand/bootswd"; /* SCSI boot block */
char *st506boot
= "/stand/bootwd"; /* ST506 boot block */
char *scsiboot
= "/stand/bootswd"; /* SCSI boot block */
char bootstrap
[BOOTSIZE
];
char *tnames
[MAXTYPES
] = {
register struct disklabel
*lp
= &block0
.b
.lab
;
register struct disktab
*dp
;
if (argc
< 2 || argc
> 5) {
fprintf(stderr
, "usage: disklabel disk (to read label)\n");
"or disklabel disk type [ packid ] [ bootblock ] (to write label)\n");
sprintf(name
, "/dev/r%sc", argv
[1]);
f
= open(name
, O_RDONLY
);
if (f
< 0 && argv
[1][0] != '/') {
sprintf(name
, "/dev/r%s", argv
[1]);
f
= open(name
, O_RDONLY
);
f
= getdev("File", name
) ;
printf("R)ead, W)rite, F)ilename, or E)xit [RWFE] ? ") ;
if (c
== 'W') goto wr_lab
;
if (c
== 'F') { close(f
) ; goto new_file
; }
if (read(f
, &block0
, BOOTSIZE
) < BOOTSIZE
)
if (lp
->dk_magic
!= DISKMAGIC
) {
"Bad pack magic number (pack is unlabeled)\n");
printf("%s (%.*s):\n", name
, sizeof(lp
->dk_name
), lp
->dk_name
);
printf("%s (%s):\n", name
, lp
->dk_name
);
printf("%s, ", (unsigned) lp
->dk_type
< MAXTYPES
?
tnames
[lp
->dk_type
] : "unknown type");
if(lp
->dk_type
== DTYPE_SCSI
) {
printf("%d bytes/sector, %d sectors/drive, ",
lp
->dk_secsize
, lp
->dk_secperunit
);
printf("%d sectors/track,\n %d tracks/cylinder, ",
lp
->dk_secpercyl
/lp
->dk_ntracks
,
printf ("%d sectors/cylinder, ", lp
->dk_secpercyl
) ;
printf ("%s i/o mode\n", lp
->dk_blind
?"blind":"slow");
printf("%d bytes/sector, %d sectors/track, ",
lp
->dk_secsize
, lp
->dk_nsectors
);
printf("%d tracks/cylinder, %d cylinders\n",
lp
->dk_ntracks
, lp
->dk_ncylinders
);
lp
->dk_nsectors
* lp
->dk_ntracks
)
"WARNING: sectors/cylinder field is wrong (%d instead of %d)\n",
lp
->dk_nsectors
* lp
->dk_ntracks
);
if (lp
->dk_secperunit
!= lp
->dk_nsectors
*
lp
->dk_ntracks
* lp
->dk_ncylinders
)
"WARNING: sectors/unit field is wrong (%d instead of %d)\n",
lp
->dk_nsectors
* lp
->dk_ntracks
*
printf("\t size offset\n");
printf("partition table:\n");
for (i
= 0; i
< 8; i
++) {
printf("\t%c: %8d %8d", 'a' + i
,
printf("partition %c, size %d sectors, offset %d cylinders.", 'a' + i
,
lp
->dk_partition
[i
].nblocks
, lp
->dk_partition
[i
].cyloff
);
if (lp
->dk_partition
[i
].nblocks
){
if (lp
->dk_type
!= DTYPE_SCSI
) {
printf("\t(Cyl. %d - %d",
printf(" (from cyl %d to %d",
lp
->dk_partition
[i
].cyloff
,
lp
->dk_partition
[i
].cyloff
+
(lp
->dk_partition
[i
].nblocks
+ lp
->dk_secpercyl
- 1) / lp
->dk_secpercyl
- 1);
if (lp
->dk_partition
[i
].nblocks
% lp
->dk_secpercyl
)
printf("Type (e.g. miniscribe85...): ") ;
printf("%s: unknown disk type\n", buf
);
dp
= getdiskbyname(argv
[2]);
fprintf(stderr
, "%s: unknown disk type\n", argv
[2]);
f
= open(name
, O_WRONLY
);
if (strcmp(dp
->d_type
, "scsi") == 0 || strcmp(dp
->d_type
, "SCSI") == 0)
boot
= scsiboot
; else boot
= st506boot
;
b
= open(boot
, O_RDONLY
);
if (read(b
, &block0
, BOOTSIZE
) < 0)
for (p
= (char *)lp
; p
< (char *)lp
+ sizeof(struct disklabel
); p
++)
"Bootstrap doesn't leave room for disk label\n");
lp
->dk_magic
= DISKMAGIC
;
if (strcmp(dp
->d_type
, "st506") == 0 ||
strcmp(dp
->d_type
, "ST506") == 0) {
lp
->dk_type
= DTYPE_ST506
;
lp
->dk_precompcyl
= dp
->d_precomp
;
if (strcmp(dp
->d_type
, "floppy") == 0)
lp
->dk_type
= DTYPE_FLOPPY
;
if (strcmp(dp
->d_type
, "scsi") == 0)
lp
->dk_type
= DTYPE_SCSI
;
if (strcmp(dp
->d_type
, "SCSI") == 0)
lp
->dk_type
= DTYPE_SCSI
;
lp
->dk_secsize
= dp
->d_secsize
;
lp
->dk_nsectors
= dp
->d_nsectors
;
lp
->dk_ntracks
= dp
->d_ntracks
;
lp
->dk_ncylinders
= dp
->d_ncylinders
;
if (lp
->dk_type
== DTYPE_SCSI
) {
lp
->dk_secpercyl
= dp
->d_secpercyl
;
lp
->dk_secperunit
= dp
->d_nsectors
;
lp
->dk_blind
= dp
->d_blind
;
lp
->dk_secpercyl
= dp
->d_nsectors
* dp
->d_ntracks
;
lp
->dk_secperunit
= dp
->d_nsectors
* dp
->d_ntracks
for (i
= 0; i
< 8; i
++) {
lp
->dk_partition
[i
].nblocks
= dp
->d_partitions
[i
].p_size
;
if (lp
->dk_partition
[i
].nblocks
== -1)
lp
->dk_partition
[i
].nblocks
= 0;
lp
->dk_partition
[i
].cyloff
= dp
->d_partitions
[i
].p_offset
;
if (lp
->dk_partition
[i
].cyloff
== -1)
lp
->dk_partition
[i
].cyloff
= 0;
strncpy(lp
->dk_name
, argv
[3], sizeof(lp
->dk_name
));
strncpy(lp
->dk_name
, dp
->d_name
, sizeof(lp
->dk_name
));
if (write(f
, &block0
, BOOTSIZE
) < BOOTSIZE
)
fprintf(stderr
, "disklabel: "); /*perror(op);*/
fprintf(a
,b
,c
,d
,e
,f
,g
,h
) {