MappedFile::MappedFile(const StringSlice& path) : _path(path), _size(0), _data(NULL) { CString c_path(path); _fd = open(c_path.data(), O_RDONLY, 0600); if (_fd < 0) { throw Exception(format("{0}: {1}", path, posix_strerror())); } ScopedFd close(_fd); struct stat st; if (fstat(_fd, &st) < 0) { throw Exception(format("{0}: {1}", path, posix_strerror())); } if (S_ISDIR(st.st_mode)) { throw Exception(format("{0}: {1}", path, posix_strerror(EISDIR))); } _size = st.st_size; _data = reinterpret_cast<uint8_t*>(mmap(NULL, _size, PROT_READ, MAP_PRIVATE, _fd, 0)); if (_data == MAP_FAILED) { throw Exception(format("{0}: {1}", path, posix_strerror())); } close.release(); }
void ScopedFd::push(const BytesSlice& bytes) { BytesSlice remainder(bytes); while (!remainder.empty()) { ssize_t written = ::write(_fd, remainder.data(), remainder.size()); if (written < 0) { throw Exception(format("write: {0}", posix_strerror())); } else if (written == 0) { throw Exception("write: didn't write anything"); } else { remainder.shift(written); } } }
const char * errno_to_str(int err) { switch (err) { case ERR_OTHER: return "Unspecified failure"; case ERR_JSON_SYNTAX: return "JSON syntax error"; case ERR_PROTOCOL: return "Protocol format error"; case ERR_BUFFER_OVERFLOW: return "Buffer overflow"; case ERR_CHANNEL_CLOSED: return "Channel closed"; case ERR_COMMAND_CANCELLED: return "Command canceled"; case ERR_UNKNOWN_PEER: return "Unknown peer"; case ERR_BASE64: return "Invalid BASE64 string"; case ERR_EOF: return "End of file"; case ERR_ALREADY_STOPPED: return "Already stopped"; case ERR_ALREADY_EXITED: return "Already exited"; case ERR_ALREADY_RUNNING: return "Already running"; case ERR_ALREADY_ATTACHED: return "Already attached"; case ERR_IS_RUNNING: return "Execution context is running"; case ERR_INV_DATA_SIZE: return "Invalid data size"; case ERR_INV_CONTEXT: return "Invalid context"; case ERR_INV_ADDRESS: return "Invalid address"; case ERR_INV_EXPRESSION: return "Invalid expression"; case ERR_INV_FORMAT: return "Format is not supported"; case ERR_INV_NUMBER: return "Invalid number"; case ERR_INV_DWARF: return "Error reading DWARF data"; case ERR_SYM_NOT_FOUND: return "Symbol not found"; case ERR_UNSUPPORTED: return "Unsupported command"; case ERR_INV_DATA_TYPE: return "Invalid data type"; case ERR_INV_COMMAND: return "Command is not recognized"; case ERR_INV_TRANSPORT: return "Invalid transport name"; case ERR_CACHE_MISS: return "Invalid data cache state"; case ERR_NOT_ACTIVE: return "Context is not active"; case ERR_INV_CONT_OBJ: return "Invalid address of containing object"; default: if (err == 0) return "Success"; if (err >= ERR_MESSAGE_MIN && err <= ERR_MESSAGE_MAX) { if (is_dispatch_thread()) { ErrorMessage * m = msgs + (err - ERR_MESSAGE_MIN); if (m->report != NULL && m->report->pub.format != NULL) { return format_error_report_message(m->report->pub.format, m->report->pub.params, m->report->pub.param_cnt); } switch (m->source) { case SRC_GAI: return loc_gai_strerror(m->error); case SRC_MESSAGE: return m->text; case SRC_REPORT: return errno_to_str(m->error); } } else { return "Cannot get error message text: errno_to_str() must be called from the main thread"; } } #if defined(_WIN32) || defined(__CYGWIN__) if (err >= ERR_WINDOWS_MIN && err <= ERR_WINDOWS_MAX) { if (is_dispatch_thread()) { return system_strerror(err - ERR_WINDOWS_MIN, NULL); } else { return "Cannot get error message text: errno_to_str() must be called from the main thread"; } } #endif #ifdef __SYMBIAN32__ if (err < 0) return system_strerror(err); #endif break; } return posix_strerror(err); }