add ipv6 support, thanks Evil_Bob - irc - Unnamed repository; edit this file 'description' to name the repository.
(HTM) git clone git://vernunftzentrum.de/irc.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
---
(DIR) commit f80202802bc1fb4d56f6ce27bcdeaf58d7d1cd1e
(DIR) parent c3722d014fe734bd6e7cb97cf1352f9822811c97
(HTM) Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date: Tue, 9 Aug 2016 19:35:26 -0400
add ipv6 support, thanks Evil_Bob
Diffstat:
irc.c | 46 +++++++++++++++++--------------
1 file changed, 25 insertions(+), 21 deletions(-)
---
(DIR) diff --git a/irc.c b/irc.c
@@ -30,7 +30,7 @@
#define PFMT " %-12s < %s"
#define PFMTHIGH "> %-12s < %s"
#define SRV "irc.oftc.net"
-#define PORT 6667
+#define PORT "6667"
enum {
ChanLen = 64,
@@ -211,25 +211,30 @@ srd(void)
}
static int
-dial(const char *host, short port)
+dial(const char *host, const char *service)
{
- int f;
- struct sockaddr_in sin;
- struct addrinfo *ai, hai = { 0 };
-
- hai.ai_family = AF_INET;
- hai.ai_socktype = SOCK_STREAM;
- if (getaddrinfo(host, 0, &hai, &ai))
- panic("Cannot resolve host.");
- memcpy(&sin, ai->ai_addr, sizeof sin);
- sin.sin_port = htons(port);
- freeaddrinfo(ai);
- f = socket(AF_INET, SOCK_STREAM, 0);
- if (f < 0)
- panic("Cannot create socket.");
- if (connect(f, (struct sockaddr *)&sin, sizeof sin) < 0)
+ struct addrinfo hints, *res = NULL, *rp;
+ int fd = -1, 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)))
+ panic("Getaddrinfo failed.");
+ for (rp = res; rp; rp = rp->ai_next) {
+ if ((fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1)
+ continue;
+ if (connect(fd, res->ai_addr, res->ai_addrlen) == -1) {
+ close(fd);
+ continue;
+ }
+ break;
+ }
+ if (fd == -1)
panic("Cannot connect to host.");
- return f;
+ freeaddrinfo(res);
+ return fd;
}
static int
@@ -728,7 +733,7 @@ main(int argc, char *argv[])
const char *user = getenv("USER");
const char *ircnick = getenv("IRCNICK");
const char *server = SRV;
- unsigned short port = PORT;
+ const char *port = PORT;
int o;
while ((o = getopt(argc, argv, "hn:u:s:p:l:")) >= 0)
@@ -754,8 +759,7 @@ main(int argc, char *argv[])
server = optarg;
break;
case 'p':
- if (!(port = strtol(optarg, 0, 0)))
- goto usage;
+ port = optarg;
break;
}
if (!nick[0] && ircnick && strlen(ircnick) < sizeof nick)