Ejemplo n.º 1
0
 ~ScopedDevices()
 {
     if (devices) {
         for (struct Device **iter = devices; *iter; ++iter) {
             mb_device_free(*iter);
         }
         free(devices);
     }
 }
Ejemplo n.º 2
0
void MainWindow::populateDevices()
{
    Q_D(MainWindow);

    // TODO: This shouldn't be done in the GUI thread
    QString path(QString::fromStdString(d->pc->dataDirectory())
            % QStringLiteral("/devices.json"));
    QFile file(path);

    if (file.open(QIODevice::ReadOnly)) {
        QByteArray contents = file.readAll();
        file.close();

        MbDeviceJsonError error;
        Device **devices =
                mb_device_new_list_from_json(contents.data(), &error);

        if (devices) {
            for (Device **iter = devices; *iter; ++iter) {
                if (mb_device_validate(*iter) == 0) {
                    d->deviceSel->addItem(QStringLiteral("%1 - %2")
                            .arg(QString::fromUtf8(mb_device_id(*iter)))
                            .arg(QString::fromUtf8(mb_device_name(*iter))));
                    d->devices.emplace_back(*iter, mb_device_free);
                } else {
                    // Clean up unusable devices
                    mb_device_free(*iter);
                }
            }
            // No need for array anymore
            free(devices);
        } else {
            qWarning("Failed to load devices");
        }
    } else {
        qWarning("%s: Failed to open file: %s",
                 path.toUtf8().data(), file.errorString().toUtf8().data());
    }
}
Ejemplo n.º 3
0
static bool find_paths(struct paths *paths)
{
    std::unordered_map<std::string, std::string> props;
    util::file_get_all_properties(DEFAULT_PROP_PATH, &props);

    std::string userdata;
    std::string header;
    std::string recovery;

    std::vector<unsigned char> contents;
    util::file_read_all(DEVICE_JSON_PATH, &contents);
    contents.push_back('\0');

    MbDeviceJsonError error;
    Device *device = mb_device_new_from_json((char *) contents.data(), &error);
    if (!device) {
        LOGE("%s: Failed to load device definition", DEVICE_JSON_PATH);
        return false;
    } else if (mb_device_validate(device) != 0) {
        LOGE("%s: Device definition validation failed", DEVICE_JSON_PATH);
        mb_device_free(device);
        return false;
    }

    auto userdata_list = mb_device_data_block_devs(device);
    auto recovery_list = mb_device_recovery_block_devs(device);

    if (userdata_list) {
        for (auto it = userdata_list; *it; ++it) {
            if (access(*it, R_OK) == 0) {
                userdata = *it;
                break;
            }
        }
    }

    if (recovery_list) {
        for (auto it = recovery_list; *it; ++it) {
            if (access(*it, R_OK) == 0) {
                recovery = *it;
                break;
            }
        }
    }

    mb_device_free(device);

    header = props[PROP_CRYPTFS_HEADER_PATH];

    if (userdata.empty()) {
        LOGE("Encrypted partition path could not be detected");
        return false;
    }
    if (recovery.empty()) {
        LOGE("Recovery partition path could not be detected");
        return false;
    }
    if (header.empty()) {
        LOGE("Cryptfs header path could not be detected");
        return false;
    }

    paths->userdata.swap(userdata);
    paths->recovery.swap(recovery);
    paths->header.swap(header);

    return true;
}
Ejemplo n.º 4
0
 ~ScopedDevice()
 {
     mb_device_free(device);
 }