|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
usbscsi: Switch from lockdev to flock
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
Currently there are 2 problems with the lockdev usage in usbscsi:
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
1) It breaks usbscsi completely due to a missing symbol when dlopening
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
usbscsi.so, which is caused by libgphoto2_port/usbscsi/Makefile-files not
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
adding $(SERIAL_LIBS) to usbscsi_la_LIBADD
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
2) lockdev uses /var/lock/lockdev, which by default is:
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
drwxrwxr-x. 2 root lock 40 Sep 19 22:49 /var/lock/lockdev
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
So despite our udev rules, gphoto using apps need to run as
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
root (or group lockdev) to be able to work with usbscsi port devices
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
I've decided to fix 2) by moving to flock, lockdev makes sense for serial
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
ports, since other programs may be trying to access them at the same time,
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
for usbscsi however we only need to coordinate with other apps also using
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
libgphoto2, and flock then suffices, is much simpler and does not have
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
the rights issues of lockdev. This fix for 2), also fixes 1) by simply no
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
longer needing lockdev.
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
Index: libgphoto2_port/usbscsi/linux.c
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
===================================================================
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
--- libgphoto2_port/usbscsi/linux.c (revision 14108)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+++ libgphoto2_port/usbscsi/linux.c (working copy)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
@@ -1,6 +1,6 @@
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
/* SCSI commands to USB Mass storage devices port library for Linux
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
*
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- * Copyright (c) 2010 Hans de Goede <hdegoede@redhat.com>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ * Copyright (c) 2010-2012 Hans de Goede <hdegoede@redhat.com>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
*
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
* This program is free software; you can redistribute it and/or modify
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
* it under the terms of the GNU Lesser General Public License as published by
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
@@ -19,6 +19,7 @@
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#include "config.h"
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#include <gphoto2/gphoto2-port-library.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+#include <errno.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#include <stdio.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#include <stdlib.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#include <unistd.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
@@ -29,6 +30,7 @@
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#ifdef HAVE_LIMITS_H
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
# include <limits.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#endif
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+#include <sys/file.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#include <sys/stat.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#include <sys/types.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#ifdef HAVE_SYS_PARAM_H
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
@@ -40,9 +42,6 @@
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#ifdef HAVE_SCSI_SG_H
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
# include <scsi/sg.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#endif
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-#ifdef HAVE_LOCKDEV
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-# include <lockdev.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-#endif
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#include <gphoto2/gphoto2-port-result.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
#include <gphoto2/gphoto2-port-log.h>
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
@@ -80,62 +79,37 @@
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
}
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
static int
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-gp_port_usbscsi_lock (GPPort *port, const char *path)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+gp_port_usbscsi_lock (GPPort *port)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
{
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-#ifdef HAVE_LOCKDEV
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- int pid;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
gp_log (GP_LOG_DEBUG, "gphoto2-port-usbscsi",
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- "Trying to lock '%s'...", path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ "Trying to lock '%s'...", port->settings.usbscsi.path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- pid = dev_lock (path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- if (pid) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- if (port) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- if (pid > 0)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- gp_port_set_error (port, _("Device '%s' is "
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- "locked by pid %d"), path, pid);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- else
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- gp_port_set_error (port, _("Device '%s' could "
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- "not be locked (dev_lock returned "
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- "%d)"), path, pid);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ if (flock(port->pl->fd, LOCK_EX | LOCK_NB) != 0) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ switch (errno) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ case EWOULDBLOCK:
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ gp_port_set_error (port,
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ _("Device '%s' is locked by another app."),
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ port->settings.usbscsi.path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ return GP_ERROR_IO_LOCK;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ default:
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ gp_port_set_error (port,
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ _("Failed to lock '%s' (%m)."),
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ port->settings.usbscsi.path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ return GP_ERROR_IO;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
}
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- return GP_ERROR_IO_LOCK;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
}
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-#else
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-# ifdef __GCC__
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-# warning No locking library found.
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-# warning You will run into problems if you use
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-# warning gphoto2 with a usbscsi picframe in
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-# warning combination with Konqueror (KDE) or Nautilus (GNOME).
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-# warning This will *not* concern USB cameras.
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-# endif
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-#endif
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
return GP_OK;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
}
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
static int
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-gp_port_usbscsi_unlock (GPPort *port, const char *path)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+gp_port_usbscsi_unlock (GPPort *port)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
{
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-#ifdef HAVE_LOCKDEV
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- int pid;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- pid = dev_unlock (path, 0);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- if (pid) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- if (port) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- if (pid > 0)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- gp_port_set_error (port, _("Device '%s' could "
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- "not be unlocked as it is locked by "
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- "pid %d."), path, pid);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- else
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- gp_port_set_error (port, _("Device '%s' could "
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- "not be unlocked (dev_unlock "
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- "returned %d)"), path, pid);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- }
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- return GP_ERROR_IO_LOCK;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ if (flock(port->pl->fd, LOCK_UN) != 0) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ gp_port_set_error (port, _("Failed to unlock '%s' (%m)."),
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ port->settings.usbscsi.path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ return GP_ERROR_IO;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
}
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-#endif /* !HAVE_LOCKDEV */
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
return GP_OK;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
}
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
@@ -271,34 +245,36 @@
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
const int max_tries = 5;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
const char *path = port->settings.usbscsi.path;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- result = gp_port_usbscsi_lock (port, path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- if (result != GP_OK) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- for (i = 0; i < max_tries; i++) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- result = gp_port_usbscsi_lock (port, path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- if (result == GP_OK)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- break;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- gp_log (GP_LOG_DEBUG, "gphoto2-port-usbscsi",
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- "Failed to get a lock, trying again...");
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- sleep (1);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- }
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- CHECK (result)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- }
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
port->pl->fd = open (path, O_RDWR);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
if (port->pl->fd == -1) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- gp_port_usbscsi_unlock (port, path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
gp_port_set_error (port, _("Failed to open '%s' (%m)."), path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
return GP_ERROR_IO;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
}
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- return GP_OK;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ result = gp_port_usbscsi_lock (port);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ for (i = 0; i < max_tries && result == GP_ERROR_IO_LOCK; i++) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ gp_log (GP_LOG_DEBUG, "gphoto2-port-usbscsi",
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ "Failed to get a lock, trying again...");
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ sleep (1);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ result = gp_port_usbscsi_lock (port);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ if (result != GP_OK) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ close (port->pl->fd);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ port->pl->fd = -1;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ return result;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
}
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
static int
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
gp_port_usbscsi_close (GPPort *port)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
{
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ int result;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
if (!port || port->pl->fd == -1)
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
return GP_OK;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ result = gp_port_usbscsi_unlock (port);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
if (close (port->pl->fd) == -1) {
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
gp_port_set_error (port, _("Could not close "
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
"'%s' (%m)."), port->settings.usbscsi.path);
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
@@ -306,10 +282,7 @@
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
}
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
port->pl->fd = -1;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- CHECK (gp_port_usbscsi_unlock (port,
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- port->settings.usbscsi.path))
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
-
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
- return GP_OK;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
+ return result;
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
}
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
|
|
![](https://seccdn.libravatar.org/avatar/a90c8fc1fa6bf435277bf1a6f0e8dcfa5081a34b29502febdc7c45358f87105e?s=16&d=retro) |
2f74e09 |
static int gp_port_usbscsi_send_scsi_cmd (GPPort *port, int to_dev, char *cmd,
|