+/*
+ * fdisk_sun.c
+ *
+ * I think this is mostly, or entirely, due to
+ * Jakub Jelinek (jj@sunsite.mff.cuni.cz), July 1996
+ *
+ * Merged with fdisk for other architectures, aeb, June 1998.
+ *
+ * Sat Mar 20 EST 1999 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ * Internationalization
+ *
+ * Licensed under GPLv2, see file LICENSE in this source tree.
+ */
+
#if ENABLE_FEATURE_SUN_LABEL
#define SUNOS_SWAP 3
#define SCSI_IOCTL_GET_IDLUN 0x5382
-/*
- * fdisksunlabel.c
- *
- * I think this is mostly, or entirely, due to
- * Jakub Jelinek (jj@sunsite.mff.cuni.cz), July 1996
- *
- * Merged with fdisk for other architectures, aeb, June 1998.
- *
- * Sat Mar 20 EST 1999 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
- * Internationalization
- */
-
-
-static int sun_other_endian;
-static int scsi_disk;
-static int floppy;
+static smallint sun_other_endian;
+static smallint scsi_disk;
+static smallint floppy;
#ifndef IDE0_MAJOR
#define IDE0_MAJOR 3
{
struct stat bootstat;
- if (fstat(fd, &bootstat) < 0) {
+ if (fstat(dev_fd, &bootstat) < 0) {
scsi_disk = 0;
floppy = 0;
} else if (S_ISBLK(bootstat.st_mode)
static void
-set_sun_partition(int i, uint start, uint stop, int sysid)
+set_sun_partition(int i, unsigned start, unsigned stop, int sysid)
{
sunlabel->infos[i].id = sysid;
sunlabel->partitions[i].start_cylinder =
- SUN_SSWAP32(start / (heads * sectors));
+ SUN_SSWAP32(start / (g_heads * g_sectors));
sunlabel->partitions[i].num_sectors =
SUN_SSWAP32(stop - start);
set_changed(i);
int csum;
if (sunlabel->magic != SUN_LABEL_MAGIC
- && sunlabel->magic != SUN_LABEL_MAGIC_SWAPPED) {
- current_label_type = label_dos;
+ && sunlabel->magic != SUN_LABEL_MAGIC_SWAPPED
+ ) {
+ current_label_type = LABEL_DOS;
sun_other_endian = 0;
return 0;
}
"e.g. heads, sectors, cylinders and partitions\n"
"or force a fresh label (s command in main menu)\n");
} else {
- heads = SUN_SSWAP16(sunlabel->ntrks);
- cylinders = SUN_SSWAP16(sunlabel->ncyl);
- sectors = SUN_SSWAP16(sunlabel->nsect);
+ g_heads = SUN_SSWAP16(sunlabel->ntrks);
+ g_cylinders = SUN_SSWAP16(sunlabel->ncyl);
+ g_sectors = SUN_SSWAP16(sunlabel->nsect);
}
update_units();
- current_label_type = label_sun;
- partitions = 8;
+ current_label_type = LABEL_SUN;
+ g_partitions = 8;
return 1;
}
char *q;
int i;
- if (ioctl(fd, SCSI_IOCTL_GET_IDLUN, &id))
+ if (ioctl(dev_fd, SCSI_IOCTL_GET_IDLUN, &id))
return NULL;
sprintf(buffer,
- "Host: scsi%d Channel: %02d Id: %02d Lun: %02d\n",
+ "Host: scsi%u Channel: %02u Id: %02u Lun: %02u\n",
/* This is very wrong (works only if you have one HBA),
but I haven't found a way how to get hostno
from the current kernel */
id[0] & 0xff,
(id[0]>>8) & 0xff
);
- pfd = fopen("/proc/scsi/scsi", "r");
+ pfd = fopen_for_read("/proc/scsi/scsi");
if (!pfd) {
return NULL;
}
if (!q)
break;
*q = '\0';
- for (i = 0; i < SIZE(sun_drives); i++) {
+ for (i = 0; i < ARRAY_SIZE(sun_drives); i++) {
if (*sun_drives[i].vendor && strcasecmp(sun_drives[i].vendor, vendor))
continue;
if (!strstr(model, sun_drives[i].model))
create_sunlabel(void)
{
struct hd_geometry geometry;
- unsigned int ndiv;
- int i;
+ unsigned ndiv;
unsigned char c;
const struct sun_predefined_drives *p = NULL;
memset(MBRbuffer, 0, sizeof(MBRbuffer));
sunlabel->magic = SUN_SSWAP16(SUN_LABEL_MAGIC);
if (!floppy) {
+ unsigned i;
puts("Drive type\n"
" ? auto configure\n"
" 0 custom (with hardware detected defaults)");
- for (i = 0; i < SIZE(sun_drives); i++) {
+ for (i = 0; i < ARRAY_SIZE(sun_drives); i++) {
printf(" %c %s%s%s\n",
i + 'a', sun_drives[i].vendor,
(*sun_drives[i].vendor) ? " " : "",
if (c == '0') {
break;
}
- if (c >= 'a' && c < 'a' + SIZE(sun_drives)) {
+ if (c >= 'a' && c < 'a' + ARRAY_SIZE(sun_drives)) {
p = sun_drives + c - 'a';
break;
}
- if (c >= 'A' && c < 'A' + SIZE(sun_drives)) {
+ if (c >= 'A' && c < 'A' + ARRAY_SIZE(sun_drives)) {
p = sun_drives + c - 'A';
break;
}
}
}
if (!p || floppy) {
- if (!ioctl(fd, HDIO_GETGEO, &geometry)) {
- heads = geometry.heads;
- sectors = geometry.sectors;
- cylinders = geometry.cylinders;
+ if (!ioctl(dev_fd, HDIO_GETGEO, &geometry)) {
+ g_heads = geometry.heads;
+ g_sectors = geometry.sectors;
+ g_cylinders = geometry.cylinders;
} else {
- heads = 0;
- sectors = 0;
- cylinders = 0;
+ g_heads = 0;
+ g_sectors = 0;
+ g_cylinders = 0;
}
if (floppy) {
sunlabel->nacyl = 0;
- sunlabel->pcylcount = SUN_SSWAP16(cylinders);
+ sunlabel->pcylcount = SUN_SSWAP16(g_cylinders);
sunlabel->rspeed = SUN_SSWAP16(300);
sunlabel->ilfact = SUN_SSWAP16(1);
sunlabel->sparecyl = 0;
} else {
- heads = read_int(1, heads, 1024, 0, "Heads");
- sectors = read_int(1, sectors, 1024, 0, "Sectors/track");
- if (cylinders)
- cylinders = read_int(1, cylinders-2, 65535, 0, "Cylinders");
+ g_heads = read_int(1, g_heads, 1024, 0, "Heads");
+ g_sectors = read_int(1, g_sectors, 1024, 0, "Sectors/track");
+ if (g_cylinders)
+ g_cylinders = read_int(1, g_cylinders - 2, 65535, 0, "Cylinders");
else
- cylinders = read_int(1, 0, 65535, 0, "Cylinders");
+ g_cylinders = read_int(1, 0, 65535, 0, "Cylinders");
sunlabel->nacyl = SUN_SSWAP16(read_int(0, 2, 65535, 0, "Alternate cylinders"));
- sunlabel->pcylcount = SUN_SSWAP16(read_int(0, cylinders+SUN_SSWAP16(sunlabel->nacyl), 65535, 0, "Physical cylinders"));
+ sunlabel->pcylcount = SUN_SSWAP16(read_int(0, g_cylinders + SUN_SSWAP16(sunlabel->nacyl), 65535, 0, "Physical cylinders"));
sunlabel->rspeed = SUN_SSWAP16(read_int(1, 5400, 100000, 0, "Rotation speed (rpm)"));
sunlabel->ilfact = SUN_SSWAP16(read_int(1, 1, 32, 0, "Interleave factor"));
- sunlabel->sparecyl = SUN_SSWAP16(read_int(0, 0, sectors, 0, "Extra sectors per cylinder"));
+ sunlabel->sparecyl = SUN_SSWAP16(read_int(0, 0, g_sectors, 0, "Extra sectors per cylinder"));
}
} else {
sunlabel->sparecyl = SUN_SSWAP16(p->sparecyl);
sunlabel->nsect = SUN_SSWAP16(p->nsect);
sunlabel->rspeed = SUN_SSWAP16(p->rspeed);
sunlabel->ilfact = SUN_SSWAP16(1);
- cylinders = p->ncyl;
- heads = p->ntrks;
- sectors = p->nsect;
+ g_cylinders = p->ncyl;
+ g_heads = p->ntrks;
+ g_sectors = p->nsect;
puts("You may change all the disk params from the x menu");
}
snprintf((char *)(sunlabel->info), sizeof(sunlabel->info),
- "%s%s%s cyl %d alt %d hd %d sec %d",
+ "%s%s%s cyl %u alt %u hd %u sec %u",
p ? p->vendor : "", (p && *p->vendor) ? " " : "",
p ? p->model : (floppy ? "3,5\" floppy" : "Linux custom"),
- cylinders, SUN_SSWAP16(sunlabel->nacyl), heads, sectors);
+ g_cylinders, SUN_SSWAP16(sunlabel->nacyl), g_heads, g_sectors);
- sunlabel->ntrks = SUN_SSWAP16(heads);
- sunlabel->nsect = SUN_SSWAP16(sectors);
- sunlabel->ncyl = SUN_SSWAP16(cylinders);
+ sunlabel->ntrks = SUN_SSWAP16(g_heads);
+ sunlabel->nsect = SUN_SSWAP16(g_sectors);
+ sunlabel->ncyl = SUN_SSWAP16(g_cylinders);
if (floppy)
- set_sun_partition(0, 0, cylinders * heads * sectors, LINUX_NATIVE);
+ set_sun_partition(0, 0, g_cylinders * g_heads * g_sectors, LINUX_NATIVE);
else {
- if (cylinders * heads * sectors >= 150 * 2048) {
- ndiv = cylinders - (50 * 2048 / (heads * sectors)); /* 50M swap */
+ if (g_cylinders * g_heads * g_sectors >= 150 * 2048) {
+ ndiv = g_cylinders - (50 * 2048 / (g_heads * g_sectors)); /* 50M swap */
} else
- ndiv = cylinders * 2 / 3;
- set_sun_partition(0, 0, ndiv * heads * sectors, LINUX_NATIVE);
- set_sun_partition(1, ndiv * heads * sectors, cylinders * heads * sectors, LINUX_SWAP);
+ ndiv = g_cylinders * 2 / 3;
+ set_sun_partition(0, 0, ndiv * g_heads * g_sectors, LINUX_NATIVE);
+ set_sun_partition(1, ndiv * g_heads * g_sectors, g_cylinders * g_heads * g_sectors, LINUX_SWAP);
sunlabel->infos[1].flags |= 0x01; /* Not mountable */
}
- set_sun_partition(2, 0, cylinders * heads * sectors, SUN_WHOLE_DISK);
+ set_sun_partition(2, 0, g_cylinders * g_heads * g_sectors, SUN_WHOLE_DISK);
{
unsigned short *ush = (unsigned short *)sunlabel;
unsigned short csum = 0;
set_all_unchanged();
set_changed(0);
- get_boot(create_empty_sun);
+ check_sun_label();
+ get_boot(CREATE_EMPTY_SUN);
}
static void
}
static void
-fetch_sun(uint *starts, uint *lens, uint *start, uint *stop)
+fetch_sun(unsigned *starts, unsigned *lens, unsigned *start, unsigned *stop)
{
int i, continuous = 1;
*start = 0;
- *stop = cylinders * heads * sectors;
- for (i = 0; i < partitions; i++) {
+ *stop = g_cylinders * g_heads * g_sectors;
+ for (i = 0; i < g_partitions; i++) {
if (sunlabel->partitions[i].num_sectors
&& sunlabel->infos[i].id
&& sunlabel->infos[i].id != SUN_WHOLE_DISK) {
- starts[i] = SUN_SSWAP32(sunlabel->partitions[i].start_cylinder) * heads * sectors;
+ starts[i] = SUN_SSWAP32(sunlabel->partitions[i].start_cylinder) * g_heads * g_sectors;
lens[i] = SUN_SSWAP32(sunlabel->partitions[i].num_sectors);
if (continuous) {
if (starts[i] == *start)
}
}
-static uint *verify_sun_starts;
+static unsigned *verify_sun_starts;
static int
verify_sun_cmp(int *a, int *b)
static void
verify_sun(void)
{
- uint starts[8], lens[8], start, stop;
+ unsigned starts[8], lens[8], start, stop;
int i,j,k,starto,endo;
int array[8];
verify_sun_starts = starts;
- fetch_sun(starts,lens,&start,&stop);
+ fetch_sun(starts, lens, &start, &stop);
for (k = 0; k < 7; k++) {
for (i = 0; i < 8; i++) {
- if (k && (lens[i] % (heads * sectors))) {
- printf("Partition %d doesn't end on cylinder boundary\n", i+1);
+ if (k && (lens[i] % (g_heads * g_sectors))) {
+ printf("Partition %u doesn't end on cylinder boundary\n", i+1);
}
if (lens[i]) {
for (j = 0; j < i; j++)
endo = starts[i]+lens[i];
if (starts[j]+lens[j] < endo)
endo = starts[j]+lens[j];
- printf("Partition %d overlaps with others in "
- "sectors %d-%d\n", i+1, starto, endo);
+ printf("Partition %u overlaps with others in "
+ "sectors %u-%u\n", i+1, starto, endo);
}
}
}
else
array[i] = -1;
}
- qsort(array,SIZE(array),sizeof(array[0]),
+ qsort(array, ARRAY_SIZE(array), sizeof(array[0]),
(int (*)(const void *,const void *)) verify_sun_cmp);
if (array[0] == -1) {
printf("No partitions defined\n");
return;
}
- stop = cylinders * heads * sectors;
+ stop = g_cylinders * g_heads * g_sectors;
if (starts[array[0]])
- printf("Unused gap - sectors 0-%d\n", starts[array[0]]);
+ printf("Unused gap - sectors %u-%u\n", 0, starts[array[0]]);
for (i = 0; i < 7 && array[i+1] != -1; i++) {
- printf("Unused gap - sectors %d-%d\n", starts[array[i]]+lens[array[i]], starts[array[i+1]]);
+ printf("Unused gap - sectors %u-%u\n", starts[array[i]]+lens[array[i]], starts[array[i+1]]);
}
start = starts[array[i]] + lens[array[i]];
if (start < stop)
- printf("Unused gap - sectors %d-%d\n", start, stop);
+ printf("Unused gap - sectors %u-%u\n", start, stop);
}
static void
add_sun_partition(int n, int sys)
{
- uint start, stop, stop2;
- uint starts[8], lens[8];
+ unsigned start, stop, stop2;
+ unsigned starts[8], lens[8];
int whole_disk = 0;
char mesg[256];
return;
}
- fetch_sun(starts,lens,&start,&stop);
+ fetch_sun(starts, lens, &start, &stop);
if (stop <= start) {
if (n == 2)
whole_disk = 1;
else
first = read_int(scround(start), scround(stop)+1,
scround(stop), 0, mesg);
- if (display_in_cyl_units)
+ if (display_in_cyl_units) {
first *= units_per_sector;
- else
+ } else {
/* Starting sector has to be properly aligned */
- first = (first + heads * sectors - 1) / (heads * sectors);
+ first = (first + g_heads * g_sectors - 1) /
+ (g_heads * g_sectors);
+ first *= g_heads * g_sectors;
+ }
if (n == 2 && first != 0)
printf("\
It is highly recommended that the third partition covers the whole disk\n\
/* On the other hand, one should not use partitions
starting at block 0 in an md, or the label will
be trashed. */
- for (i = 0; i < partitions; i++)
+ for (i = 0; i < g_partitions; i++)
if (lens[i] && starts[i] <= first && starts[i] + lens[i] > first)
break;
- if (i < partitions && !whole_disk) {
+ if (i < g_partitions && !whole_disk) {
if (n == 2 && !first) {
whole_disk = 1;
break;
}
- printf("Sector %d is already allocated\n", first);
+ printf("Sector %u is already allocated\n", first);
} else
break;
}
- stop = cylinders * heads * sectors;
+ stop = g_cylinders * g_heads * g_sectors;
stop2 = stop;
- for (i = 0; i < partitions; i++) {
+ for (i = 0; i < g_partitions; i++) {
if (starts[i] > first && starts[i] < stop)
stop = starts[i];
}
} else if (last > stop) {
printf(
"You haven't covered the whole disk with the 3rd partition,\n"
-"but your value %d %s covers some other partition.\n"
-"Your entry has been changed to %d %s\n",
+"but your value %u %s covers some other partition.\n"
+"Your entry has been changed to %u %s\n",
scround(last), str_units(SINGULAR),
scround(stop), str_units(SINGULAR));
last = stop;
if (i == 2
&& sunlabel->infos[i].id == SUN_WHOLE_DISK
&& !sunlabel->partitions[i].start_cylinder
- && (nsec = SUN_SSWAP32(sunlabel->partitions[i].num_sectors)) == heads * sectors * cylinders)
+ && (nsec = SUN_SSWAP32(sunlabel->partitions[i].num_sectors)) == g_heads * g_sectors * g_cylinders)
printf("If you want to maintain SunOS/Solaris compatibility, "
"consider leaving this\n"
"partition as Whole disk (5), starting at 0, with %u "
w = strlen(disk_device);
if (xtra)
printf(
- "\nDisk %s (Sun disk label): %d heads, %d sectors, %d rpm\n"
- "%d cylinders, %d alternate cylinders, %d physical cylinders\n"
- "%d extra sects/cyl, interleave %d:1\n"
+ "\nDisk %s (Sun disk label): %u heads, %u sectors, %u rpm\n"
+ "%u cylinders, %u alternate cylinders, %u physical cylinders\n"
+ "%u extra sects/cyl, interleave %u:1\n"
"%s\n"
- "Units = %s of %d * 512 bytes\n\n",
- disk_device, heads, sectors, SUN_SSWAP16(sunlabel->rspeed),
- cylinders, SUN_SSWAP16(sunlabel->nacyl),
+ "Units = %s of %u * 512 bytes\n\n",
+ disk_device, g_heads, g_sectors, SUN_SSWAP16(sunlabel->rspeed),
+ g_cylinders, SUN_SSWAP16(sunlabel->nacyl),
SUN_SSWAP16(sunlabel->pcylcount),
SUN_SSWAP16(sunlabel->sparecyl),
SUN_SSWAP16(sunlabel->ilfact),
str_units(PLURAL), units_per_sector);
else
printf(
- "\nDisk %s (Sun disk label): %d heads, %d sectors, %d cylinders\n"
- "Units = %s of %d * 512 bytes\n\n",
- disk_device, heads, sectors, cylinders,
+ "\nDisk %s (Sun disk label): %u heads, %u sectors, %u cylinders\n"
+ "Units = %s of %u * 512 bytes\n\n",
+ disk_device, g_heads, g_sectors, g_cylinders,
str_units(PLURAL), units_per_sector);
printf("%*s Flag Start End Blocks Id System\n",
w + 1, "Device");
- for (i = 0 ; i < partitions; i++) {
+ for (i = 0; i < g_partitions; i++) {
if (sunlabel->partitions[i].num_sectors) {
- uint32_t start = SUN_SSWAP32(sunlabel->partitions[i].start_cylinder) * heads * sectors;
+ uint32_t start = SUN_SSWAP32(sunlabel->partitions[i].start_cylinder) * g_heads * g_sectors;
uint32_t len = SUN_SSWAP32(sunlabel->partitions[i].num_sectors);
- printf("%s %c%c %9ld %9ld %9ld%c %2x %s\n",
- partname(disk_device, i+1, w), /* device */
+ printf("%s %c%c %9lu %9lu %9lu%c %2x %s\n",
+ partname(disk_device, i+1, w), /* device */
(sunlabel->infos[i].flags & 0x01) ? 'u' : ' ', /* flags */
(sunlabel->infos[i].flags & 0x10) ? 'r' : ' ',
(long) scround(start), /* start */
sun_set_xcyl(void)
{
sunlabel->sparecyl =
- SUN_SSWAP16(read_int(0, SUN_SSWAP16(sunlabel->sparecyl), sectors, 0,
+ SUN_SSWAP16(read_int(0, SUN_SSWAP16(sunlabel->sparecyl), g_sectors, 0,
"Extra sectors per cylinder"));
}
while (ush < (unsigned short *)(&sunlabel->csum))
csum ^= *ush++;
sunlabel->csum = csum;
- if (lseek(fd, 0, SEEK_SET) < 0)
- fdisk_fatal(unable_to_seek);
- if (write(fd, sunlabel, SECTOR_SIZE) != SECTOR_SIZE)
- fdisk_fatal(unable_to_write);
+ write_sector(0, sunlabel);
}
#endif /* SUN_LABEL */