ProtocolHandler::ErrorCode BuiltinProtocolHandlersLocal::open(const Uri &uri, iint32 openMode) { if (!d->m_opened.empty() && d->m_opened.isValid()) { IDEAL_DEBUG_WARNING("the uri " << d->m_opened.uri() << " was opened. Closing"); close(); } d->m_opened = uri; if (!uri.isValid()) { return InvalidURI; } iint32 oflag = 0; if ((openMode & Read) && (openMode & Write)) { oflag = O_RDWR; } else if (openMode & Read) { oflag = O_RDONLY; } else { oflag = O_WRONLY; } d->m_fd = ::open(uri.path().data(), oflag); if (d->m_fd > -1) { return NoError; } switch (errno) { case EACCES: return InsufficientPermissions; break; default: return UnknownError; break; } }
ProtocolHandler::ErrorCode BuiltinProtocolHandlersHttp::open(const Uri &uri, iint32 openMode) { if (!uri.isValid()) { return InvalidURI; } d->m_uri = uri; d->m_sockfd = ::socket(AF_INET, SOCK_STREAM, 0); if (d->m_sockfd == -1) { switch(errno) { case EACCES: return InsufficientPermissions; break; default: return UnknownError; break; } } struct hostent *const host = ::gethostbyname(uri.host().data()); if (!host) { switch (h_errno) { case HOST_NOT_FOUND: return CouldNotResolveHost; break; default: return UnknownError; break; } } struct sockaddr_in destAddr; destAddr.sin_family = AF_INET; destAddr.sin_port = htons(uri.port() == -1 ? 80 : uri.port()); destAddr.sin_addr.s_addr = ::inet_addr(inet_ntoa(*((struct in_addr*) host->h_addr))); memset(&(destAddr.sin_zero), '\0', 8); if (!::connect(d->m_sockfd, (struct sockaddr*) &destAddr, sizeof(struct sockaddr))) { d->sendCommand(Private::Get, uri); } switch(errno) { case EADDRNOTAVAIL: case ECONNREFUSED: case ENETUNREACH: case ETIMEDOUT: return CouldNotConnect; break; default: return UnknownError; break; } }