More autopart fixes

This commit is contained in:
Ben Gras 2005-08-12 17:47:22 +00:00
parent b993f51980
commit 84cb10da1b

View File

@ -2272,7 +2272,7 @@ printregions(region_t *theregions, int indent, int p_nr_partitions, int p_free_r
} else { } else {
printf("%*s", indent, ""); printf("%*s", indent, "");
if(numbers) { if(numbers) {
if(!nofree) printf("%2d. ", r); if(!nofree) printf("[%d] ", r);
else printf("[-] "); else printf("[-] ");
} }
printf("Free space "); printf("Free space ");
@ -2347,7 +2347,7 @@ may_kill_region(void)
i = regions[r].tableno; i = regions[r].tableno;
printf("\nPlease confirm that you want to delete region %d, loosing all data it", r); printf("\nPlease confirm that you want to delete region %d, losing all data it", r);
printf("\ncontains. You're disk is not actually updated right away, but still."); printf("\ncontains. You're disk is not actually updated right away, but still.");
printf("\n\n"); printf("\n\n");
@ -2559,13 +2559,51 @@ scribble_region(region_t *reg, struct part_entry **pe)
newpart->lowsec = reg->free_sec_start; newpart->lowsec = reg->free_sec_start;
newpart->size = reg->free_sec_last - reg->free_sec_start + 1; newpart->size = reg->free_sec_last - reg->free_sec_start + 1;
changed = 1; changed = 1;
} else newpart = &reg->used_part; newpart->sysind = MINIX_PART;
} else {
newpart = &reg->used_part;
}
*pe = newpart; *pe = newpart;
changed = 1; changed = 1;
dirty = 1; dirty = 1;
return changed; return changed;
} }
int
sanitycheck_failed(char *dev, struct part_entry *pe)
{
struct partition part;
int fd;
unsigned long it_lowsec, it_secsize;
if((fd = open(dev, O_RDONLY)) < 0) {
perror(dev);
return 1;
}
if (ioctl(fd, DIOCGETP, &part) < 0) {
fprintf(stderr, "DIOCGETP failed\n");
perror(dev);
return 1;
}
close(fd);
it_lowsec = div64u(part.base, SECTOR_SIZE);
it_secsize = div64u(part.size, SECTOR_SIZE);
if(it_lowsec != pe->lowsec || it_secsize != pe->size) {
fprintf(stderr, "Autopart numbers don't match up! (%lu, %lu, %lu, %lu)\n",
it_lowsec, pe->lowsec, it_secsize, pe->size);
return 1;
}
fprintf(stderr, "Autopart numbers match. (%lu, %lu, %lu, %lu)\n",
it_lowsec, pe->lowsec, it_secsize, pe->size);
return 0;
}
int int
do_autopart(int resultfd) do_autopart(int resultfd)
{ {
@ -2603,23 +2641,16 @@ do_autopart(int resultfd)
if(scribble_region(r, &pe)) { if(scribble_region(r, &pe)) {
char *name; char *name;
int i, found = -1; int i, found = -1;
char partbuf[100]; char partbuf[100], devname[100];
#if 0
printf("\nThis is your current partition table:\n");
m_dump(orig_table);
printf("\nThis will be your new partition table:\n");
m_dump(table);
#endif
printstep(3, "Confirm your choices"); printstep(3, "Confirm your choices");
region = (int)(r-regions); region = (int)(r-regions);
disk = (int) (curdev-firstdev); disk = (int) (curdev-firstdev);
printf("\nThis is the point of no return. You have selected to install MINIX 3\n"); printf("\nThis is the point of no return. You have selected to install MINIX 3\n");
printf("into region %d of disk %d (%sp%d). Please confirm that you want\n", region, disk, devices[disk].dev->name, region); printf("into region %d of disk %d (%s). Please confirm that you want\n", region, disk, devices[disk].dev->name);
printf("to use this selection to install MINIX 3.\n\n"); printf("to use this selection to install MINIX 3.\n\n");
do { do {
@ -2632,32 +2663,54 @@ do_autopart(int resultfd)
*/ */
sort(); sort();
for(i = 1; i <= NR_PARTITIONS; i++) { for(i = 1; i <= NR_PARTITIONS; i++) {
if(table[sort_order[i]].lowsec == pe->lowsec) { int si;
if(found > 0) { si = sort_order[i];
fprintf(stderr, "Internal error (1).\n"); if(si < 1 || si > NR_PARTITIONS) {
return 1; fprintf(stderr, "Autopart internal error (out of range) (nothing written).\n");
exit(1);
} }
check_ind(&table[sort_order[i]]); if(table[si].lowsec == pe->lowsec) {
table[sort_order[i]].sysind = MINIX_PART; if(found > 0) {
fprintf(stderr, "Autopart internal error (part found twice) (nothing written).\n");
exit(1);
}
check_ind(&table[si]);
table[si].sysind = MINIX_PART;
found = i; found = i;
} }
} }
if(found < 1) { if(found < 1) {
fprintf(stderr, "Internal error (2).\n"); fprintf(stderr, "Autopart internal error (part not found) (nothing written).\n");
return 1; exit(1);
} }
m_write('w', NULL); m_write('w', NULL);
if(dirty) { if(dirty) {
fprintf(stderr, "Internal error (3).\n"); fprintf(stderr, "Autopart internal error (couldn't update disk).\n");
return 1; exit(1);
} }
name=strrchr(curdev->name, '/'); name=strrchr(curdev->name, '/');
if(!name) name = curdev->name; if(!name) name = curdev->name;
else name++; else name++;
sprintf(partbuf, "%sp%d\n", name, found-1); sprintf(partbuf, "%sp%d\n", name, found-1);
sprintf(devname, "/dev/%sp%d", name, found-1);
if(resultfd >= 0 && write(resultfd, partbuf, strlen(partbuf)) < strlen(partbuf)) { if(resultfd >= 0 && write(resultfd, partbuf, strlen(partbuf)) < strlen(partbuf)) {
fprintf(stderr, "Couldn't write result.\n"); fprintf(stderr, "Autopart internal error (couldn't write result).\n");
return 1; exit(1);
}
if(device >= 0) {
close(device);
device = -1;
}
#if 0
m_dump(orig_table);
printf("\n");
m_dump(table);
#endif
if(sanitycheck_failed(devname, &table[found])) {
fprintf(stderr, "Autopart internal error (disk sanity check failed).\n");
exit(1);
} }
return 0; return 0;
} }