diff --git a/ii.c b/ii.c index d93266c..0ebeee3 100644 --- a/ii.c +++ b/ii.c @@ -37,6 +37,7 @@ static int irc; static time_t last_response; static Channel *channels = NULL; static char *host = "irc.freenode.net"; +static char *port = "6667"; static char nick[32]; /* might change while running */ static char path[_POSIX_PATH_MAX]; static char message[PIPE_BUF]; /* message buf used for communication */ @@ -151,24 +152,23 @@ static void login(char *key, char *fullname) { write(irc, message, strlen(message)); /* login */ } -static int tcpopen(unsigned short port) { +static int tcpopen(char * port) { int fd; - struct sockaddr_in sin; - struct hostent *hp = gethostbyname(host); + struct addrinfo hints, *ai; - memset(&sin, 0, sizeof(struct sockaddr_in)); - if(!hp) { + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + if (getaddrinfo(host, port, &hints, &ai) != 0) { perror("ii: cannot retrieve host information"); exit(EXIT_FAILURE); } - sin.sin_family = AF_INET; - memcpy(&sin.sin_addr, hp->h_addr, hp->h_length); - sin.sin_port = htons(port); - if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + if ( (fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) { perror("ii: cannot create socket"); exit(EXIT_FAILURE); } - if(connect(fd, (const struct sockaddr *) &sin, sizeof(sin)) < 0) { + if (connect(fd, ai->ai_addr, ai->ai_addrlen) < 0) { perror("ii: cannot connect to host"); exit(EXIT_FAILURE); } @@ -403,7 +403,10 @@ static void handle_channels_input(Channel *c) { static void handle_server_output() { static char buf[PIPE_BUF]; if(read_line(irc, PIPE_BUF, buf) == -1) { - perror("ii: remote host closed connection"); + if (errno == EEXIST) + perror("ii: remote host closed connection, clients per IP probably limited"); + else + perror("ii: remote host closed connection"); exit(EXIT_FAILURE); } proc_server_cmd(buf); @@ -455,7 +458,6 @@ static void run() { int main(int argc, char *argv[]) { int i; - unsigned short port = SERVER_PORT; struct passwd *spw = getpwuid(getuid()); char *key = NULL, *fullname = NULL; char prefix[_POSIX_PATH_MAX]; @@ -472,7 +474,7 @@ int main(int argc, char *argv[]) { switch (argv[i][1]) { case 'i': snprintf(prefix,sizeof(prefix),"%s", argv[++i]); break; case 's': host = argv[++i]; break; - case 'p': port = strtol(argv[++i], NULL, 10); break; + case 'p': port = argv[++i]; break; case 'n': snprintf(nick,sizeof(nick),"%s", argv[++i]); break; case 'k': key = getenv(argv[++i]); break; case 'f': fullname = argv[++i]; break;