(resending to the correct bug number.  Sorry for the noise.)
Alessio Treglia wrote:

>      - Soname libmtp.so.9.0.0 - new ABI:
>        + New state fields are added in an exposed public struct. Programs need
>          to be recompiled and relinked against the new libmtp but then they
>          should work.

Backward-incompatible ABI changes:

 * 38d7ee8d776a 2010-07-24 Implemented an extension parser

        LIBMTP_mtpdevice_struct: new field "extensions"

 * a8b8889ee366 2011-03-03 Code revamps and new interfaces for
   use in an OS X MTP file transfer program for Android

        LIBMTP_mtpdevice_struct: new field "cached"
        LIBMTP_filetype_t: new enumerator "LIBMTP_FILETYPE_FOLDER"

Now, good news: the ->cd field is completely unused since libmtp-0-0-18~3,
so we can take it over.  Here's a series doing that --- what do you think?

Jonathan Nieder (5):
  Renumber filetypes to match libmtp 1.0.3
  Introduce _libmtp9_extras field in LIBMTP_mtpdevice_struct
  Move extensions field to _libmtp9_extras
  Move cached field to _libmtp9_extras
  Lower soname to match libmtp 1.0.3

 src/Makefile.am |    4 ++--
 src/libmtp.c    |   57 ++++++++++++++++++++++++++++++++++++++++++-------------
 src/libmtp.h.in |   17 +++++++++--------
 3 files changed, 55 insertions(+), 23 deletions(-)
From: Jonathan Nieder <[email protected]>
Date: Mon, 10 Sep 2012 11:49:23 -0700
Subject: Renumber filetypes to match libmtp 1.0.3

When libmtp-1-1-0~34 (Code revamps and new interfaces for use in an
OS X MTP file transfer program for Android, 2011-03-03) introduced the
new LIBMTP_FILETYPE_FOLDER filetype, it inserted it at the beginning
of the filetype enumeration, adding 1 to all other enumerator values.
That's fine when accompanied by an ABI bump (and it was), but if we
want the library to satisfy dependencies by programs that used the old
enumerator values (and helper macros that use the same) and old ABI
instead, we need to set the numbers back.

Do so.

Signed-off-by: Jonathan Nieder <[email protected]>
---
 src/libmtp.h.in |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/libmtp.h.in b/src/libmtp.h.in
index d7ce956..1d72abf 100644
--- a/src/libmtp.h.in
+++ b/src/libmtp.h.in
@@ -82,7 +82,6 @@ typedef unsigned __int64 uint64_t;
  * as PTP-defined enumerator types is something different.
  */
 typedef enum {
-  LIBMTP_FILETYPE_FOLDER,
   LIBMTP_FILETYPE_WAV,
   LIBMTP_FILETYPE_MP3,
   LIBMTP_FILETYPE_WMA,
@@ -126,7 +125,8 @@ typedef enum {
   LIBMTP_FILETYPE_JPX,
   LIBMTP_FILETYPE_ALBUM,
   LIBMTP_FILETYPE_PLAYLIST,
-  LIBMTP_FILETYPE_UNKNOWN
+  LIBMTP_FILETYPE_UNKNOWN,
+  LIBMTP_FILETYPE_FOLDER
 } LIBMTP_filetype_t;
 
 /**
-- 
1.7.10.4

From: Jonathan Nieder <[email protected]>
Date: Mon, 10 Sep 2012 11:16:56 -0700
Subject: Introduce _libmtp9_extras field in LIBMTP_mtpdevice_struct

Modern libmtp uses soname libmtp.so.9, but Debian 6.0 (squeeze) is
built against the older libmtp.so.8 ABI, preventing that OS from
benefitting from recent hardware support improvements.  This patch is
part of a Debian-specific patch series to adapt the current codebase
to follow the older ABI.

As a first step, introduce a private struct to hold new per-device
fields without modifying the layout of the mtpdevice struct.  Point
to this private extension in the word used for the old ->cd field
which has been conveniently unused since libmtp 0.0.18.

Signed-off-by: Jonathan Nieder <[email protected]>
---
 src/libmtp.c    |   19 +++++++++++++++++++
 src/libmtp.h.in |    9 +++++++--
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/src/libmtp.c b/src/libmtp.c
index 6a2741f..563ac29 100644
--- a/src/libmtp.c
+++ b/src/libmtp.c
@@ -114,6 +114,9 @@ typedef struct propertymap_struct {
   struct propertymap_struct *next;
 } propertymap_t;
 
+struct libmtp9_extras {
+};
+
 // Global variables
 // This holds the global filetype mapping table
 static filemap_t *filemap = NULL;
@@ -1810,6 +1813,7 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device_Uncached(LIBMTP_raw_device_t *rawdevi
   LIBMTP_mtpdevice_t *mtp_device;
   uint8_t bs = 0;
   PTPParams *current_params;
+  struct libmtp9_extras *current_extras;
   PTP_USB *ptp_usb;
   LIBMTP_error_number_t err;
   int i;
@@ -1832,9 +1836,19 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device_Uncached(LIBMTP_raw_device_t *rawdevi
   // Non-cached by default
   mtp_device->cached = 0;
 
+  /* Allocate extra space for libmtp9 fields */
+  current_extras = malloc(sizeof(*current_extras));
+  if (current_extras == NULL) {
+    free(mtp_device);
+    return NULL;
+  }
+  memset(current_extras, 0, sizeof(*current_extras));
+  mtp_device->_libmtp9_extras = current_extras;
+
   /* Create PTP params */
   current_params = (PTPParams *) malloc(sizeof(PTPParams));
   if (current_params == NULL) {
+    free(current_extras);
     free(mtp_device);
     return NULL;
   }
@@ -1858,6 +1872,7 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device_Uncached(LIBMTP_raw_device_t *rawdevi
      current_params->cd_ucs2_to_locale == (iconv_t) -1) {
     LIBMTP_ERROR("LIBMTP PANIC: Cannot open iconv() converters to/from 
UCS-2!\n"
            "Too old stdlibc, glibc and libiconv?\n");
+    free(current_extras);
     free(current_params);
     free(mtp_device);
     return NULL;
@@ -1869,6 +1884,7 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device_Uncached(LIBMTP_raw_device_t *rawdevi
                             current_params,
                             &mtp_device->usbinfo);
   if (err != LIBMTP_ERROR_NONE) {
+    free(current_extras);
     free(current_params);
     free(mtp_device);
     return NULL;
@@ -1886,6 +1902,7 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device_Uncached(LIBMTP_raw_device_t *rawdevi
 
     /* Prevent memory leaks for this device */
     free(mtp_device->usbinfo);
+    free(mtp_device->_libmtp9_extras);
     free(mtp_device->params);
     current_params = NULL;
     free(mtp_device);
@@ -2333,6 +2350,7 @@ void LIBMTP_Release_Device_List(LIBMTP_mtpdevice_t 
*device)
  */
 void LIBMTP_Release_Device(LIBMTP_mtpdevice_t *device)
 {
+  struct libmtp9_extras *device9 = device->_libmtp9_extras;
   PTPParams *params = (PTPParams *) device->params;
   PTP_USB *ptp_usb = (PTP_USB*) device->usbinfo;
 
@@ -2358,6 +2376,7 @@ void LIBMTP_Release_Device(LIBMTP_mtpdevice_t *device)
       tmp = next;
     }
   }
+  free(device9);
   free(device);
 }
 
diff --git a/src/libmtp.h.in b/src/libmtp.h.in
index 1d72abf..8165197 100644
--- a/src/libmtp.h.in
+++ b/src/libmtp.h.in
@@ -640,8 +640,13 @@ struct LIBMTP_mtpdevice_struct {
   uint32_t default_album_folder;
   /** Default Text folder */
   uint32_t default_text_folder;
-  /** Per device iconv() converters, only used internally */
-  void *cd;
+  /**
+   * Backward compatibility hack:
+   *
+   * Fields added in libmtp9 ABI.  Must be cast into
+   * \c (struct libmtp9_extras*) before internal use.
+   */
+  void *_libmtp9_extras;
   /** Extension list */
   LIBMTP_device_extension_t *extensions;
   /** Whether the device uses caching, only used internally */
-- 
1.7.10.4

From: Jonathan Nieder <[email protected]>
Date: Mon, 10 Sep 2012 11:31:02 -0700
Subject: Move extensions field to _libmtp9_extras

The "extensions" field was not made public until libmtp-1-0-4~54
(Implemented an extension parser, 2010-07-24) and is not part of the
libmtp.so.8 ABI.

Signed-off-by: Jonathan Nieder <[email protected]>
---
 src/libmtp.c    |   21 +++++++++++++--------
 src/libmtp.h.in |    2 --
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/src/libmtp.c b/src/libmtp.c
index 563ac29..b9e1f45 100644
--- a/src/libmtp.c
+++ b/src/libmtp.c
@@ -115,6 +115,7 @@ typedef struct propertymap_struct {
 } propertymap_t;
 
 struct libmtp9_extras {
+  LIBMTP_device_extension_t *extensions; /**< Extension list */
 };
 
 // Global variables
@@ -1765,6 +1766,7 @@ static void parse_extension_descriptor(LIBMTP_mtpdevice_t 
*mtpdevice,
           while (element[i] != '.' && i < strlen(element))
             i++;
           if (i > majstart && i < strlen(element)) {
+            struct libmtp9_extras *device9 = mtpdevice->_libmtp9_extras;
             LIBMTP_device_extension_t *extension;
             int major = 0;
             int minor = 0;
@@ -1777,10 +1779,10 @@ static void 
parse_extension_descriptor(LIBMTP_mtpdevice_t *mtpdevice,
             extension->major = major;
             extension->minor = minor;
             extension->next = NULL;
-            if (mtpdevice->extensions == NULL) {
-              mtpdevice->extensions = extension;
+            if (device9->extensions == NULL) {
+              device9->extensions = extension;
             } else {
-              LIBMTP_device_extension_t *tmp = mtpdevice->extensions;
+              LIBMTP_device_extension_t *tmp = device9->extensions;
               while (tmp->next != NULL)
                 tmp = tmp->next;
               tmp->next = extension;
@@ -1933,7 +1935,8 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device_Uncached(LIBMTP_raw_device_t *rawdevi
    * I just know only NWZs have it.
    */
   {
-    LIBMTP_device_extension_t *tmpext = mtp_device->extensions;
+    struct libmtp9_extras *device9 = mtp_device->_libmtp9_extras;
+    LIBMTP_device_extension_t *tmpext = device9->extensions;
     int is_microsoft_com_wpdna = 0;
     int is_android = 0;
     int is_sony_net_wmfu = 0;
@@ -2106,7 +2109,8 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device(LIBMTP_raw_device_t *rawdevice)
 
   /* Check for MTPZ devices. */
   if (use_mtpz) {
-    LIBMTP_device_extension_t *tmpext = mtp_device->extensions;
+    struct libmtp9_extras *device9 = mtp_device->_libmtp9_extras;
+    LIBMTP_device_extension_t *tmpext = device9->extensions;
 
     while (tmpext != NULL) {
       if (!strcmp(tmpext->name, "microsoft.com/MTPZ")) {
@@ -2364,8 +2368,8 @@ void LIBMTP_Release_Device(LIBMTP_mtpdevice_t *device)
   ptp_free_params(params);
   free_storage_list(device);
   // Free extension list...
-  if (device->extensions != NULL) {
-    LIBMTP_device_extension_t *tmp = device->extensions;
+  if (device9->extensions != NULL) {
+    LIBMTP_device_extension_t *tmp = device9->extensions;
 
     while (tmp != NULL) {
       LIBMTP_device_extension_t *next = tmp->next;
@@ -3044,10 +3048,11 @@ static int get_storage_freespace(LIBMTP_mtpdevice_t 
*device,
 void LIBMTP_Dump_Device_Info(LIBMTP_mtpdevice_t *device)
 {
   int i;
+  struct libmtp9_extras *device9 = device->_libmtp9_extras;
   PTPParams *params = (PTPParams *) device->params;
   PTP_USB *ptp_usb = (PTP_USB*) device->usbinfo;
   LIBMTP_devicestorage_t *storage = device->storage;
-  LIBMTP_device_extension_t *tmpext = device->extensions;
+  LIBMTP_device_extension_t *tmpext = device9->extensions;
 
   printf("USB low-level info:\n");
   dump_usbinfo(ptp_usb);
diff --git a/src/libmtp.h.in b/src/libmtp.h.in
index 8165197..9b86d66 100644
--- a/src/libmtp.h.in
+++ b/src/libmtp.h.in
@@ -647,8 +647,6 @@ struct LIBMTP_mtpdevice_struct {
    * \c (struct libmtp9_extras*) before internal use.
    */
   void *_libmtp9_extras;
-  /** Extension list */
-  LIBMTP_device_extension_t *extensions;
   /** Whether the device uses caching, only used internally */
   int cached;
 
-- 
1.7.10.4

From: Jonathan Nieder <[email protected]>
Date: Mon, 10 Sep 2012 11:36:48 -0700
Subject: Move cached field to _libmtp9_extras

The "cached" field was not introduced until libmtp-1-1-0~34
(Code revamps and new interfaces for an OS X MTP transfer program
for Android, 2011-03-03) and is not part of the libmtp.so.8 ABI.

Signed-off-by: Jonathan Nieder <[email protected]>
---
 src/libmtp.c    |   21 ++++++++++++++-------
 src/libmtp.h.in |    2 --
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/src/libmtp.c b/src/libmtp.c
index b9e1f45..f95b85f 100644
--- a/src/libmtp.c
+++ b/src/libmtp.c
@@ -116,6 +116,7 @@ typedef struct propertymap_struct {
 
 struct libmtp9_extras {
   LIBMTP_device_extension_t *extensions; /**< Extension list */
+  int cached; /**< Whether the device uses caching */
 };
 
 // Global variables
@@ -1835,8 +1836,6 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device_Uncached(LIBMTP_raw_device_t *rawdevi
 
     return NULL;
   }
-  // Non-cached by default
-  mtp_device->cached = 0;
 
   /* Allocate extra space for libmtp9 fields */
   current_extras = malloc(sizeof(*current_extras));
@@ -1845,6 +1844,9 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device_Uncached(LIBMTP_raw_device_t *rawdevi
     return NULL;
   }
   memset(current_extras, 0, sizeof(*current_extras));
+
+  // Non-cached by default
+  current_extras->cached = 0;
   mtp_device->_libmtp9_extras = current_extras;
 
   /* Create PTP params */
@@ -2103,13 +2105,15 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device_Uncached(LIBMTP_raw_device_t *rawdevi
 LIBMTP_mtpdevice_t *LIBMTP_Open_Raw_Device(LIBMTP_raw_device_t *rawdevice)
 {
   LIBMTP_mtpdevice_t *mtp_device = LIBMTP_Open_Raw_Device_Uncached(rawdevice);
+  struct libmtp9_extras *device9;
 
   if (mtp_device == NULL)
     return NULL;
 
+  device9 = mtp_device->_libmtp9_extras;
+
   /* Check for MTPZ devices. */
   if (use_mtpz) {
-    struct libmtp9_extras *device9 = mtp_device->_libmtp9_extras;
     LIBMTP_device_extension_t *tmpext = device9->extensions;
 
     while (tmpext != NULL) {
@@ -2127,7 +2131,7 @@ LIBMTP_mtpdevice_t 
*LIBMTP_Open_Raw_Device(LIBMTP_raw_device_t *rawdevice)
   }
 
   // Set up this device as cached
-  mtp_device->cached = 1;
+  device9->cached = 1;
   /*
    * Then get the handles and try to locate the default folders.
    * This has the desired side effect of caching all handles from
@@ -2715,12 +2719,13 @@ static void get_handles_recursively(LIBMTP_mtpdevice_t 
*device,
  */
 static void flush_handles(LIBMTP_mtpdevice_t *device)
 {
+  struct libmtp9_extras *device9 = device->_libmtp9_extras;
   PTPParams *params = (PTPParams *) device->params;
   PTP_USB *ptp_usb = (PTP_USB*) device->usbinfo;
   int ret;
   uint32_t i;
 
-  if (!device->cached) {
+  if (!device9->cached) {
     return;
   }
 
@@ -4213,13 +4218,14 @@ static LIBMTP_file_t *obj2file(LIBMTP_mtpdevice_t 
*device, PTPObject *ob)
  */
 LIBMTP_file_t *LIBMTP_Get_Filemetadata(LIBMTP_mtpdevice_t *device, uint32_t 
const fileid)
 {
+  struct libmtp9_extras *device9 = device->_libmtp9_extras;
   PTPParams *params = (PTPParams *) device->params;
   uint16_t ret;
   PTPObject *ob;
 
   // Get all the handles if we haven't already done that
   // (Only on cached devices.)
-  if (device->cached && params->nrofobjects == 0) {
+  if (device9->cached && params->nrofobjects == 0) {
     flush_handles(device);
   }
 
@@ -4352,6 +4358,7 @@ LIBMTP_file_t * 
LIBMTP_Get_Files_And_Folders(LIBMTP_mtpdevice_t *device,
                             uint32_t const storage,
                             uint32_t const parent)
 {
+  struct libmtp9_extras *device9 = device->_libmtp9_extras;
   PTPParams *params = (PTPParams *) device->params;
   PTP_USB *ptp_usb = (PTP_USB*) device->usbinfo;
   LIBMTP_file_t *retfiles = NULL;
@@ -4361,7 +4368,7 @@ LIBMTP_file_t * 
LIBMTP_Get_Files_And_Folders(LIBMTP_mtpdevice_t *device,
   uint16_t ret;
   int i = 0;
 
-  if (device->cached) {
+  if (device9->cached) {
     // This function is only supposed to be used by devices
     // opened as uncached!
     LIBMTP_ERROR("tried to use %s on a cached device!\n",
diff --git a/src/libmtp.h.in b/src/libmtp.h.in
index 9b86d66..f6a13ab 100644
--- a/src/libmtp.h.in
+++ b/src/libmtp.h.in
@@ -647,8 +647,6 @@ struct LIBMTP_mtpdevice_struct {
    * \c (struct libmtp9_extras*) before internal use.
    */
   void *_libmtp9_extras;
-  /** Whether the device uses caching, only used internally */
-  int cached;
 
   /** Pointer to next device in linked list; NULL if this is the last device */
   LIBMTP_mtpdevice_t *next;
-- 
1.7.10.4

From: Jonathan Nieder <[email protected]>
Date: Mon, 10 Sep 2012 11:59:45 -0700
Subject: Lower soname to match libmtp 1.0.3

Signed-off-by: Jonathan Nieder <[email protected]>
---
 src/Makefile.am |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index 39e8083..3920c6f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -46,8 +46,8 @@ EXTRA_DIST=libmtp.h.in libmtp.sym ptp-pack.c
 #  increment AGE, Otherwise AGE is reset to 0. If CURRENT has changed,
 #  REVISION is set to 0, otherwise REVISION is incremented.
 # ---------------------------------------------------------------------------
-CURRENT=9
-AGE=0
+CURRENT=12
+AGE=4
 REVISION=4
 SOVERSION=$(CURRENT):$(REVISION):$(AGE)
 LT_CURRENT_MINUS_AGE=`expr $(CURRENT) - $(AGE)`
-- 
1.7.10.4

Reply via email to