summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client.c30
-rw-r--r--src/conf.c64
-rw-r--r--src/conf.h1
-rw-r--r--src/main.c21
-rw-r--r--src/usb.c49
5 files changed, 100 insertions, 65 deletions
diff --git a/src/client.c b/src/client.c
index dbbdd5f..2ac04bf 100644
--- a/src/client.c
+++ b/src/client.c
@@ -452,10 +452,7 @@ static int send_listener_list(struct mux_client *client, uint32_t tag)
plist_dict_set_item(l, "Blacklisted", plist_new_bool(0));
n = NULL;
if (lc->info) {
- n = plist_dict_get_item(lc->info, "BundleID");
- }
- if (n) {
- plist_dict_set_item(l, "BundleID", plist_copy(n));
+ plist_dict_copy_item(l, lc->info, "BundleID", NULL);
}
plist_dict_set_item(l, "ConnType", plist_new_uint(0));
@@ -632,28 +629,11 @@ static char* plist_dict_get_string_val(plist_t dict, const char* key)
static void update_client_info(struct mux_client *client, plist_t dict)
{
- plist_t node = NULL;
plist_t info = plist_new_dict();
-
- node = plist_dict_get_item(dict, "BundleID");
- if (node && (plist_get_node_type(node) == PLIST_STRING)) {
- plist_dict_set_item(info, "BundleID", plist_copy(node));
- }
-
- node = plist_dict_get_item(dict, "ClientVersionString");
- if (node && (plist_get_node_type(node) == PLIST_STRING)) {
- plist_dict_set_item(info, "ClientVersionString", plist_copy(node));
- }
-
- node = plist_dict_get_item(dict, "ProgName");
- if (node && (plist_get_node_type(node) == PLIST_STRING)) {
- plist_dict_set_item(info, "ProgName", plist_copy(node));
- }
-
- node = plist_dict_get_item(dict, "kLibUSBMuxVersion");
- if (node && (plist_get_node_type(node) == PLIST_UINT)) {
- plist_dict_set_item(info, "kLibUSBMuxVersion", plist_copy(node));
- }
+ plist_dict_copy_item(info, dict, "BundleID", NULL);
+ plist_dict_copy_item(info, dict, "ClientVersionString", NULL);
+ plist_dict_copy_item(info, dict, "ProgName", NULL);
+ plist_dict_copy_item(info, dict, "kLibUSBMuxVersion", NULL);
plist_free(client->info);
client->info = info;
}
diff --git a/src/conf.c b/src/conf.c
index 2e6c97f..2f0968d 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -34,10 +34,7 @@
#include <libgen.h>
#include <sys/stat.h>
#include <errno.h>
-
-#ifdef WIN32
-#include <shlobj.h>
-#endif
+#include <ctype.h>
#include <libimobiledevice-glue/utils.h>
#include <plist/plist.h>
@@ -47,6 +44,8 @@
#include "log.h"
#ifdef WIN32
+#include <shlobj.h>
+
#define DIR_SEP '\\'
#define DIR_SEP_S "\\"
#else
@@ -180,13 +179,26 @@ static int mkdir_with_parents(const char *dir, int mode)
/**
* Creates a freedesktop compatible configuration directory.
*/
-static void config_create_config_dir(void)
+static int config_create_config_dir(void)
{
const char *config_path = config_get_config_dir();
struct stat st;
- if (stat(config_path, &st) != 0) {
- mkdir_with_parents(config_path, 0755);
+ int res = stat(config_path, &st);
+ if (res != 0) {
+ res = mkdir_with_parents(config_path, 0755);
+ }
+ return res;
+}
+
+int config_set_config_dir(const char* path)
+{
+ if (!path) {
+ return -1;
}
+ free(__config_dir);
+ __config_dir = strdup(path);
+ usbmuxd_log(LL_DEBUG, "Setting config_dir to %s", __config_dir);
+ return config_create_config_dir();
}
static int get_rand(int min, int max)
@@ -270,7 +282,10 @@ static int config_set_value(const char *key, plist_t value)
char *config_file = NULL;
/* Make sure config directory exists */
- config_create_config_dir();
+ if (config_create_config_dir() < 0) {
+ usbmuxd_log(LL_ERROR, "ERROR: Failed to create config directory\n");
+ return -1;
+ }
config_path = config_get_config_dir();
config_file = string_concat(config_path, DIR_SEP_S, CONFIG_FILE, NULL);
@@ -342,7 +357,10 @@ int config_has_device_record(const char *udid)
if (!udid) return 0;
/* ensure config directory exists */
- config_create_config_dir();
+ if (config_create_config_dir() < 0) {
+ usbmuxd_log(LL_ERROR, "ERROR: Failed to create config directory\n");
+ return -1;
+ }
/* build file path */
const char *config_path = config_get_config_dir();
@@ -408,13 +426,19 @@ int config_set_device_record(const char *udid, char* record_data, uint64_t recor
if (!udid || !record_data || record_size < 8)
return -EINVAL;
- plist_t plist = NULL;
- if (memcmp(record_data, "bplist00", 8) == 0) {
- plist_from_bin(record_data, record_size, &plist);
- } else {
- plist_from_xml(record_data, record_size, &plist);
+ /* verify udid input */
+ const char* u = udid;
+ while (*u != '\0') {
+ if (!isalnum(*u) && (*u != '-')) {
+ usbmuxd_log(LL_ERROR, "ERROR: %s: udid contains invalid character.\n", __func__);
+ return -EINVAL;
+ }
+ u++;
}
+ plist_t plist = NULL;
+ plist_from_memory(record_data, record_size, &plist, NULL);
+
if (!plist || plist_get_node_type(plist) != PLIST_DICT) {
if (plist)
plist_free(plist);
@@ -422,7 +446,10 @@ int config_set_device_record(const char *udid, char* record_data, uint64_t recor
}
/* ensure config directory exists */
- config_create_config_dir();
+ if (config_create_config_dir() < 0) {
+ usbmuxd_log(LL_ERROR, "ERROR: Failed to create config directory\n");
+ return -1;
+ }
/* build file path */
const char *config_path = config_get_config_dir();
@@ -431,7 +458,7 @@ int config_set_device_record(const char *udid, char* record_data, uint64_t recor
remove(device_record_file);
/* store file */
- if (!plist_write_to_file(plist, device_record_file, PLIST_FORMAT_XML, 0)) {
+ if (plist_write_to_file(plist, device_record_file, PLIST_FORMAT_XML, 0) != PLIST_ERR_SUCCESS) {
usbmuxd_log(LL_DEBUG, "Could not open '%s' for writing: %s", device_record_file, strerror(errno));
res = -ENOENT;
}
@@ -458,7 +485,10 @@ int config_get_device_record(const char *udid, char **record_data, uint64_t *rec
int res = 0;
/* ensure config directory exists */
- config_create_config_dir();
+ if (config_create_config_dir() < 0) {
+ usbmuxd_log(LL_ERROR, "ERROR: Failed to create config directory\n");
+ return -1;
+ }
/* build file path */
const char *config_path = config_get_config_dir();
diff --git a/src/conf.h b/src/conf.h
index bbfa965..294ca18 100644
--- a/src/conf.h
+++ b/src/conf.h
@@ -27,6 +27,7 @@
#include <plist/plist.h>
const char *config_get_config_dir();
+int config_set_config_dir(const char* path);
void config_get_system_buid(char **system_buid);
diff --git a/src/main.c b/src/main.c
index 8702a4b..b09a187 100644
--- a/src/main.c
+++ b/src/main.c
@@ -517,6 +517,7 @@ static void usage()
#ifdef HAVE_SYSTEMD
printf(" -s, --systemd\t\tRun in systemd operation mode (implies -z and -f).\n");
#endif
+ printf(" -C, --config-dir PATH\tSpecify different configuration directory.\n");
printf(" -S, --socket ADDR:PORT | PATH Specify source ADDR and PORT or a UNIX\n");
printf(" \t\tsocket PATH to use for the listening socket.\n");
printf(" \t\tDefault: %s\n", socket_path);
@@ -549,6 +550,7 @@ static void parse_opts(int argc, char **argv)
#ifdef HAVE_SYSTEMD
{"systemd", no_argument, NULL, 's'},
#endif
+ {"config-dir", required_argument, NULL, 'C'},
{"socket", required_argument, NULL, 'S'},
{"pidfile", required_argument, NULL, 'P'},
{"exit", no_argument, NULL, 'x'},
@@ -560,11 +562,11 @@ static void parse_opts(int argc, char **argv)
int c;
#ifdef HAVE_SYSTEMD
- const char* opts_spec = "hfvVuU:xXsnzl:pS:P:";
+ const char* opts_spec = "hfvVuU:xXsnzl:pC:S:P:";
#elif HAVE_UDEV
- const char* opts_spec = "hfvVuU:xXnzl:pS:P:";
+ const char* opts_spec = "hfvVuU:xXnzl:pC:S:P:";
#else
- const char* opts_spec = "hfvVU:xXnzl:pS:P:";
+ const char* opts_spec = "hfvVU:xXnzl:pC:S:P:";
#endif
while (1) {
@@ -584,7 +586,7 @@ static void parse_opts(int argc, char **argv)
++verbose;
break;
case 'V':
- printf("%s\n", PACKAGE_STRING);
+ printf("%s %s\n", PACKAGE_NAME, PACKAGE_VERSION);
exit(0);
case 'U':
drop_privileges = 1;
@@ -611,6 +613,14 @@ static void parse_opts(int argc, char **argv)
case 'z':
opt_enable_exit = 1;
break;
+ case 'C':
+ if (!*optarg) {
+ usbmuxd_log(LL_FATAL, "ERROR: --config-dir requires an argument");
+ usage();
+ exit(2);
+ }
+ config_set_config_dir(optarg);
+ break;
case 'S':
if (!*optarg || *optarg == '-') {
usbmuxd_log(LL_FATAL, "ERROR: --socket requires an argument");
@@ -796,11 +806,12 @@ int main(int argc, char *argv[])
#ifdef HAVE_LIBIMOBILEDEVICE
const char* userprefdir = config_get_config_dir();
+ usbmuxd_log(LL_NOTICE, "Configuration directory: %s", userprefdir);
struct stat fst;
memset(&fst, '\0', sizeof(struct stat));
if (stat(userprefdir, &fst) < 0) {
if (mkdir(userprefdir, 0775) < 0) {
- usbmuxd_log(LL_FATAL, "Failed to create required directory '%s': %s", userprefdir, strerror(errno));
+ usbmuxd_log(LL_FATAL, "Failed to create configuration directory '%s': %s", userprefdir, strerror(errno));
res = -1;
goto terminate;
}
diff --git a/src/usb.c b/src/usb.c
index 63d0208..d0e9afc 100644
--- a/src/usb.c
+++ b/src/usb.c
@@ -53,7 +53,7 @@
#define NUM_RX_LOOPS 3
struct usb_device {
- libusb_device_handle *dev;
+ libusb_device_handle *handle;
uint8_t bus, address;
char serial[256];
int alive;
@@ -83,7 +83,7 @@ static int device_hotplug = 1;
static void usb_disconnect(struct usb_device *dev)
{
- if(!dev->dev) {
+ if(!dev->handle) {
return;
}
@@ -114,9 +114,9 @@ static void usb_disconnect(struct usb_device *dev)
collection_free(&dev->tx_xfers);
collection_free(&dev->rx_xfers);
- libusb_release_interface(dev->dev, dev->interface);
- libusb_close(dev->dev);
- dev->dev = NULL;
+ libusb_release_interface(dev->handle, dev->interface);
+ libusb_close(dev->handle);
+ dev->handle = NULL;
collection_remove(&device_list, dev);
free(dev);
}
@@ -177,7 +177,7 @@ int usb_send(struct usb_device *dev, const unsigned char *buf, int length)
{
int res;
struct libusb_transfer *xfer = libusb_alloc_transfer(0);
- libusb_fill_bulk_transfer(xfer, dev->dev, dev->ep_out, (void*)buf, length, tx_callback, dev, 0);
+ libusb_fill_bulk_transfer(xfer, dev->handle, dev->ep_out, (void*)buf, length, tx_callback, dev, 0);
if((res = libusb_submit_transfer(xfer)) < 0) {
usbmuxd_log(LL_ERROR, "Failed to submit TX transfer %p len %d to device %d-%d: %s", buf, length, dev->bus, dev->address, libusb_error_name(res));
libusb_free_transfer(xfer);
@@ -189,7 +189,7 @@ int usb_send(struct usb_device *dev, const unsigned char *buf, int length)
// Send Zero Length Packet
xfer = libusb_alloc_transfer(0);
void *buffer = malloc(1);
- libusb_fill_bulk_transfer(xfer, dev->dev, dev->ep_out, buffer, 0, tx_callback, dev, 0);
+ libusb_fill_bulk_transfer(xfer, dev->handle, dev->ep_out, buffer, 0, tx_callback, dev, 0);
if((res = libusb_submit_transfer(xfer)) < 0) {
usbmuxd_log(LL_ERROR, "Failed to submit TX ZLP transfer to device %d-%d: %s", dev->bus, dev->address, libusb_error_name(res));
libusb_free_transfer(xfer);
@@ -256,7 +256,7 @@ static int start_rx_loop(struct usb_device *dev)
void *buf;
struct libusb_transfer *xfer = libusb_alloc_transfer(0);
buf = malloc(USB_MRU);
- libusb_fill_bulk_transfer(xfer, dev->dev, dev->ep_in, buf, USB_MRU, rx_callback, dev, 0);
+ libusb_fill_bulk_transfer(xfer, dev->handle, dev->ep_in, buf, USB_MRU, rx_callback, dev, 0);
if((res = libusb_submit_transfer(xfer)) != 0) {
usbmuxd_log(LL_ERROR, "Failed to submit RX transfer to device %d-%d: %s", dev->bus, dev->address, libusb_error_name(res));
libusb_free_transfer(xfer);
@@ -357,7 +357,7 @@ static void get_langid_callback(struct libusb_transfer *transfer)
libusb_fill_control_setup(transfer->buffer, LIBUSB_ENDPOINT_IN, LIBUSB_REQUEST_GET_DESCRIPTOR,
(uint16_t)((LIBUSB_DT_STRING << 8) | usbdev->devdesc.iSerialNumber),
langid, 1024 + LIBUSB_CONTROL_SETUP_SIZE);
- libusb_fill_control_transfer(transfer, usbdev->dev, transfer->buffer, get_serial_callback, usbdev, 1000);
+ libusb_fill_control_transfer(transfer, usbdev->handle, transfer->buffer, get_serial_callback, usbdev, 1000);
if((res = libusb_submit_transfer(transfer)) < 0) {
usbmuxd_log(LL_ERROR, "Could not request transfer for device %d-%d: %s", usbdev->bus, usbdev->address, libusb_error_name(res));
@@ -394,7 +394,7 @@ static struct usb_device* find_device(int bus, int address)
/// @param dev
/// @param usbdev
/// @param handle
-/// @return 0 - undetermined, 1 - initial, 2 - valeria, 3 - cdc_ncm
+/// @return 0 - undetermined, 1 - initial, 2 - valeria, 3 - cdc_ncm, 4 - usbeth+cdc_ncm, 5 - cdc_ncm direct
static int guess_mode(struct libusb_device* dev, struct usb_device *usbdev)
{
int res, j;
@@ -404,11 +404,21 @@ static int guess_mode(struct libusb_device* dev, struct usb_device *usbdev)
int bus = usbdev->bus;
int address = usbdev->address;
+ if(devdesc.bNumConfigurations == 1) {
+ // CDC-NCM Direct
+ return 5;
+ }
+
if(devdesc.bNumConfigurations <= 4) {
// Assume this is initial mode
return 1;
}
+ if(devdesc.bNumConfigurations == 6) {
+ // USB Ethernet + CDC-NCM
+ return 4;
+ }
+
if(devdesc.bNumConfigurations != 5) {
// No known modes with more then 5 configurations
return 0;
@@ -595,7 +605,7 @@ static void device_complete_initialization(struct mode_context *context, struct
usbdev->address = address;
usbdev->devdesc = devdesc;
usbdev->speed = 480000000;
- usbdev->dev = handle;
+ usbdev->handle = handle;
usbdev->alive = 1;
usbdev->wMaxPacketSize = libusb_get_max_packet_size(dev, usbdev->ep_out);
if (usbdev->wMaxPacketSize <= 0) {
@@ -615,6 +625,9 @@ static void device_complete_initialization(struct mode_context *context, struct
case LIBUSB_SPEED_SUPER:
usbdev->speed = 5000000000;
break;
+ case LIBUSB_SPEED_SUPER_PLUS:
+ usbdev->speed = 10000000000;
+ break;
case LIBUSB_SPEED_HIGH:
case LIBUSB_SPEED_UNKNOWN:
default:
@@ -691,12 +704,12 @@ static void get_mode_cb(struct libusb_transfer* transfer)
unsigned char *data = libusb_control_transfer_get_data(transfer);
char* desired_mode_char = getenv(ENV_DEVICE_MODE);
- int desired_mode = desired_mode_char ? atoi(desired_mode_char) : 3;
+ int desired_mode = desired_mode_char ? atoi(desired_mode_char) : 1;
int guessed_mode = guess_mode(context->dev, dev);
// Response is 3:3:3:0 for initial mode, 5:3:3:0 otherwise.
usbmuxd_log(LL_INFO, "Received response %i:%i:%i:%i for get_mode request for device %i-%i", data[0], data[1], data[2], data[3], context->bus, context->address);
- if(desired_mode >= 1 && desired_mode <= 3 &&
+ if(desired_mode >= 1 && desired_mode <= 5 &&
guessed_mode > 0 && // do not switch mode if guess failed
guessed_mode != desired_mode) {
usbmuxd_log(LL_WARNING, "Switching device %i-%i mode to %i", context->bus, context->address, desired_mode);
@@ -764,7 +777,7 @@ static int usb_device_add(libusb_device* dev)
usbdev->address = address;
usbdev->devdesc = devdesc;
usbdev->speed = 0;
- usbdev->dev = handle;
+ usbdev->handle = handle;
usbdev->alive = 1;
collection_init(&usbdev->tx_xfers);
@@ -854,7 +867,7 @@ int usb_discover(void)
const char *usb_get_serial(struct usb_device *dev)
{
- if(!dev->dev) {
+ if(!dev->handle) {
return NULL;
}
return dev->serial;
@@ -862,7 +875,7 @@ const char *usb_get_serial(struct usb_device *dev)
uint32_t usb_get_location(struct usb_device *dev)
{
- if(!dev->dev) {
+ if(!dev->handle) {
return 0;
}
return (dev->bus << 16) | dev->address;
@@ -870,7 +883,7 @@ uint32_t usb_get_location(struct usb_device *dev)
uint16_t usb_get_pid(struct usb_device *dev)
{
- if(!dev->dev) {
+ if(!dev->handle) {
return 0;
}
return dev->devdesc.idProduct;
@@ -878,7 +891,7 @@ uint16_t usb_get_pid(struct usb_device *dev)
uint64_t usb_get_speed(struct usb_device *dev)
{
- if (!dev->dev) {
+ if (!dev->handle) {
return 0;
}
return dev->speed;