std::string smtpfs_get_tmpdir() { const char *c_tmp = getenv("TMP"); std::string tmp_dir; if (c_tmp) { tmp_dir = smtpfs_realpath(c_tmp); } else { c_tmp = getenv("TMPDIR"); if (!c_tmp) c_tmp = TMPDIR; tmp_dir = smtpfs_realpath(c_tmp); } tmp_dir += "/simple-mtpfs-XXXXXX"; char *c_tmp_dir = ::mktemp(::strdup(tmp_dir.c_str())); tmp_dir.assign(c_tmp_dir); ::free(static_cast<void*>(c_tmp_dir)); return tmp_dir; }
LIBMTP_raw_device_t *smtpfs_raw_device_new(const std::string &path) { libusb_context *ctx; int err = libusb_init(&ctx); if (err) return nullptr; std::string dev_path(smtpfs_realpath(path)); libusb_device **dev_list; ssize_t num_devs = libusb_get_device_list(ctx, &dev_list); if (num_devs < 1) { libusb_exit(ctx); return nullptr; } libusb_device *dev = nullptr; for (auto i = 0; i < num_devs; ++i) { dev = dev_list[i]; uint8_t bnum = libusb_get_bus_number(dev_list[i]); uint8_t dnum = libusb_get_device_address(dev_list[i]); std::stringstream ss; ss << smtpfs_devbususb << std::setw(3) << std::setfill('0') << static_cast<uint16_t>(bnum) << "/" << std::setw(3) << std::setfill('0') << static_cast<uint16_t>(dnum); if (ss.str() == dev_path) break; dev = nullptr; } LIBMTP_raw_device_t *raw_device = smtpfs_raw_device_new_priv(dev); libusb_free_device_list(dev_list, 0); libusb_exit(ctx); return raw_device; }