Fix 4G file transfer on 32 bit.

ptp_usb_senddata will store file size in a uint64_t,
but ptp_write_func casts this down to an unsigned long,
which is 32 bits on i386.

To fix, break up transfers into pieces less than
ULONG_MAX rounded down by packet size.
diff --git a/src/libopenusb1-glue.c b/src/libopenusb1-glue.c
index 4d88f82..a4cfbad 100644
--- a/src/libopenusb1-glue.c
+++ b/src/libopenusb1-glue.c
@@ -1210,6 +1210,10 @@
     PTPUSBBulkContainer usbdata;
     uint64_t bytes_left_to_transfer;
     PTPDataHandler memhandler;
+    unsigned long packet_size;
+    PTP_USB *ptp_usb = (PTP_USB *) params->data;
+
+    packet_size = ptp_usb->inep_maxpacket;
 
     LIBMTP_USB_DEBUG("SEND DATA PHASE\n");
 
@@ -1252,7 +1256,9 @@
     bytes_left_to_transfer = size - datawlen;
     ret = PTP_RC_OK;
     while (bytes_left_to_transfer > 0) {
-        ret = ptp_write_func(bytes_left_to_transfer, handler, params->data, &written);
+	int max_long_transfer = ULONG_MAX + 1 - packet_size;
+	ret = ptp_write_func (bytes_left_to_transfer > max_long_transfer ? max_long_transfer : bytes_left_to_transfer,
+		handler, params->data, &written);
         if (ret != PTP_RC_OK){
             break;
         }
diff --git a/src/libusb-glue.c b/src/libusb-glue.c
index 722a591..0079b08 100644
--- a/src/libusb-glue.c
+++ b/src/libusb-glue.c
@@ -1202,6 +1202,10 @@
 	PTPUSBBulkContainer usbdata;
 	uint64_t bytes_left_to_transfer;
 	PTPDataHandler memhandler;
+	unsigned long packet_size;
+	PTP_USB *ptp_usb = (PTP_USB *) params->data;
+
+	packet_size = ptp_usb->inep_maxpacket;
 
 
 	LIBMTP_USB_DEBUG("SEND DATA PHASE\n");
@@ -1242,7 +1246,9 @@
 	bytes_left_to_transfer = size-datawlen;
 	ret = PTP_RC_OK;
 	while(bytes_left_to_transfer > 0) {
-		ret = ptp_write_func (bytes_left_to_transfer, handler, params->data, &written);
+		int max_long_transfer = ULONG_MAX + 1 - packet_size;
+		ret = ptp_write_func (bytes_left_to_transfer > max_long_transfer ? max_long_transfer : bytes_left_to_transfer,
+			handler, params->data, &written);
 		if (ret != PTP_RC_OK)
 			break;
 		if (written == 0) {
diff --git a/src/libusb1-glue.c b/src/libusb1-glue.c
index 8894378..3098553 100644
--- a/src/libusb1-glue.c
+++ b/src/libusb1-glue.c
@@ -1227,6 +1227,10 @@
 	PTPUSBBulkContainer usbdata;
 	uint64_t bytes_left_to_transfer;
 	PTPDataHandler memhandler;
+	unsigned long packet_size;
+	PTP_USB *ptp_usb = (PTP_USB *) params->data;
+
+	packet_size = ptp_usb->outep_maxpacket;
 
 
 	LIBMTP_USB_DEBUG("SEND DATA PHASE\n");
@@ -1267,7 +1271,9 @@
 	bytes_left_to_transfer = size-datawlen;
 	ret = PTP_RC_OK;
 	while(bytes_left_to_transfer > 0) {
-		ret = ptp_write_func (bytes_left_to_transfer, handler, params->data, &written);
+		int max_long_transfer = ULONG_MAX + 1 - packet_size;
+		ret = ptp_write_func (bytes_left_to_transfer > max_long_transfer ? max_long_transfer : bytes_left_to_transfer,
+			handler, params->data, &written);
 		if (ret != PTP_RC_OK)
 			break;
 		if (written == 0) {