From 5081507516fec27ffbc40b004d1c76e7fdb766c1 Mon Sep 17 00:00:00 2001 From: Dmitry Zubarev Date: Tue, 30 Aug 2016 00:02:13 +0500 Subject: [PATCH] Added basic IPv6 support. --- socket.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/socket.c b/socket.c index db3c606..a964ff1 100644 --- a/socket.c +++ b/socket.c @@ -251,16 +251,30 @@ static struct data *construct(const char *spec, int mode) { data->client_sock = -1; data->mode = mode; - char *colon = strchr(spec, ':'); + + const char *bracket = strchr(spec, ']'); + if (spec[0] == '[' && bracket) { + spec++; + } + + const char *colon = bracket ? strrchr(bracket, ':') : strchr(spec, ':'); + int shift; + if (bracket) { + shift = bracket - spec; + } else if (colon) { + shift = colon - spec; + } else { + shift = strlen(spec); + } + strncpy(data->host, spec, shift); + if (colon) { - strncpy(data->host, spec, colon - spec); if (strlen(spec) > strlen(data->host) + 1 + PORT_MAX_CHARS) { fputs("port too long", stderr); goto cleanup; } strncpy(data->port, colon+1, PORT_MAX_CHARS+1); } else { - strcpy(data->host, spec); strcpy(data->port, DEFAULT_PORT); } }