blob: 5d60c5738103dabd30e10d9a3c440e9340f9dee8 [file] [log] [blame]
// Copyright 2014 The Android Open Source Project
//
// This software is licensed under the terms of the GNU General Public
// License version 2, as published by the Free Software Foundation, and
// may be copied, distributed, and modified under those terms.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
#include "android/filesystems/ext4_utils.h"
#include "android/base/Log.h"
#include "android/base/files/ScopedStdioFile.h"
#include <stdint.h>
#include <string.h>
#define DEBUG_EXT4 0
#define EXT4_LOG LOG_IF(INFO, DEBUG_EXT4)
#define EXT4_PLOG PLOG_IF(INFO, DEBUG_EXT4)
#define EXT4_ERROR LOG_IF(ERROR, DEBUG_EXT4)
#define EXT4_PERROR PLOG_IF(ERROR, DEBUG_EXT4)
struct Ext4Magic {
static const size_t kOffset = 0x438U;
static const size_t kSize = 2U;
static const uint8_t kExpected[kSize];
};
const uint8_t Ext4Magic::kExpected[kSize] = { 0x53, 0xef };
bool android_pathIsExt4PartitionImage(const char* path) {
if (!path) {
EXT4_ERROR << "NULL path parameter";
return false;
}
android::base::ScopedStdioFile file(::fopen(path, "rb"));
if (!file.get()) {
EXT4_PERROR << "Could not open file: " << path;
return false;
}
if (::fseek(file.get(), Ext4Magic::kOffset, SEEK_SET) != 0) {
EXT4_LOG << "Can't seek to byte " << Ext4Magic::kOffset
<< " of " << path;
return false;
}
char magic[Ext4Magic::kSize];
if (::fread(magic, sizeof(magic), 1, file.get()) != 1) {
EXT4_PLOG << "Could not read " << sizeof(magic)
<< " bytes from " << path;
return false;
}
if (!::memcmp(magic, Ext4Magic::kExpected, sizeof(magic))) {
EXT4_LOG << "File is Ext4 partition image: " << path;
return true;
}
EXT4_LOG << "Not an Ext4 partition image: " << path;
return false;
}