From: Ben Gras Date: Fri, 12 Aug 2005 17:47:22 +0000 (+0000) Subject: More autopart fixes X-Git-Tag: v3.1.0~341 X-Git-Url: http://zhaoyanbai.com/repos/doc/html/static/gitweb.css?a=commitdiff_plain;h=84cb10da1bdc01840e0ded1610ec95c8ef1b2489;p=minix.git More autopart fixes --- diff --git a/commands/ibm/autopart.c b/commands/ibm/autopart.c index ee3289899..d9ab5da2f 100755 --- a/commands/ibm/autopart.c +++ b/commands/ibm/autopart.c @@ -2272,7 +2272,7 @@ printregions(region_t *theregions, int indent, int p_nr_partitions, int p_free_r } else { printf("%*s", indent, ""); if(numbers) { - if(!nofree) printf("%2d. ", r); + if(!nofree) printf("[%d] ", r); else printf("[-] "); } printf("Free space "); @@ -2347,7 +2347,7 @@ may_kill_region(void) 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("\n\n"); @@ -2559,13 +2559,51 @@ scribble_region(region_t *reg, struct part_entry **pe) newpart->lowsec = reg->free_sec_start; newpart->size = reg->free_sec_last - reg->free_sec_start + 1; changed = 1; - } else newpart = ®->used_part; + newpart->sysind = MINIX_PART; + } else { + newpart = ®->used_part; + } *pe = newpart; changed = 1; dirty = 1; 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 do_autopart(int resultfd) { @@ -2603,23 +2641,16 @@ do_autopart(int resultfd) if(scribble_region(r, &pe)) { char *name; 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"); region = (int)(r-regions); disk = (int) (curdev-firstdev); 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"); do { @@ -2632,32 +2663,54 @@ do_autopart(int resultfd) */ sort(); for(i = 1; i <= NR_PARTITIONS; i++) { - if(table[sort_order[i]].lowsec == pe->lowsec) { + int si; + si = sort_order[i]; + if(si < 1 || si > NR_PARTITIONS) { + fprintf(stderr, "Autopart internal error (out of range) (nothing written).\n"); + exit(1); + } + if(table[si].lowsec == pe->lowsec) { if(found > 0) { - fprintf(stderr, "Internal error (1).\n"); - return 1; + fprintf(stderr, "Autopart internal error (part found twice) (nothing written).\n"); + exit(1); } - check_ind(&table[sort_order[i]]); - table[sort_order[i]].sysind = MINIX_PART; + check_ind(&table[si]); + table[si].sysind = MINIX_PART; found = i; } } if(found < 1) { - fprintf(stderr, "Internal error (2).\n"); - return 1; + fprintf(stderr, "Autopart internal error (part not found) (nothing written).\n"); + exit(1); } m_write('w', NULL); if(dirty) { - fprintf(stderr, "Internal error (3).\n"); - return 1; + fprintf(stderr, "Autopart internal error (couldn't update disk).\n"); + exit(1); } name=strrchr(curdev->name, '/'); if(!name) name = curdev->name; else name++; 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)) { - fprintf(stderr, "Couldn't write result.\n"); - return 1; + fprintf(stderr, "Autopart internal error (couldn't write result).\n"); + 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; }