diff options
Diffstat (limited to 'kris/util.c')
| -rw-r--r-- | kris/util.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/kris/util.c b/kris/util.c new file mode 100644 index 0000000..19c2f2b --- /dev/null +++ b/kris/util.c @@ -0,0 +1,73 @@ +#include <netdb.h> +#include <netinet/in.h> +#include <sys/socket.h> + +static void +eprint(const char *fmt, ...) { + + va_buf(bufout, fmt); + fprintf(stderr, "%s", bufout); + + if(fmt[0] && fmt[strlen(fmt)-1] == ':') + fprintf(stderr, " %s\n", strerror(errno)); + exit(1); +} + +static int +dial(char *host, int port) { + struct hostent *hp; + static struct sockaddr_in addr; + int i; + + if((i = socket(AF_INET, SOCK_STREAM, 0)) < 0) + eprint("sic: cannot connect host '%s':", host); + if(nil == (hp = gethostbyname(host))) + eprint("sic: cannot resolve hostname '%s': %s\n", host, hstrerror(h_errno)); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + memcpy(&addr.sin_addr, hp->h_addr, hp->h_length); + if(connect(i, (struct sockaddr*)&addr, sizeof(struct sockaddr_in))) + eprint("sic: cannot connect host '%s':", host); + return i; +} + +#define strlcpy _strlcpy +static void +strlcpy(char *to, const char *from, int l) { + strncpy(to, from, l-1); + 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; +} + + |
