New upstream version
This commit is contained in:
parent
51268617c1
commit
edc9d25582
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,2 +1,6 @@
|
||||
libmtp-1.0.3.tar.gz
|
||||
/libmtp-1.0.4.tar.gz
|
||||
/libmtp-1.0.5.tar.gz
|
||||
*.log
|
||||
*.rpm
|
||||
i386
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 3230d1d0f2afbae4145f11437f623d1611d855a2 Mon Sep 17 00:00:00 2001
|
||||
From: Linus Walleij <triad@df.lth.se>
|
||||
Date: Mon, 24 Jan 2011 19:31:25 +0100
|
||||
Subject: [PATCH] Fix inverted boolean logic...
|
||||
|
||||
---
|
||||
src/libusb-glue.c | 6 +++---
|
||||
1 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/libusb-glue.c b/src/libusb-glue.c
|
||||
index ca8c47d..a702eed 100644
|
||||
--- a/src/libusb-glue.c
|
||||
+++ b/src/libusb-glue.c
|
||||
@@ -237,9 +237,9 @@ static int probe_device_descriptor(struct usb_device *dev, FILE *dumpfile)
|
||||
* contain any MTP interface, update this the day
|
||||
* you find some weird combination...
|
||||
*/
|
||||
- if (dev->descriptor.bDeviceClass != USB_CLASS_PER_INTERFACE &&
|
||||
- dev->descriptor.bDeviceClass != USB_CLASS_COMM &&
|
||||
- dev->descriptor.bDeviceClass != USB_CLASS_PTP &&
|
||||
+ if (dev->descriptor.bDeviceClass != USB_CLASS_PER_INTERFACE ||
|
||||
+ dev->descriptor.bDeviceClass != USB_CLASS_COMM ||
|
||||
+ dev->descriptor.bDeviceClass != USB_CLASS_PTP ||
|
||||
dev->descriptor.bDeviceClass != USB_CLASS_VENDOR_SPEC) {
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
1.7.3.4
|
||||
|
@ -1,266 +0,0 @@
|
||||
From 9db8a316a880caddf82227f69d7a8607fb674146 Mon Sep 17 00:00:00 2001
|
||||
From: Linus Walleij <linus.walleij@stericsson.com>
|
||||
Date: Wed, 19 Jan 2011 19:20:34 +0100
|
||||
Subject: [PATCH] Fixup device OS descriptor probe code
|
||||
|
||||
This was to dangerous, so now we only probe:
|
||||
|
||||
- Devices that are of known classes to conatin MTP extensions:
|
||||
COMM, PTP, CUSTOM and per-interface.
|
||||
- Unless the device is CUSTOM, it needs to contain atleast one
|
||||
CUSTOM interface.
|
||||
- Clear halt on EP 0 after probe if it fails with error.
|
||||
|
||||
Signed-off-by: Linus Walleij <triad@df.lth.se>
|
||||
---
|
||||
src/libusb-glue.c | 208 +++++++++++++++++++++++++++++++----------------------
|
||||
1 files changed, 121 insertions(+), 87 deletions(-)
|
||||
|
||||
diff --git a/src/libusb-glue.c b/src/libusb-glue.c
|
||||
index ea22384..ca8c47d 100644
|
||||
--- a/src/libusb-glue.c
|
||||
+++ b/src/libusb-glue.c
|
||||
@@ -229,13 +229,18 @@ static int probe_device_descriptor(struct usb_device *dev, FILE *dumpfile)
|
||||
unsigned char buf[1024], cmd;
|
||||
int i;
|
||||
int ret;
|
||||
+ /* This is to indicate if we find some vendor interface */
|
||||
+ int found_vendor_spec_interface = 0;
|
||||
|
||||
/*
|
||||
- * Don't examine hubs or HID devices, no point in that.
|
||||
- * (Some Kensington mice really don't like this.)
|
||||
+ * Don't examine devices that are not likely to
|
||||
+ * contain any MTP interface, update this the day
|
||||
+ * you find some weird combination...
|
||||
*/
|
||||
- if (dev->descriptor.bDeviceClass == USB_CLASS_HUB ||
|
||||
- dev->descriptor.bDeviceClass == USB_CLASS_HID) {
|
||||
+ if (dev->descriptor.bDeviceClass != USB_CLASS_PER_INTERFACE &&
|
||||
+ dev->descriptor.bDeviceClass != USB_CLASS_COMM &&
|
||||
+ dev->descriptor.bDeviceClass != USB_CLASS_PTP &&
|
||||
+ dev->descriptor.bDeviceClass != USB_CLASS_VENDOR_SPEC) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -270,6 +275,15 @@ static int probe_device_descriptor(struct usb_device *dev, FILE *dumpfile)
|
||||
&dev->config[i].interface[j].altsetting[k];
|
||||
|
||||
/*
|
||||
+ * We only want to probe for the OS descriptor if the
|
||||
+ * device is USB_CLASS_VENDOR_SPEC or one of the interfaces
|
||||
+ * in it is, so flag if we find an interface like this.
|
||||
+ */
|
||||
+ if (intf->bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
|
||||
+ found_vendor_spec_interface = 1;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
* Check for Still Image Capture class with PIMA 15740 protocol,
|
||||
* also known as PTP
|
||||
*/
|
||||
@@ -329,98 +343,118 @@ static int probe_device_descriptor(struct usb_device *dev, FILE *dumpfile)
|
||||
LIBMTP_INFO("dev->config is NULL in probe_device_descriptor yet dev->descriptor.bNumConfigurations > 0\n");
|
||||
}
|
||||
|
||||
- /* Read the special descriptor */
|
||||
- ret = usb_get_descriptor(devh, 0x03, 0xee, buf, sizeof(buf));
|
||||
+ /*
|
||||
+ * Only probe for OS descriptor if the device is vendor specific
|
||||
+ * or one of the interfaces found is.
|
||||
+ */
|
||||
+ if (dev->descriptor.bDeviceClass == USB_CLASS_VENDOR_SPEC ||
|
||||
+ found_vendor_spec_interface) {
|
||||
|
||||
- // Dump it, if requested
|
||||
- if (dumpfile != NULL && ret > 0) {
|
||||
- fprintf(dumpfile, "Microsoft device descriptor 0xee:\n");
|
||||
- data_dump_ascii(dumpfile, buf, ret, 16);
|
||||
- }
|
||||
+ /* Read the special descriptor */
|
||||
+ ret = usb_get_descriptor(devh, 0x03, 0xee, buf, sizeof(buf));
|
||||
|
||||
- /* Check if descriptor length is at least 10 bytes */
|
||||
- if (ret < 10) {
|
||||
- usb_close(devh);
|
||||
- return 0;
|
||||
- }
|
||||
+ /*
|
||||
+ * If something failed we're probably stalled to we need
|
||||
+ * to clear the stall off the endpoint and say this is not
|
||||
+ * MTP.
|
||||
+ */
|
||||
+ if (ret < 0) {
|
||||
+ /* EP0 is the default control endpoint */
|
||||
+ usb_clear_halt(devh, 0);
|
||||
+ usb_close(devh);
|
||||
+ return 0;
|
||||
+ }
|
||||
|
||||
- /* Check if this device has a Microsoft Descriptor */
|
||||
- if (!((buf[2] == 'M') && (buf[4] == 'S') &&
|
||||
- (buf[6] == 'F') && (buf[8] == 'T'))) {
|
||||
- usb_close(devh);
|
||||
- return 0;
|
||||
- }
|
||||
+ // Dump it, if requested
|
||||
+ if (dumpfile != NULL && ret > 0) {
|
||||
+ fprintf(dumpfile, "Microsoft device descriptor 0xee:\n");
|
||||
+ data_dump_ascii(dumpfile, buf, ret, 16);
|
||||
+ }
|
||||
|
||||
- /* Check if device responds to control message 1 or if there is an error */
|
||||
- cmd = buf[16];
|
||||
- ret = usb_control_msg (devh,
|
||||
- USB_ENDPOINT_IN | USB_RECIP_DEVICE | USB_TYPE_VENDOR,
|
||||
- cmd,
|
||||
- 0,
|
||||
- 4,
|
||||
- (char *) buf,
|
||||
- sizeof(buf),
|
||||
- USB_TIMEOUT_DEFAULT);
|
||||
-
|
||||
- // Dump it, if requested
|
||||
- if (dumpfile != NULL && ret > 0) {
|
||||
- fprintf(dumpfile, "Microsoft device response to control message 1, CMD 0x%02x:\n", cmd);
|
||||
- data_dump_ascii(dumpfile, buf, ret, 16);
|
||||
- }
|
||||
+ /* Check if descriptor length is at least 10 bytes */
|
||||
+ if (ret < 10) {
|
||||
+ usb_close(devh);
|
||||
+ return 0;
|
||||
+ }
|
||||
|
||||
- /* If this is true, the device either isn't MTP or there was an error */
|
||||
- if (ret <= 0x15) {
|
||||
- /* TODO: If there was an error, flag it and let the user know somehow */
|
||||
- /* if(ret == -1) {} */
|
||||
- usb_close(devh);
|
||||
- return 0;
|
||||
- }
|
||||
+ /* Check if this device has a Microsoft Descriptor */
|
||||
+ if (!((buf[2] == 'M') && (buf[4] == 'S') &&
|
||||
+ (buf[6] == 'F') && (buf[8] == 'T'))) {
|
||||
+ usb_close(devh);
|
||||
+ return 0;
|
||||
+ }
|
||||
|
||||
- /* Check if device is MTP or if it is something like a USB Mass Storage
|
||||
- device with Janus DRM support */
|
||||
- if ((buf[0x12] != 'M') || (buf[0x13] != 'T') || (buf[0x14] != 'P')) {
|
||||
- usb_close(devh);
|
||||
- return 0;
|
||||
- }
|
||||
+ /* Check if device responds to control message 1 or if there is an error */
|
||||
+ cmd = buf[16];
|
||||
+ ret = usb_control_msg (devh,
|
||||
+ USB_ENDPOINT_IN | USB_RECIP_DEVICE | USB_TYPE_VENDOR,
|
||||
+ cmd,
|
||||
+ 0,
|
||||
+ 4,
|
||||
+ (char *) buf,
|
||||
+ sizeof(buf),
|
||||
+ USB_TIMEOUT_DEFAULT);
|
||||
+
|
||||
+ // Dump it, if requested
|
||||
+ if (dumpfile != NULL && ret > 0) {
|
||||
+ fprintf(dumpfile, "Microsoft device response to control message 1, CMD 0x%02x:\n", cmd);
|
||||
+ data_dump_ascii(dumpfile, buf, ret, 16);
|
||||
+ }
|
||||
|
||||
- /* After this point we are probably dealing with an MTP device */
|
||||
+ /* If this is true, the device either isn't MTP or there was an error */
|
||||
+ if (ret <= 0x15) {
|
||||
+ /* TODO: If there was an error, flag it and let the user know somehow */
|
||||
+ /* if(ret == -1) {} */
|
||||
+ usb_close(devh);
|
||||
+ return 0;
|
||||
+ }
|
||||
|
||||
- /*
|
||||
- * Check if device responds to control message 2, which is
|
||||
- * the extended device parameters. Most devices will just
|
||||
- * respond with a copy of the same message as for the first
|
||||
- * message, some respond with zero-length (which is OK)
|
||||
- * and some with pure garbage. We're not parsing the result
|
||||
- * so this is not very important.
|
||||
- */
|
||||
- ret = usb_control_msg (devh,
|
||||
- USB_ENDPOINT_IN | USB_RECIP_DEVICE | USB_TYPE_VENDOR,
|
||||
- cmd,
|
||||
- 0,
|
||||
- 5,
|
||||
- (char *) buf,
|
||||
- sizeof(buf),
|
||||
- USB_TIMEOUT_DEFAULT);
|
||||
-
|
||||
- // Dump it, if requested
|
||||
- if (dumpfile != NULL && ret > 0) {
|
||||
- fprintf(dumpfile, "Microsoft device response to control message 2, CMD 0x%02x:\n", cmd);
|
||||
- data_dump_ascii(dumpfile, buf, ret, 16);
|
||||
- }
|
||||
+ /* Check if device is MTP or if it is something like a USB Mass Storage
|
||||
+ device with Janus DRM support */
|
||||
+ if ((buf[0x12] != 'M') || (buf[0x13] != 'T') || (buf[0x14] != 'P')) {
|
||||
+ usb_close(devh);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ /* After this point we are probably dealing with an MTP device */
|
||||
+
|
||||
+ /*
|
||||
+ * Check if device responds to control message 2, which is
|
||||
+ * the extended device parameters. Most devices will just
|
||||
+ * respond with a copy of the same message as for the first
|
||||
+ * message, some respond with zero-length (which is OK)
|
||||
+ * and some with pure garbage. We're not parsing the result
|
||||
+ * so this is not very important.
|
||||
+ */
|
||||
+ ret = usb_control_msg (devh,
|
||||
+ USB_ENDPOINT_IN | USB_RECIP_DEVICE | USB_TYPE_VENDOR,
|
||||
+ cmd,
|
||||
+ 0,
|
||||
+ 5,
|
||||
+ (char *) buf,
|
||||
+ sizeof(buf),
|
||||
+ USB_TIMEOUT_DEFAULT);
|
||||
+
|
||||
+ // Dump it, if requested
|
||||
+ if (dumpfile != NULL && ret > 0) {
|
||||
+ fprintf(dumpfile, "Microsoft device response to control message 2, CMD 0x%02x:\n", cmd);
|
||||
+ data_dump_ascii(dumpfile, buf, ret, 16);
|
||||
+ }
|
||||
|
||||
- /* If this is true, the device errored against control message 2 */
|
||||
- if (ret == -1) {
|
||||
- /* TODO: Implement callback function to let managing program know there
|
||||
- was a problem, along with description of the problem */
|
||||
- LIBMTP_ERROR("Potential MTP Device with VendorID:%04x and "
|
||||
- "ProductID:%04x encountered an error responding to "
|
||||
- "control message 2.\n"
|
||||
- "Problems may arrise but continuing\n",
|
||||
- dev->descriptor.idVendor, dev->descriptor.idProduct);
|
||||
- } else if (dumpfile != NULL && ret == 0) {
|
||||
- fprintf(dumpfile, "Zero-length response to control message 2 (OK)\n");
|
||||
- } else if (dumpfile != NULL) {
|
||||
- fprintf(dumpfile, "Device responds to control message 2 with some data.\n");
|
||||
+ /* If this is true, the device errored against control message 2 */
|
||||
+ if (ret == -1) {
|
||||
+ /* TODO: Implement callback function to let managing program know there
|
||||
+ was a problem, along with description of the problem */
|
||||
+ LIBMTP_ERROR("Potential MTP Device with VendorID:%04x and "
|
||||
+ "ProductID:%04x encountered an error responding to "
|
||||
+ "control message 2.\n"
|
||||
+ "Problems may arrise but continuing\n",
|
||||
+ dev->descriptor.idVendor, dev->descriptor.idProduct);
|
||||
+ } else if (dumpfile != NULL && ret == 0) {
|
||||
+ fprintf(dumpfile, "Zero-length response to control message 2 (OK)\n");
|
||||
+ } else if (dumpfile != NULL) {
|
||||
+ fprintf(dumpfile, "Device responds to control message 2 with some data.\n");
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Close the USB device handle */
|
||||
--
|
||||
1.7.3.4
|
||||
|
29
libmtp.spec
29
libmtp.spec
@ -2,15 +2,13 @@
|
||||
# RPM repository.
|
||||
|
||||
Name: libmtp
|
||||
Version: 1.0.4
|
||||
Release: 3%{?dist}
|
||||
Version: 1.0.5
|
||||
Release: 1%{?dist}
|
||||
Summary: A software library for MTP media players
|
||||
URL: http://libmtp.sourceforge.net/
|
||||
|
||||
Group: System Environment/Libraries
|
||||
Source0: http://download.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
|
||||
Patch0: 0001-Fixup-device-OS-descriptor-probe-code.patch
|
||||
Patch1: 0001-Fix-inverted-boolean-logic.patch
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
License: LGPLv2+
|
||||
Requires: udev
|
||||
@ -53,11 +51,11 @@ library for MTP media players.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
%patch0 -p1
|
||||
%patch1 -p1
|
||||
|
||||
%build
|
||||
%configure --disable-static
|
||||
%configure --disable-static \
|
||||
--with-udev=/lib/udev/ \
|
||||
--with-udev-rules=60-libmtp.rules
|
||||
make %{?_smp_mflags}
|
||||
|
||||
%install
|
||||
@ -78,26 +76,20 @@ ln -sf mtp-connect mtp-newfolder
|
||||
ln -sf mtp-connect mtp-sendfile
|
||||
ln -sf mtp-connect mtp-sendtr
|
||||
popd
|
||||
# Install udev rules file.
|
||||
mkdir -p $RPM_BUILD_ROOT/lib/udev/rules.d
|
||||
install -p -m 644 libmtp.rules $RPM_BUILD_ROOT/lib/udev/rules.d/60-libmtp.rules
|
||||
# Fixup udev screwup :-(
|
||||
mkdir -p -m 755 $RPM_BUILD_ROOT/lib
|
||||
mv $RPM_BUILD_ROOT/usr/lib/udev $RPM_BUILD_ROOT/lib/udev
|
||||
mkdir -p $RPM_BUILD_ROOT%{_datadir}/hal/fdi/information/10freedesktop
|
||||
install -p -m 644 libmtp.fdi $RPM_BUILD_ROOT%{_datadir}/hal/fdi/information/10freedesktop/10-usb-music-players-libmtp.fdi
|
||||
# Copy documentation to a good place
|
||||
mkdir -p -m 755 $RPM_BUILD_ROOT%{_docdir}/%{name}-%{version}
|
||||
install -p -m 644 AUTHORS ChangeLog COPYING INSTALL README TODO \
|
||||
$RPM_BUILD_ROOT%{_docdir}/%{name}-%{version}
|
||||
# Touch generated files to make them always have the same time stamp.
|
||||
touch -r configure.ac \
|
||||
$RPM_BUILD_ROOT%{_docdir}/%{name}-%{version}/html/* \
|
||||
$RPM_BUILD_ROOT%{_includedir}/*.h \
|
||||
$RPM_BUILD_ROOT%{_libdir}/pkgconfig/*.pc \
|
||||
$RPM_BUILD_ROOT%{_datadir}/hal/fdi/information/10freedesktop/10-usb-music-players-libmtp.fdi
|
||||
# Remove the Doxygen HTML documentation, this get different
|
||||
# each time it is generated and thus creates multiarch conflicts.
|
||||
# I don't want to pre-generate it but will instead wait for upstream
|
||||
# to find a suitable solution that will always bring the same files,
|
||||
# or that Doxygen is fixed not to do this.
|
||||
rm -rf $RPM_BUILD_ROOT%{_docdir}/%{name}-%{version}/html
|
||||
|
||||
|
||||
%clean
|
||||
@ -130,6 +122,9 @@ rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
|
||||
%changelog
|
||||
* Sat Feb 5 2011 Linus Walleij <triad@df.lth.se> 1.0.5-1
|
||||
- New upstream release fixing all the things we patched.
|
||||
|
||||
* Wed Jan 24 2011 Linus Walleij <triad@df.lth.se> 1.0.4-3
|
||||
- Screwed up boolean logic in last patch, fixing it.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user