static foreign_t pl_connect(term_t Socket, term_t Address) { int sock; struct sockaddr_in sockaddr; if ( !tcp_get_socket(Socket, &sock) || !nbio_get_sockaddr(Address, &sockaddr) ) return FALSE; if ( nbio_connect(sock, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == 0 ) return TRUE; return FALSE; }
/* * vs_eng_connect * open socket connection to remote scan engine * * Returns: sockfd or -1 (error) */ static int vs_eng_connect(char *host, int port) { int rc, sockfd, opt_nodelay, opt_keepalive, opt_reuseaddr, err_num; struct sockaddr_in addr; struct hostent *hp; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) return (-1); hp = getipnodebyname(host, AF_INET, 0, &err_num); if (hp == NULL) { (void) close(sockfd); return (-1); } (void) memset(&addr, 0, sizeof (addr)); (void) memcpy(&addr.sin_addr, hp->h_addr, hp->h_length); addr.sin_port = htons(port); addr.sin_family = hp->h_addrtype; freehostent(hp); #ifdef FIONBIO /* Use non-blocking mode for connect. */ rc = nbio_connect(sockfd, (struct sockaddr *)&addr, sizeof (struct sockaddr)); #else rc = connect(sockfd, (struct sockaddr *)&addr, sizeof (struct sockaddr)); #endif opt_nodelay = 1; opt_keepalive = 1; opt_reuseaddr = 1; if ((rc < 0) || (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &opt_nodelay, sizeof (opt_nodelay)) < 0) || (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &opt_keepalive, sizeof (opt_keepalive)) < 0) || (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt_reuseaddr, sizeof (opt_reuseaddr)) < 0)) { (void) close(sockfd); return (-1); } return (sockfd); }