From 1a4256ef71ddba6c3cbb28861e0321184860653f Mon Sep 17 00:00:00 2001 From: Anselm R Garbe Date: Sat, 28 Nov 2009 12:16:35 +0000 Subject: merged kris' changes into mainstream sic --- util.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 util.c (limited to 'util.c') diff --git a/util.c b/util.c new file mode 100644 index 0000000..5412efc --- /dev/null +++ b/util.c @@ -0,0 +1,81 @@ +/* See LICENSE file for license details. */ +#include +#include +#include + +static void +eprint(const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vsnprintf(bufout, sizeof bufout, fmt, ap); + va_end(ap); + fprintf(stderr, "%s", bufout); + if(fmt[0] && fmt[strlen(fmt) - 1] == ':') + fprintf(stderr, " %s\n", strerror(errno)); + exit(1); +} + +static int +dial(char *host, char *port) { + static struct addrinfo hints; + int srv; + struct addrinfo *res, *r; + + 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 +static void +strlcpy(char *to, const char *from, int l) { + memccpy(to, from, '\0', l); + to[l-1] = '\0'; +} + +static void +eat(char **s, int (*p)(int), int r) { + char *q; + + for(q = *s; *q && p(*q) == r; q++) + ; + *s = q; +} + +static char* +tok(char **s) { + char *p; + + eat(s, isspace, 1); + p = *s; + eat(s, isspace, 0); + if(**s) + *(*s)++ = '\0'; + return p; +} + +static char* +ctok(char **s, int c) { + char *p, *q; + + q = *s; + for(p = q; *p && *p != c; p++) + ; + if(*p) *p++ = '\0'; + *s = p; + return q; +} -- cgit v1.2.3