grobian@gentoo.org

not sure what big_pt.patch was tested on, but partitioning a 2TB disk
(Blocks=3907029168) won't work, with a daft warning, and no joy

upgrade size storage to unsigned long long, so we can store these sizes
tested on a PowerMac G5 with a 2TB SATA drive


--- mac-fdisk-0.1.orig/io.c	2022-06-01 19:37:08.000000000 +0200
+++ mac-fdisk-0.1.orig/io.c	2022-06-01 20:32:12.000000000 +0200
@@ -85,7 +85,7 @@
 //
 // Forward declarations
 //
-long get_number(int first_char);
+long long get_number(int first_char);
 char* get_string(int eos);
 #ifndef __linux__
 int DoTestUnitReady(UInt8 targetID);
@@ -201,9 +205,8 @@
     return 0;
 }
 
-	
 int
-get_number_argument(char *prompt, long *number, long default_value)
+get_number_argument_long(char *prompt, long long *number, long long default_value)
 {
     int c;
     int result = 0;
@@ -237,14 +241,22 @@
     return result;
 }
 
+int
+get_number_argument(char *prompt, long *number, long default_value)
+{
+    long long retval = (long long)default_value;
+    int ret = get_number_argument_long(prompt, &retval, retval);
+    *number = (long)retval;
+    return ret;
+}
 
-long
+long long
 get_number(int first_char)
 {
     register int c;
     int base;
     int digit;
-    int ret_value;
+    long long ret_value;
 
     if (first_char != '0') {
 	c = first_char;
--- mac-fdisk-0.1.orig/io.h	1997-01-09 23:31:31.000000000 +0100
+++ mac-fdisk-0.1.orig/io.h	2022-06-01 20:10:20.000000000 +0200
@@ -57,6 +57,7 @@
 int get_command(char *prompt, int promptBeforeGet, int *command);
 long get_multiplier(long divisor);
 int get_number_argument(char *prompt, long *number, long default_value);
+int get_number_argument_long(char *prompt, long long *number, long long default_value);
 int get_okay(char *prompt, int default_value);
 int get_string_argument(char *prompt, char **string, int reprompt);
 int getch();
--- mac-fdisk-0.1.orig/partition_map.c	2022-06-01 19:37:08.000000000 +0200
+++ mac-fdisk-0.1.orig/partition_map.c	2022-06-01 20:16:26.000000000 +0200
@@ -90,7 +90,7 @@
 void coerce_block0(partition_map_header *map);
 int contains_driver(partition_map *entry);
 void combine_entry(partition_map *entry);
-long compute_device_size(int fd);
+unsigned long long compute_device_size(int fd);
 DPME* create_data(const char *name, const char *dptype, u32 base, u32 length);
 partition_map_header* create_partition_map(char *name);
 void delete_entry(partition_map *entry);
@@ -407,7 +407,7 @@
     int fd;
     partition_map_header * map;
     DPME *data;
-    unsigned long number;
+    unsigned long long number;
 #ifdef __linux__
     struct stat info;
 #endif
@@ -435,13 +435,14 @@
     map->maximum_in_map = -1;
 
     number = compute_device_size(fd);
-    printf("size of 'device' is %u blocks: ", (unsigned int)number);
+    printf("size of 'device' is %llu blocks: ", number);
+    fflush(NULL);
     flush_to_newline(0);
-    get_number_argument("what should be the size? ", (long *)&number, number);
+    get_number_argument_long("what should be the size? ", (long long *)&number, (long long)number);
     if (number < 4) {
 	number = 4;
     }
-    printf("new size of 'device' is %u blocks\n", (unsigned int)number);
+    printf("new size of 'device' is %llu blocks\n", number);
     map->media_size = number;
 
 #ifdef __linux__
@@ -468,7 +469,7 @@
 	    data->dpme_signature = DPME_SIGNATURE;
 	    data->dpme_map_entries = 1;
 	    data->dpme_pblock_start = 1;
-	    data->dpme_pblocks = map->media_size - 1;
+	    data->dpme_pblocks = (u32)(map->media_size - 1);
 	    strncpy(data->dpme_name, kFreeName, DPISTRLEN);
 	    strncpy(data->dpme_type, kFreeType, DPISTRLEN);
 	    data->dpme_lblock_start = 0;
@@ -506,7 +507,7 @@
     if (p->sbSig != BLOCK0_SIGNATURE) {
 	p->sbSig = BLOCK0_SIGNATURE;
 	p->sbBlkSize = 512;
-	p->sbBlkCount = map->media_size;
+	p->sbBlkCount = (u32)map->media_size;
 	p->sbDevType = 0;
 	p->sbDevId = 0;
 	p->sbData = 0;
@@ -573,7 +574,7 @@
     }
 	// if the map will overflow then punt
     if (map->maximum_in_map < 0) {
-	limit = map->media_size;
+	limit = (int)map->media_size;
     } else {
 	limit = map->maximum_in_map;
     }
@@ -661,7 +662,7 @@
 }
 
 
-long
+unsigned long long
 compute_device_size(int fd)
 {
 #ifdef TEST_COMPUTE
@@ -753,11 +754,7 @@
 	free(data);
     }
     
-    // Add a warning just in case...
-    if(x > 0x80000000)
-    	printf("Warning: Large disks may not work with this tool!\n");
-
-    return (unsigned long) x;
+    return x;
 }
 
 
--- mac-fdisk-0.1.orig/partition_map.h	2022-06-01 19:37:08.000000000 +0200
+++ mac-fdisk-0.1.orig/partition_map.h	2022-06-01 19:37:49.000000000 +0200
@@ -47,7 +47,7 @@
     int regular_file;
     int blocks_in_map;
     int maximum_in_map;
-    unsigned long media_size;
+    unsigned long long media_size;
 };
 typedef struct partition_map_header partition_map_header;
 
