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;
}