--- ii.c | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/ii.c b/ii.c index b399a4a..eaf7102 100644 --- a/ii.c +++ b/ii.c _AT_@ -22,7 +22,6 @@ #define IRC_CHANNEL_MAX 50 #define IRC_MSG_MAX 512 #define PING_TIMEOUT 300 -#define SERVER_PORT 6667 enum { TOK_NICKSRV = 0, TOK_USER, TOK_CMD, TOK_CHAN, TOK_ARG, TOK_TEXT, TOK_LAST }; _AT_@ -167,24 +166,29 @@ login(int ircfd, char *host, char *key, char *fullname) { } static int -tcpopen(const char *host, unsigned short port) { - int fd; - struct sockaddr_in sin; - struct hostent *hp; - - if(!(hp = gethostbyname(host))) - eprintf("ii: cannot retrieve host information:"); - memset(&sin, 0, sizeof(struct sockaddr_in)); - sin.sin_family = AF_INET; - /* TODO: don't use h_addr or h_addr_list here, but getaddrinfo(), - * also support IPV6. */ - memcpy(&sin.sin_addr, hp->h_addr_list[0], hp->h_length); - sin.sin_port = htons(port); - if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) - eprintf("ii: cannot create socket:"); - if(connect(fd, (const struct sockaddr *) &sin, sizeof(sin)) < 0) - eprintf("ii: cannot connect to host:"); +tcpopen(const char *host, const char *service) { + struct addrinfo hints, *res = NULL, *rp; + int fd, e; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; /* allow IPv4 or IPv6 */ + hints.ai_flags = AI_NUMERICSERV; /* avoid name lookup for port */ + hints.ai_socktype = SOCK_STREAM; + + if((e = getaddrinfo(host, service, &hints, &res))) + eprintf("ii: getaddrinfo() failed : %s\n", gai_strerror(e)); + + for (rp = res; rp; rp = rp->ai_next) { + fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if(fd == -1) + continue; /* retry */ + if(connect(fd, res->ai_addr, res->ai_addrlen) != 1) + break; /* success */ + } + if(!rp) + eprintf("ii: could not connect:"); + freeaddrinfo(res); return fd; } _AT_@ -515,8 +519,7 @@ int main(int argc, char *argv[]) { struct passwd *spw; char *key = NULL, *fullname = NULL, *host = "", *keyname = ""; - char prefix[_POSIX_PATH_MAX]; - long port = SERVER_PORT; + char prefix[_POSIX_PATH_MAX], *service = "6667"; int ircfd; /* use nickname and home dir of user for ii by default */ _AT_@ -537,7 +540,8 @@ main(int argc, char *argv[]) { host = EARGF(usage()); break; case 'p': - port = estrtol(EARGF(usage()), 10); + service = EARGF(usage()); + estrtol(service, 10); break; case 'n': strlcpy(nick, EARGF(usage()), sizeof(nick)); _AT_@ -558,7 +562,7 @@ main(int argc, char *argv[]) { if(!*host || !*nick) usage(); - ircfd = tcpopen(host, port); + ircfd = tcpopen(host, service); if(snprintf(path, sizeof(path), "%s/%s", prefix, host) <= 0) eprintf("ii: path to irc directory too long\n"); create_dirtree(path); -- 2.4.10 --Multipart=_Mon__9_May_2016_17_21_10_+0200_I.6cpFVydhq75aaE Content-Type: text/x-diff; name="0030-update-man-page-this-was-not-supported.patch" Content-Disposition: attachment; filename="0030-update-man-page-this-was-not-supported.patch" Content-Transfer-Encoding: 7bitReceived on Mon Sep 17 2001 - 00:00:00 CEST
This archive was generated by hypermail 2.3.0 : Mon May 09 2016 - 17:24:22 CEST