X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/96f6312a0a827d2f90e7ab88d3a203c56eb82a9f..477b12ff719d3749b8d8f85035bd6384fee9be0d:/lib/client.c diff --git a/lib/client.c b/lib/client.c index 80b4cd2..fb1b1cc 100644 --- a/lib/client.c +++ b/lib/client.c @@ -41,9 +41,6 @@ #if HAVE_NETDB_H # include #endif -#if HAVE_PCRE_H -# include -#endif #include "log.h" #include "mem.h" @@ -85,6 +82,8 @@ struct disorder_client { int open; /** @brief Socket I/O context */ struct socketio sio; + /** @brief Whether to try to open a privileged connection */ + int trypriv; }; /** @brief Create a new client @@ -100,12 +99,37 @@ disorder_client *disorder_new(int verbose) { c->verbose = verbose; c->family = -1; + c->trypriv = 1; return c; } -/** @brief Return the address family used by this client */ -int disorder_client_af(disorder_client *c) { - return c->family; +/** @brief Don't try to make a privileged connection + * @param c Client + * + * You must call this before any of the connection functions (e.g., + * disorder_connect(), disorder_connect_user()), if at all. + */ +void disorder_force_unpriv(disorder_client *c) { + assert(!c->open); + c->trypriv = 0; +} + +/** @brief Determine the local socket address of this client */ +int disorder_client_sockname(disorder_client *c, + struct sockaddr *sa, socklen_t *len_inout) { + int rc; + if((rc = getsockname(c->sio.sd, sa, len_inout))) + disorder_error(errno, "failed to read client socket name"); + return rc; +} + +/** @brief Determine the remote peer address for this client */ +int disorder_client_peername(disorder_client *c, + struct sockaddr *sa, socklen_t *len_inout) { + int rc; + if((rc = getpeername(c->sio.sd, sa, len_inout))) + disorder_error(errno, "failed to read client socket name"); + return rc; } /** @brief Read a response line @@ -432,7 +456,9 @@ int disorder_connect_generic(struct config *conf, socklen_t salen; char errbuf[1024]; - if((salen = find_server(conf, &sa, &c->ident)) == (socklen_t)-1) + if((salen = disorder_find_server(conf, + (c->trypriv ? 0 : DISORDER_FS_NOTPRIV), + &sa, &c->ident)) == (socklen_t)-1) return -1; c->input = 0; c->output = 0; @@ -749,6 +775,10 @@ static int pairlist(disorder_client *c, struct kvp **kp, const char *cmd, ...) { return 0; } +#if _WIN32 +# define boolean bodge_boolean +#endif + /** @brief Parse a boolean response * @param cmd Command for use in error messsage * @param value Result from server @@ -788,6 +818,7 @@ int disorder_log(disorder_client *c, struct sink *s) { byte_xasprintf((char **)&c->last, "input error: unexpected EOF"); return -1; } + return 0; }