Attached is a patch to add IPv6 support to ii, based on where it was as
of 7a99152ce64d7006730006094b333edbecbe505a

Enjoy, scream, whatever...
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;

Reply via email to