ref: 8df402e53d02ca2c0b976715ce57c28750dd99d9
dir: /util.c/
/*
* This work is dedicated to the public domain.
* See COPYING file for more information.
*/
#include <ctype.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
void *
ecalloc(size_t nmemb, size_t size)
{
void *p;
if ((p = calloc(nmemb, size)) == NULL) {
printf("error: calloc: %s\n", strerror(errno));
return NULL;
}
return p;
}
char*
split(char **str, char ch)
{
char *token = *str;
if (**str == '\0') return *str;
while (**str != ch && **str != '\0')
(*str)++;
if (**str == '\0')
return token;
**str = '\0';
(*str)++;
while(**str == ch && **str != '\0')
(*str)++;
return token;
}
ssize_t
fdprintf(int fd, const char *fmt, ...)
{
va_list args;
char buf[1024];
size_t len;
ssize_t n, i = 0;
va_start(args, fmt);
vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
len = strlen(buf);
while (i < (ssize_t)len) {
if ((n = write(fd, buf + i, len - (size_t)i)) == -1) {
printf("error: write failed: %s\n", strerror(errno));
return -1;
}
i += n;
}
return i;
}
int
dial(char *host, char *port)
{
static struct addrinfo hints, *res = NULL, *res0;
int fd = -1, r;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((r = getaddrinfo(host, port, &hints, &res0)) != 0) {
printf("error: getaddrinfo: %s\n", gai_strerror(r));
return -1;
}
for (res = res0; res != NULL; res = res->ai_next) {
if ((fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0)
continue;
if (connect(fd, res->ai_addr, res->ai_addrlen) != 0) {
close(fd);
fd = -1;
continue;
}
break;
}
if (fd == -1)
printf("error: cannot connect to host '%s'\n", host);
freeaddrinfo(res0);
return fd;
}
ssize_t
readline(int fd, char *buffer, size_t size)
{
ssize_t n, i = 0;
char c;
do {
if ((n = read(fd, &c, sizeof(char))) != sizeof(char))
return n;
buffer[i++] = c;
} while ((i < (ssize_t)size) && (c != '\n') && (c != '\0'));
buffer[i-1] = '\0';
return i;
}