Exemple #1
0
bool CoreRP::addDeviceJson()
{
    Device *device = m_impl->info->device();
    if (!device) {
        return true;
    }

    char *json = mb_device_to_json(device);
    if (!json) {
        m_impl->error = ErrorCode::MemoryAllocationError;
        return false;
    }

    std::vector<unsigned char> contents(json, json + strlen(json));
    free(json);

    m_impl->cpio->remove("device.json");

    if (!m_impl->cpio->addFile(contents, "device.json", 0644)) {
        m_impl->error = m_impl->cpio->error();
        return false;
    }

    return true;
}
TEST(JsonTest, CreateJson)
{
    ScopedDevice sd1(sample_complete);
    ASSERT_NE(sd1.device, nullptr);

    std::unique_ptr<char, void (*)(void *)> json(
            mb_device_to_json(sd1.device), free);
    ASSERT_TRUE(json.operator bool());

    ScopedDevice sd2(json.get());
    ASSERT_TRUE(mb_device_equals(sd1.device, sd2.device));
}
bool OdinPatcher::Impl::patchTar()
{
#ifdef __ANDROID__
    static const char *prefix = "/proc/self/fd/";
    fd = -1;
    if (StringUtils::starts_with(info->inputPath(), prefix)) {
        std::string fdStr = info->inputPath().substr(strlen(prefix));
        if (!convertToInt(fdStr.c_str(), &fd)) {
            LOGE("Invalid fd: %s", fdStr.c_str());
            error = ErrorCode::FileOpenError;
            return false;
        }
        LOGD("Input path '%s' is a file descriptor: %d",
             info->inputPath().c_str(), fd);
    }
#endif

    // Get file size for progress information
#ifdef __ANDROID__
    if (fd > 0) {
        off64_t offset = lseek64(fd, 0, SEEK_END);
        if (offset < 0 || lseek64(fd, 0, SEEK_SET) < 0) {
            LOGE("%s: Failed to seek fd: %s", info->inputPath().c_str(),
                 strerror(errno));
            error = ErrorCode::FileSeekError;
            return false;
        }
        maxBytes = offset;
    } else {
#endif

    io::File file;
    if (!file.open(info->inputPath(), io::File::OpenRead)) {
        LOGE("%s: Failed to open: %s", info->inputPath().c_str(),
             file.errorString().c_str());
        error = ErrorCode::FileOpenError;
        return false;
    }
    if (!file.seek(0, io::File::SeekEnd)) {
        LOGE("%s: Failed to seek: %s", info->inputPath().c_str(),
             file.errorString().c_str());
        error = ErrorCode::FileReadError;
        return false;
    }
    if (!file.tell(&maxBytes)) {
        LOGE("%s: Failed to get position: %s", info->inputPath().c_str(),
             file.errorString().c_str());
        error = ErrorCode::FileReadError;
        return false;
    }
    file.close();

#ifdef __ANDROID__
    }
#endif

    updateProgress(bytes, maxBytes);

    if (!openInputArchive()) {
        return false;
    }
    if (!openOutputArchive()) {
        return false;
    }

    if (cancelled) return false;

    if (!processContents()) {
        return false;
    }

    std::vector<CopySpec> toCopy{
        {
            pc->dataDirectory() + "/binaries/android/"
                    + mb_device_architecture(info->device())
                    + "/odinupdater",
            "META-INF/com/google/android/update-binary.orig"
        }, {
            pc->dataDirectory() + "/binaries/android/"
                    + mb_device_architecture(info->device())
                    + "/odinupdater.sig",
            "META-INF/com/google/android/update-binary.orig.sig"
        }, {
            pc->dataDirectory() + "/binaries/android/"
                    + mb_device_architecture(info->device())
                    + "/fuse-sparse",
            "fuse-sparse"
        }, {
            pc->dataDirectory() + "/binaries/android/"
                    + mb_device_architecture(info->device())
                    + "/fuse-sparse.sig",
            "fuse-sparse.sig"
        }, {
            pc->dataDirectory() + "/binaries/android/"
                    + mb_device_architecture(info->device())
                    + "/mbtool_recovery",
            "META-INF/com/google/android/update-binary"
        }, {
            pc->dataDirectory() + "/binaries/android/"
                    + mb_device_architecture(info->device())
                    + "/mbtool_recovery.sig",
            "META-INF/com/google/android/update-binary.sig"
        }, {
            pc->dataDirectory() + "/scripts/bb-wrapper.sh",
            "multiboot/bb-wrapper.sh"
        }, {
            pc->dataDirectory() + "/scripts/bb-wrapper.sh.sig",
            "multiboot/bb-wrapper.sh.sig"
        }
    };

    zipFile zf = MinizipUtils::ctxGetZipFile(zOutput);

    ErrorCode result;

    for (const CopySpec &spec : toCopy) {
        if (cancelled) return false;

        updateDetails(spec.target);

        result = MinizipUtils::addFile(zf, spec.target, spec.source);
        if (result != ErrorCode::NoError) {
            error = result;
            return false;
        }
    }

    if (cancelled) return false;

    updateDetails("multiboot/info.prop");

    const std::string infoProp =
            MultiBootPatcher::createInfoProp(pc, info->romId());
    result = MinizipUtils::addFile(
            zf, "multiboot/info.prop",
            std::vector<unsigned char>(infoProp.begin(), infoProp.end()));
    if (result != ErrorCode::NoError) {
        error = result;
        return false;
    }

    if (cancelled) return false;

    updateDetails("block_devs.prop");

    std::string blockDevsProp;
    blockDevsProp += "system=";
    blockDevsProp += mb_device_system_block_devs(info->device())[0];
    blockDevsProp += "\n";
    blockDevsProp += "boot=";
    blockDevsProp += mb_device_boot_block_devs(info->device())[0];
    blockDevsProp += "\n";
    result = MinizipUtils::addFile(
            zf, "block_devs.prop", std::vector<unsigned char>(
                    blockDevsProp.begin(), blockDevsProp.end()));
    if (result != ErrorCode::NoError) {
        error = result;
        return false;
    }

    if (cancelled) return false;

    updateDetails("multiboot/device.json");

    char *json = mb_device_to_json(info->device());
    if (!json) {
        error = ErrorCode::MemoryAllocationError;
        return false;
    }

    result = MinizipUtils::addFile(
            zf, "multiboot/device.json",
            std::vector<unsigned char>(json, json + strlen(json)));
    free(json);

    if (result != ErrorCode::NoError) {
        error = result;
        return false;
    }

    if (cancelled) return false;

    return true;
}