int u_open(u_port_t port) { int error; struct sockaddr_in server; int sock; int true = 1; if ((u_ignore_sigpipe() == -1) || ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)) return -1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&true, sizeof(true)) == -1) { error = errno; while ((close(sock) == -1) && (errno == EINTR)); errno = error; return -1; } server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons((short)port); if ((bind(sock, (struct sockaddr *)&server, sizeof(server)) == -1) || (listen(sock, MAXBACKLOG) == -1)) { error = errno; while ((close(sock) == -1) && (errno == EINTR)); errno = error; return -1; } return sock; }
/* * u_connect * Initiate communication with a remote server. * * parameters: * port = well-known port on remote server * hostn = character string giving the Internet name of the * remote machine * returns: the file descriptor used for communication if successful * -1 on error on system error that sets errno * U_EHOST if hostn cannot be resolved * U_ECONNECTION if connection fails */ int u_connect(u_port_t port, char *hostn) { int retval; struct sockaddr_in server; int sock; int error; if (name_to_addr(hostn,&(server.sin_addr.s_addr)) < 0) { errno = EINVAL; return -1; } server.sin_port = htons((short)port); server.sin_family = AF_INET; if ( (u_ignore_sigpipe() != 0) || ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) ) return -1; while ( ((retval = connect(sock, (struct sockaddr *)&server, sizeof(server))) == -1) && (errno == EINTR) ) ; if (retval == -1) { error = errno; close(sock); errno = error; return -1; } return sock; }
/* * u_connect * Initiate communication with a remote server. * * parameters: * port = well-known port on remote server * hostn = character string giving the Internet name of remote host * returns: a communication file descriptor if successful * -1 on error with errno set */ int u_connect(u_port_t port, char *hostn) { int error; int retval; struct sockaddr_in server; int sock; fd_set sockset; struct hostent *phe; /* fix broken name resolution for hosts beginning with a * digit, plus get rid of hostname lookup stuff */ if(inet_addr(hostn) == INADDR_NONE) { phe=gethostbyname(hostn); if(phe == NULL) { errno = EINVAL; return -1; } memcpy((char*)&server.sin_addr,(char*)(phe->h_addr_list[0]), sizeof(struct in_addr)); } else { server.sin_addr.s_addr=inet_addr(hostn); } server.sin_port = htons((short)port); server.sin_family = AF_INET; if ((u_ignore_sigpipe() == -1) || ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)) return -1; if (((retval = connect(sock, (struct sockaddr *)&server, sizeof(server))) == -1) && ((errno == EINTR) || (errno == EALREADY))) { FD_ZERO(&sockset); FD_SET(sock, &sockset); while ( ((retval = select(sock+1, NULL, &sockset, NULL, NULL)) == -1) && (errno == EINTR) ) { FD_ZERO(&sockset); FD_SET(sock, &sockset); } } if (retval == -1) { error = errno; while ((close(sock) == -1) && (errno == EINTR)); errno = error; return -1; } return sock; }
/* * u_connect * Initiate communication with a remote server. * * parameters: * port = well-known port on remote server * hostn = character string giving the Internet name of remote host * returns: a communication file descriptor if successful * -1 on error with errno set */ int u_connect(u_port_t port, char *hostn) { int error; int retval; struct sockaddr_in server; int sock; fd_set sockset; if (name2addr(hostn,&(server.sin_addr.s_addr)) == -1) { errno = EINVAL; return -1; } server.sin_port = htons((short)port); server.sin_family = AF_INET; if ((u_ignore_sigpipe() == -1) || ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)) return -1; if (((retval = connect(sock, (struct sockaddr *)&server, sizeof(server))) == -1) && ((errno == EINTR) || (errno == EALREADY))) { FD_ZERO(&sockset); FD_SET(sock, &sockset); while ( ((retval = select(sock+1, NULL, &sockset, NULL, NULL)) == -1) && (errno == EINTR) ) { FD_ZERO(&sockset); FD_SET(sock, &sockset); } } if (retval == -1) { error = errno; while ((close(sock) == -1) && (errno == EINTR)); errno = error; return -1; } return sock; }