trainlog/tui/tools/mtp_probe.c

161 lines
3.7 KiB
C

/**
* @file mtp_probe.c
* @brief Manual end-to-end USB -> MTP storage probe.
*/
#include <inttypes.h>
#include <stdio.h>
#include "trainlog/mtp.h"
#include "trainlog/status.h"
#include "trainlog/usb.h"
#define DEVICE_CAPACITY 16U
#define STORAGE_CAPACITY 16U
static double bytes_to_gib(
uint64_t bytes
)
{
return
(double)bytes /
(1024.0 * 1024.0 * 1024.0);
}
int main(void)
{
TrainlogUsbDevice
devices[DEVICE_CAPACITY];
size_t device_count = 0U;
size_t device_index;
TrainlogStatus status;
status =
trainlog_usb_list_mtp_devices(
devices,
DEVICE_CAPACITY,
&device_count
);
if (status != TRAINLOG_STATUS_OK) {
(void)fprintf(
stderr,
"USB MTP discovery failed: %d\n",
(int)status
);
return 1;
}
(void)printf(
"Physical MTP devices: %zu\n",
device_count
);
for (device_index = 0U;
device_index < device_count;
++device_index) {
TrainlogMtpStorage
storages[STORAGE_CAPACITY];
const TrainlogUsbDevice *usb =
&devices[device_index];
size_t storage_count = 0U;
size_t storage_index;
(void)printf(
"\n[%zu] %s / %s\n",
device_index,
usb->vendor[0] != '\0'
? usb->vendor
: "(unknown vendor)",
usb->model[0] != '\0'
? usb->model
: "(unknown model)"
);
(void)printf(
" usb=%03u:%03u vid:pid=%04x:%04x\n",
usb->bus_number,
usb->device_number,
usb->vendor_id,
usb->product_id
);
status =
trainlog_mtp_list_storages(
usb->bus_number,
usb->device_number,
storages,
STORAGE_CAPACITY,
&storage_count
);
if (status != TRAINLOG_STATUS_OK) {
(void)printf(
" libmtp open/storage failed: %d\n",
(int)status
);
continue;
}
(void)printf(
" storages=%zu\n",
storage_count
);
for (storage_index = 0U;
storage_index < storage_count;
++storage_index) {
const TrainlogMtpStorage *storage =
&storages[storage_index];
(void)printf(
" storage[%zu] id=0x%08" PRIx32 "\n",
storage_index,
storage->storage_id
);
(void)printf(
" description=%s\n",
storage->description[0] != '\0'
? storage->description
: "(none)"
);
(void)printf(
" volume=%s\n",
storage->volume_identifier[0] != '\0'
? storage->volume_identifier
: "(none)"
);
(void)printf(
" capacity=%.2f GiB free=%.2f GiB\n",
bytes_to_gib(
storage->max_capacity_bytes
),
bytes_to_gib(
storage->free_space_bytes
)
);
(void)printf(
" access=0x%04x "
"storage_type=0x%04x "
"fs=0x%04x\n",
(unsigned int)
storage->access_capability,
(unsigned int)
storage->storage_type,
(unsigned int)
storage->filesystem_type
);
}
}
return 0;
}