f2cb3c38fe
Always map memory as writable, but private when read-only
53 lines
1.3 KiB
C++
53 lines
1.3 KiB
C++
#include "raw_data.hpp"
|
|
|
|
using namespace std;
|
|
|
|
int mmap_data::patch(str_pairs list) {
|
|
if (buf == nullptr)
|
|
return 0;
|
|
int count = 0;
|
|
for (uint8_t *p = buf, *eof = buf + sz; p < eof; ++p) {
|
|
for (auto [from, to] : list) {
|
|
if (memcmp(p, from.data(), from.length() + 1) == 0) {
|
|
LOGD("Replace [%s] -> [%s]\n", from.data(), to.data());
|
|
memset(p, 0, from.length());
|
|
memcpy(p, to.data(), to.length());
|
|
++count;
|
|
p += from.length();
|
|
}
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
|
|
bool mmap_data::contains(string_view pattern) {
|
|
if (buf == nullptr)
|
|
return false;
|
|
for (uint8_t *p = buf, *eof = buf + sz; p < eof; ++p) {
|
|
if (memcmp(p, pattern.data(), pattern.length() + 1) == 0) {
|
|
LOGD("Found pattern [%s]\n", pattern.data());
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void mmap_data::consume(mmap_data &other) {
|
|
buf = other.buf;
|
|
sz = other.sz;
|
|
other.buf = nullptr;
|
|
other.sz = 0;
|
|
}
|
|
|
|
mmap_data mmap_data::rw(const char *name) {
|
|
mmap_data data;
|
|
mmap_rw(name, data.buf, data.sz);
|
|
return data;
|
|
}
|
|
|
|
mmap_data mmap_data::ro(const char *name) {
|
|
mmap_data data;
|
|
mmap_ro(name, data.buf, data.sz);
|
|
return data;
|
|
}
|