Exemple #1
0
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();
}
Exemple #2
0
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);
        }
    }
}
Exemple #3
0
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);
}