X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/dab87ecc3bd6deafe058f7785093fd1c0b702eb5..refs/tags/5.1:/lib/client.c diff --git a/lib/client.c b/lib/client.c index 9f350d8..55cfe1c 100644 --- a/lib/client.c +++ b/lib/client.c @@ -50,7 +50,6 @@ #include "authhash.h" #include "client-common.h" #include "rights.h" -#include "trackdb.h" #include "kvp.h" /** @brief Client handle contents */ @@ -151,12 +150,6 @@ static int check_response(disorder_client *c, char **rp) { } } -/** @brief Marker for a command body */ -static const char disorder_body[1]; - -/** @brief Marker for a list of args */ -static const char disorder_list[1]; - /** @brief Issue a command and parse a simple response * @param c Client * @param rp Where to store result, or NULL @@ -172,16 +165,23 @@ static const char disorder_list[1]; * NB that the response will NOT be converted to the local encoding * nor will quotes be stripped. See dequote(). * - * Put @ref disorder_body in the argument list followed by a char ** + * Put @ref disorder__body in the argument list followed by a char ** * and int giving the body to follow the command. If the int is @c -1 * then the list is assumed to be NULL-terminated. This may be used * only once. * - * Put @ref disorder_list in the argument list followed by a char ** + * Put @ref disorder__list in the argument list followed by a char ** * and int giving a list of arguments to include. If the int is @c -1 * then the list is assumed to be NULL-terminated. This may be used * any number of times. * + * Put @ref disorder__integer in the argument list followed by a long to + * send its value in decimal. This may be used any number of times. + * + * Put @ref disorder__time in the argument list followed by a time_t + * to send its value in decimal. This may be used any number of + * times. + * * Usually you would call this via one of the following interfaces: * - disorder_simple() */ @@ -204,11 +204,11 @@ static int disorder_simple_v(disorder_client *c, dynstr_init(&d); dynstr_append_string(&d, cmd); while((arg = va_arg(ap, const char *))) { - if(arg == disorder_body) { + if(arg == disorder__body) { body = va_arg(ap, char **); nbody = va_arg(ap, int); has_body = 1; - } else if(arg == disorder_list) { + } else if(arg == disorder__list) { char **list = va_arg(ap, char **); int nlist = va_arg(ap, int); if(nlist < 0) { @@ -219,6 +219,18 @@ static int disorder_simple_v(disorder_client *c, 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); + 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); + dynstr_append(&d, ' '); + dynstr_append_string(&d, buffer); } else { dynstr_append(&d, ' '); dynstr_append_string(&d, quoteutf8(arg)); @@ -508,13 +520,13 @@ int disorder_connect(disorder_client *c) { return -1; } password = config->password; - /* Maybe we can read the database */ - if(!password && trackdb_readable()) { - trackdb_init(TRACKDB_NO_RECOVER|TRACKDB_NO_UPGRADE); - trackdb_open(TRACKDB_READ_ONLY); - password = trackdb_get_password(username); - trackdb_close(); - } + /* If we're connecting as 'root' guess that we're the system root + * user (or the jukebox user), both of which can use the privileged + * socket. They can also furtle with the db directly: that is why + * privileged socket does not represent a privilege escalation. */ + if(!password + && !strcmp(username, "root")) + password = "anything will do for root"; if(!password) { /* Oh well */ c->last = "no password";