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;