sic

simple irc client
git clone git://git.suckless.org/sic
Log | Files | Refs | README | LICENSE

commit 7f1961d4c6c5e326fcb588785f1935e4176a2d01
parent 2b853804113a01672790aed67cb372d35554b61e
Author: Kris Maglione <jg@suckless.org>
Date:   Wed, 23 Sep 2009 12:52:13 -0400

Update sic/util.c to match sic.c tip.
Diffstat:
Mkris/sic.c | 4++--
Mkris/util.c | 34++++++++++++++++++++--------------
2 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/kris/sic.c b/kris/sic.c @@ -18,7 +18,7 @@ typedef unsigned short ushort; #define PINGTIMEOUT 300 static char* host = "irc.oftc.net"; -static ushort port = 6667; +static char* port = "ircd"; static char* password; static char nick[32]; @@ -150,7 +150,7 @@ main(int argc, char *argv[]) { if(++i < argc) host = argv[i]; break; case 'p': - if(++i < argc) port = atoi(argv[i]); + if(++i < argc) port = argv[i]; break; case 'n': if(++i < argc) strlcpy(nick, argv[i], sizeof nick); diff --git a/kris/util.c b/kris/util.c @@ -21,21 +21,27 @@ eprint(const char *fmt, ...) { } static int -dial(char *host, int port) { - struct hostent *hp; - static struct sockaddr_in addr; - int i; +dial(char *host, char *port) { + static struct addrinfo hints; + struct addrinfo *res, *r; + int srv; - if((i = socket(AF_INET, SOCK_STREAM, 0)) < 0) - eprint("sic: cannot connect host '%s':", host); - if(nil == (hp = gethostbyname(host))) - eprint("sic: cannot resolve hostname '%s': %s\n", host, hstrerror(h_errno)); - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - memcpy(&addr.sin_addr, hp->h_addr, hp->h_length); - if(connect(i, (struct sockaddr*)&addr, sizeof(struct sockaddr_in))) - eprint("sic: cannot connect host '%s':", host); - return i; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + if(getaddrinfo(host, port, &hints, &res) != 0) + eprint("error: cannot resolve hostname '%s':", host); + for(r = res; r; r = r->ai_next) { + if((srv = socket(r->ai_family, r->ai_socktype, r->ai_protocol)) == -1) + continue; + if(connect(srv, r->ai_addr, r->ai_addrlen) == 0) + break; + close(srv); + } + freeaddrinfo(res); + if(!r) + eprint("error: cannot connect to host '%s'\n", host); + return srv; } #define strlcpy _strlcpy