#line
#define _assert__(line) \
_assert___(line)
-#define _assert_(e) \
- throw __FILE__ "(" _assert__(__LINE__) "): _assert(" e ")"
-#define _assert(expr) \
+#define _assert_(expr, format, ...) \
do if (!(expr)) { \
- fprintf(stderr, "%s(%u): _assert(%s); errno=%u\n", __FILE__, __LINE__, #expr, errno); \
- _assert_(#expr); \
+ fprintf(stderr, "%s(%u): _assert(): " format "\n", __FILE__, __LINE__, ## __VA_ARGS__); \
+ throw __FILE__ "(" _assert__(__LINE__) "): _assert(" #expr ")"; \
} while (false)
+#define _assert(expr) \
+ _assert_(expr, "%s", #expr)
+
#define _syscall(expr) ({ \
__typeof__(expr) _value; \
do if ((long) (_value = (expr)) != -1) \
case EINTR: \
continue; \
default: \
- _assert(false); \
+ _assert_(false, "errno=%u", errno); \
} while (true); \
_value; \
})
void open(const char *path, int flags) {
_assert(file_ == -1);
- _syscall(file_ = ::open(path, flags));
+ file_ = _syscall(::open(path, flags));
}
int file() const {
_syscall(fstat(file, &stat));
size_ = stat.st_size;
- _syscall(data_ = mmap(NULL, size_, pflag, mflag, file, 0));
+ data_ = _syscall(mmap(NULL, size_, pflag, mflag, file, 0));
}
void open(const char *path, bool edit) {
namespace ldid {
-static void Allocate(void *idata, size_t isize, std::streambuf &output, const Functor<size_t (size_t)> &allocate, const Functor<size_t (std::streambuf &output, size_t, const std::string &, const char *)> &save) {
- FatHeader source(idata, isize);
+static void Allocate(const void *idata, size_t isize, std::streambuf &output, const Functor<size_t (size_t)> &allocate, const Functor<size_t (std::streambuf &output, size_t, const std::string &, const char *)> &save) {
+ FatHeader source(const_cast<void *>(idata), isize);
size_t offset(0);
if (source.IsFat())
namespace ldid {
-void Sign(void *idata, size_t isize, std::streambuf &output, const std::string &name, const std::string &entitlements, const std::string &key, const Slots &slots) {
+void Sign(const void *idata, size_t isize, std::streambuf &output, const std::string &identifier, const std::string &entitlements, const std::string &key, const Slots &slots) {
Allocate(idata, isize, output, fun([&](size_t size) -> size_t {
size_t alloc(sizeof(struct SuperBlob));
alloc += sizeof(struct BlobIndex);
alloc += sizeof(struct Blob);
alloc += sizeof(struct CodeDirectory);
- alloc += name.size() + 1;
+ alloc += identifier.size() + 1;
if (!key.empty()) {
alloc += sizeof(struct BlobIndex);
CodeDirectory directory;
directory.version = Swap(uint32_t(0x00020001));
directory.flags = Swap(uint32_t(0));
- directory.hashOffset = Swap(uint32_t(sizeof(Blob) + sizeof(CodeDirectory) + name.size() + 1 + SHA_DIGEST_LENGTH * special));
+ directory.hashOffset = Swap(uint32_t(sizeof(Blob) + sizeof(CodeDirectory) + identifier.size() + 1 + SHA_DIGEST_LENGTH * special));
directory.identOffset = Swap(uint32_t(sizeof(Blob) + sizeof(CodeDirectory)));
directory.nSpecialSlots = Swap(special);
directory.codeLimit = Swap(uint32_t(limit));
directory.spare2 = Swap(uint32_t(0));
put(data, &directory, sizeof(directory));
- put(data, name.c_str(), name.size() + 1);
+ put(data, identifier.c_str(), identifier.size() + 1);
uint8_t storage[special + normal][SHA_DIGEST_LENGTH];
uint8_t (*hashes)[SHA_DIGEST_LENGTH] = storage + special;
if (flag_r)
ldid::Unsign(input.data(), input.size(), output);
else {
- const char *name(flag_I ?: base);
- ldid::Sign(input.data(), input.size(), output, name, entitlements, key, slots);
+ std::string identifier(flag_I ?: base);
+ ldid::Sign(input.data(), input.size(), output, identifier, entitlements, key, slots);
}
struct stat info;