diff options
| -rw-r--r-- | toys/pending/fdisk.c | 106 | 
1 files changed, 51 insertions, 55 deletions
| diff --git a/toys/pending/fdisk.c b/toys/pending/fdisk.c index 1432ee34..24769c68 100644 --- a/toys/pending/fdisk.c +++ b/toys/pending/fdisk.c @@ -62,7 +62,7 @@ struct part_entry {  struct part_types {    int id; -  char type[PATH_MAX]; +  char type[24];  } sys_types[] = {    {0x00, "Empty"}, {0x01, "FAT12"}, {0x04, "FAT16 <32M"}, {0x05, "Extended"},    {0x06, "FAT16"}, {0x07, "HPFS/NTFS"}, {0x0a, "OS/2 Boot Manager"}, @@ -145,20 +145,18 @@ static void list_types(void)    xputc('\n');  } -static int valid(long size) -{ -  if (size == 512 || size == 1024 || size == 2048 || size == 4096) return 1; -  else { -      toys.exithelp = 1; -      error_exit(""); -  } -} -  static void read_sec_sz()  {    int arg;           if (ioctl(dev_fd, BLKSSZGET, &arg) == 0) g_sect_size = arg; -  if ((toys.optflags & FLAG_b) && valid(TT.sect_sz)) g_sect_size = TT.sect_sz; +  if (toys.optflags & FLAG_b) { +    if (TT.sect_sz !=  512 && TT.sect_sz != 1024 && TT.sect_sz != 2048 && +        TT.sect_sz != 4096) { +      toys.exithelp++; +      error_exit("bad sector size"); +    } +    g_sect_size = TT.sect_sz; +  }  }  static sector_t read_size() @@ -528,13 +526,13 @@ static int read_input(char *mesg, char *outp)  {    char *p;    int size = 0; -redo: -  xprintf("%s", mesg); -  p = fgets(toybuf, 80, stdin); +  do { +    xprintf("%s", mesg); +    p = fgets(toybuf, 80, stdin); -  if (!p || !(size = strlen(p))) exit(0); -  if (p[size-1] == '\n') p[--size] = '\0'; -  if (!size) goto redo; +    if (!p || !(size = strlen(p))) exit(0); +    if (p[size-1] == '\n') p[--size] = '\0'; +  } while (!size);    while (*p != '\0' && *p <= ' ') p++;    if (outp) memcpy(outp, p, strlen(p) + 1); //1 for nul @@ -687,15 +685,14 @@ static int get_non_free_partition(int max)    for (i = 0; i < max; i++) {      if (!is_partition_clear(partitions[i].part)) { -      if (num >= 0) goto get_from_user; +      if (num >= 0) +        return ask_partition(num_parts)-1;        num = i;      }    }    (num >= 0) ? xprintf("Selected partition %d\n",num+1):      xprintf("No partition is defined yet!\n");    return num; -get_from_user: -  return ask_partition(num_parts)-1;  }  /* a try at autodetecting an empty partition table entry, @@ -707,15 +704,14 @@ static int get_free_partition(int max)    for (i = 0; i < max; i++) {      if (is_partition_clear(partitions[i].part)) { -      if (num >= 0) goto get_from_user; +      if (num >= 0) +        return ask_partition(4)-1;        num = i;      }    }    (num >= 0) ? xprintf("Selected partition %d\n",num+1):      xprintf("All primary partitions have been defined already!\n");    return num; -get_from_user: -  return ask_partition(4)-1;  }  //taking user input for partition start/end sectors/cyinders @@ -831,12 +827,12 @@ static sector_t ask_start_sector(int idx, sector_t* begin, sector_t* end, int ex      if (asked) valid = validate(start_index, begin, end, start, asked);      if (valid) break; -find_start_again: -    for (i = start_index; i < num_parts; i++)  -      if (start >= begin[i] && start <= end[i]) -        start = end[i] + 1 + ((idx >= 4)? offset : 0); +    do { +      for (i = start_index; i < num_parts; i++)  +        if (start >= begin[i] && start <= end[i]) +          start = end[i] + 1 + ((idx >= 4)? offset : 0); +    } while (!validate(start_index, begin, end, start, 0)); -    if (!validate(start_index, begin, end, start, 0)) goto find_start_again;      start_cyl = start/(g_sectors * g_heads) + 1;      limit_cyl = limit/(g_sectors * g_heads) + 1; @@ -1282,37 +1278,37 @@ static void fix_order(void)  static void print_menu(void)  { -  xprintf("a\ttoggle a bootable flag\n"); -  xprintf("b\tedit bsd disklabel\n"); -  xprintf("c\ttoggle the dos compatibility flag\n"); -  xprintf("d\tdelete a partition\n"); -  xprintf("l\tlist known partition types\n"); -  xprintf("n\tadd a new partition\n"); -  xprintf("o\tcreate a new empty DOS partition table\n"); -  xprintf("p\tprint the partition table\n"); -  xprintf("q\tquit without saving changes\n"); -  xprintf("s\tcreate a new empty Sun disklabel\n");  /* sun */ -  xprintf("t\tchange a partition's system id\n"); -  xprintf("u\tchange display/entry units\n"); -  xprintf("v\tverify the partition table\n"); -  xprintf("w\twrite table to disk and exit\n"); -  xprintf("x\textra functionality (experts only)\n"); +  xprintf("a\ttoggle a bootable flag\n" +  "b\tedit bsd disklabel\n" +  "c\ttoggle the dos compatibility flag\n" +  "d\tdelete a partition\n" +  "l\tlist known partition types\n" +  "n\tadd a new partition\n" +  "o\tcreate a new empty DOS partition table\n" +  "p\tprint the partition table\n" +  "q\tquit without saving changes\n" +  "s\tcreate a new empty Sun disklabel\n" +  "t\tchange a partition's system id\n" +  "u\tchange display/entry units\n" +  "v\tverify the partition table\n" +  "w\twrite table to disk and exit\n" +  "x\textra functionality (experts only)\n");  }  static void print_xmenu(void)  { -  xprintf("b\tmove beginning of data in a partition\n"); -  xprintf("c\tchange number of cylinders\n"); -  xprintf("d\tprint the raw data in the partition table\n"); -  xprintf("e\tlist extended partitions\n"); -  xprintf("f\tfix partition order\n");     -  xprintf("h\tchange number of heads\n"); -  xprintf("p\tprint the partition table\n"); -  xprintf("q\tquit without saving changes\n"); -  xprintf("r\treturn to main menu\n"); -  xprintf("s\tchange number of sectors/track\n"); -  xprintf("v\tverify the partition table\n"); -  xprintf("w\twrite table to disk and exit\n"); +  xprintf("b\tmove beginning of data in a partition\n" +  "c\tchange number of cylinders\n" +  "d\tprint the raw data in the partition table\n" +  "e\tlist extended partitions\n" +  "f\tfix partition order\n"   +  "h\tchange number of heads\n" +  "p\tprint the partition table\n" +  "q\tquit without saving changes\n" +  "r\treturn to main menu\n" +  "s\tchange number of sectors/track\n" +  "v\tverify the partition table\n" +  "w\twrite table to disk and exit\n");  }  static void expert_menu(void) | 
