static int socket_accept (socket_t * sock, socket_t * newsock, struct sockaddr *saddr, socklen_t * len) { while ( IS_SOCKET_ERROR(*newsock = accept (*sock, saddr, len)) ) { if ( socket_error() == EINTR ) continue; return 1; } return 0; }
// Read a line of input from the socket. // static int mod_email_sock_readline(SOCKET sock, UTF8 *buffer, int maxlen) { buffer[0] = '\0'; if (IS_INVALID_SOCKET(sock)) { return 0; } fd_set read_fds; FD_ZERO(&read_fds); FD_SET(sock, &read_fds); // Wait up to 1 second. // struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; // Check for data before giving up. // if (IS_SOCKET_ERROR(select(static_cast<int>(sock+1), &read_fds, NULL, NULL, &tv))) { return 0; } if (!FD_ISSET(sock, &read_fds)) { return 0; } bool done = false; bool possible_close = false; int pos = 0; while ( !done && pos < maxlen) { UTF8 getme[2]; int numread = SOCKET_READ(sock, (char *)&getme[0], 1, 0); if ( IS_SOCKET_ERROR(numread) || 0 == numread) { if (possible_close) { done = true; } else { FD_ZERO(&read_fds); FD_SET(sock, &read_fds); // Wait up to 1 second. // tv.tv_sec = 1; tv.tv_usec = 0; // Check for data before giving up. // if (IS_SOCKET_ERROR(select(static_cast<int>(sock+1), &read_fds, NULL, NULL, &tv))) { done = true; } if (FD_ISSET(sock, &read_fds)) { possible_close = true; } } } else { possible_close = false; if (getme[0] != '\n') { buffer[pos++] = getme[0]; } else { done = true; } } } buffer[pos] = '\0'; return pos; }
static int socket_create (int domain, int type, socket_t * sock) { *sock = socket (domain, type, 0); return IS_SOCKET_ERROR(*sock) ? 1 : 0; }
static int socket_create (int domain, int type, socket_t * sock) { *sock = socket (PF_INET, SOCK_STREAM, 0); return IS_SOCKET_ERROR(*sock) ? 1 : 0; }