![Hiltjo Posthuma](/assets/img/avatar_default.png)
cast all ctype(3) functions argument to (unsigned char) to avoid UB POSIX says: "The c argument is an int, the value of which the application shall ensure is a character representable as an unsigned char or equal to the value of the macro EOF. If the argument has any other value, the behavior is undefined." Many libc cast implicitly the value, but NetBSD for example does not, which is probably the correct thing to interpret it.
68 lines
1.3 KiB
C
68 lines
1.3 KiB
C
/* See LICENSE file for license details. */
|
|
#include <netdb.h>
|
|
#include <netinet/in.h>
|
|
#include <sys/socket.h>
|
|
|
|
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;
|
|
}
|
|
|
|
static char *
|
|
eat(char *s, int (*p)(int), int r) {
|
|
while(*s != '\0' && p((unsigned char)*s) == r)
|
|
s++;
|
|
return s;
|
|
}
|
|
|
|
static char*
|
|
skip(char *s, char c) {
|
|
while(*s != c && *s != '\0')
|
|
s++;
|
|
if(*s != '\0')
|
|
*s++ = '\0';
|
|
return s;
|
|
}
|
|
|
|
static void
|
|
trim(char *s) {
|
|
char *e;
|
|
|
|
e = s + strlen(s) - 1;
|
|
while(e > s && isspace((unsigned char)*e))
|
|
e--;
|
|
*(e + 1) = '\0';
|
|
}
|