X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/1be9101e4d2cfd1aed5249b0cdf126d747095ce8..aa846a75f692251355458667d28378398fd84b67:/lib/client.c diff --git a/lib/client.c b/lib/client.c index 55cfe1c..0ba9c86 100644 --- a/lib/client.c +++ b/lib/client.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2004-2010 Richard Kettlewell + * Copyright (C) 2004-13 Richard Kettlewell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,13 +25,25 @@ #include "common.h" #include -#include -#include -#include -#include +#if HAVE_SYS_SOCKET_H +# include +#endif +#if HAVE_NETINET_IN_H +# include +#endif +#if HAVE_SYS_UN_H +# include +#endif +#if HAVE_UNISTD_H +# include +#endif #include -#include -#include +#if HAVE_NETDB_H +# include +#endif +#if HAVE_PCRE_H +# include +#endif #include "log.h" #include "mem.h" @@ -66,6 +78,8 @@ struct disorder_client { int verbose; /** @brief Last error string */ const char *last; + /** @brief Address family */ + int family; }; /** @brief Create a new client @@ -80,9 +94,15 @@ disorder_client *disorder_new(int verbose) { disorder_client *c = xmalloc(sizeof (struct disorder_client)); c->verbose = verbose; + c->family = -1; return c; } +/** @brief Return the address family used by this client */ +int disorder_client_af(disorder_client *c) { + return c->family; +} + /** @brief Read a response line * @param c Client * @param rp Where to store response, or NULL (UTF-8) @@ -211,24 +231,25 @@ static int disorder_simple_v(disorder_client *c, } else if(arg == disorder__list) { char **list = va_arg(ap, char **); int nlist = va_arg(ap, int); + int n; if(nlist < 0) { for(nlist = 0; list[nlist]; ++nlist) ; } - for(int n = 0; n < nlist; ++n) { + for(n = 0; n < nlist; ++n) { dynstr_append(&d, ' '); dynstr_append_string(&d, quoteutf8(arg)); } } else if(arg == disorder__integer) { long n = va_arg(ap, long); char buffer[16]; - snprintf(buffer, sizeof buffer, "%ld", n); + byte_snprintf(buffer, sizeof buffer, "%ld", n); dynstr_append(&d, ' '); dynstr_append_string(&d, buffer); } else if(arg == disorder__time) { time_t n = va_arg(ap, time_t); char buffer[16]; - snprintf(buffer, sizeof buffer, "%lld", (long long)n); + byte_snprintf(buffer, sizeof buffer, "%lld", (long long)n); dynstr_append(&d, ' '); dynstr_append_string(&d, buffer); } else { @@ -243,10 +264,11 @@ static int disorder_simple_v(disorder_client *c, goto write_error; xfree(d.vec); if(has_body) { + int n; if(nbody < 0) for(nbody = 0; body[nbody]; ++nbody) ; - for(int n = 0; n < nbody; ++n) { + for(n = 0; n < nbody; ++n) { if(body[n][0] == '.') if(fputc('.', c->fpout) < 0) goto write_error; @@ -407,6 +429,7 @@ int disorder_connect_generic(struct config *conf, disorder_error(errno, "error calling socket"); return -1; } + c->family = sa->sa_family; if(connect(fd, sa, salen) < 0) { byte_xasprintf((char **)&c->last, "connect: %s", strerror(errno)); disorder_error(errno, "error calling connect"); @@ -547,7 +570,7 @@ int disorder_connect(disorder_client *c) { * * If @p cookie is NULL or does not work then we attempt to log in as * guest instead (so when the cookie expires only an extra round trip - * is needed rathre than a complete new login). + * is needed rather than a complete new login). */ int disorder_connect_cookie(disorder_client *c, const char *cookie) {