static int _watch (cherokee_fdpoll_port_t *fdp, int timeout_msecs) { int i, rc, fd; struct timespec timeout; timeout.tv_sec = timeout_msecs/1000L; timeout.tv_nsec = ( timeout_msecs % 1000L ) * 1000000L; for (i=0; i<FDPOLL(fdp)->system_nfiles; i++) { fdp->port_activefd[i] = -1; } /* First call to get the number of file descriptors with activity */ rc = port_getn (fdp->port, fdp->port_events, 0, (uint_t *)&fdp->port_readyfds, &timeout); if ( rc < 0 ) { LOG_ERRNO_S (errno, cherokee_err_error, CHEROKEE_ERROR_FDPOLL_PORTS_GETN); return 0; } if ( fdp->port_readyfds == 0 ) { /* Get at least 1 fd to wait for activity */ fdp->port_readyfds = 1; } /* Second call to get the events of the file descriptors with * activity */ rc = port_getn (fdp->port, fdp->port_events,FDPOLL(fdp)->nfiles, &fdp->port_readyfds, &timeout); if ( ( (rc < 0) && (errno != ETIME) ) || (fdp->port_readyfds == -1)) { LOG_ERRNO_S (errno, cherokee_err_error, CHEROKEE_ERROR_FDPOLL_PORTS_GETN); return 0; } for ( i = 0; i < fdp->port_readyfds; ++i ) { int nfd; nfd = fdp->port_events[i].portev_object; fdp->port_activefd[nfd] = fdp->port_events[i].portev_events; rc = fd_associate( fdp, nfd, fdp->port_events[i].portev_user); if ( rc < 0 ) { LOG_ERRNO (errno, cherokee_err_error, CHEROKEE_ERROR_FDPOLL_PORTS_FD_ASSOCIATE, nfd); } } return fdp->port_readyfds; }
int dcc_ncpus(int *ncpus) { #if defined(_SC_NPROCESSORS_ONLN) /* Linux, Solaris, Tru64, UnixWare 7, and Open UNIX 8 */ *ncpus = sysconf(_SC_NPROCESSORS_ONLN); #elif defined(_SC_NPROC_ONLN) /* IRIX */ *ncpus = sysconf(_SC_NPROC_ONLN); #else #warning "Please port this function" *ncpus = -1; /* unknown */ #endif if (*ncpus == -1) { LOG_ERRNO_S (errno, http2d_err_error, HTTP2D_ERROR_NCPUS_SYSCONF); return FAILED; } else if (*ncpus == 0) { /* If there are no cpus, what are we running on ? * NOTE: it has apparently been observed to happen on ARM Linux */ *ncpus = 1; } return 0; }
ret_t cherokee_socket_connect (cherokee_socket_t *sock) { int r; int err; TRACE (ENTRIES",connect", "connect type=%s\n", SOCKET_AF(sock) == AF_INET ? "AF_INET" : SOCKET_AF(sock) == AF_INET6 ? "AF_INET6" : SOCKET_AF(sock) == AF_UNIX ? "AF_UNIX" : "Unknown"); do { switch (SOCKET_AF(sock)) { case AF_INET: r = connect (SOCKET_FD(sock), (struct sockaddr *) &SOCKET_ADDR(sock), sizeof(struct sockaddr_in)); break; #ifdef HAVE_IPV6 case AF_INET6: r = connect (SOCKET_FD(sock), (struct sockaddr *) &SOCKET_ADDR(sock), sizeof(struct sockaddr_in6)); break; #endif #ifdef HAVE_SOCKADDR_UN case AF_UNIX: if (SOCKET_SUN_PATH (socket)[0] != 0) { r = connect (SOCKET_FD(sock), (struct sockaddr *) &SOCKET_ADDR(sock), SUN_LEN (SOCKET_ADDR_UNIX(sock))); } else { r = connect (SOCKET_FD(sock), (struct sockaddr *) &SOCKET_ADDR(sock), SUN_ABSTRACT_LEN (SOCKET_ADDR_UNIX(sock))); } break; #endif default: SHOULDNT_HAPPEN; return ret_no_sys; } } while ((r == -1) && (errno == EINTR)); if (r < 0) { err = SOCK_ERRNO(); TRACE (ENTRIES",connect", "connect error=%d '%s'\n", err, strerror(err)); switch (err) { case EISCONN: break; case EINVAL: case ENOENT: case ECONNRESET: case ECONNREFUSED: case EADDRNOTAVAIL: return ret_deny; case ETIMEDOUT: return ret_error; case EAGAIN: case EALREADY: case EINPROGRESS: #if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN) case EWOULDBLOCK: #endif return ret_eagain; default: LOG_ERRNO_S (errno, cherokee_err_error, CHEROKEE_ERROR_SOCKET_CONNECT); return ret_error; } } TRACE (ENTRIES",connect", "succeed. fd=%d\n", SOCKET_FD(sock)); sock->status = socket_reading; return ret_ok; }