X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/ad131c2579b5e9fda58e5d76bdb20d5949a711ee..7489d3af05a4394e9621e14a196a9f6c4f788a26:/lib/client.c diff --git a/lib/client.c b/lib/client.c index 6f08fec..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 */ @@ -176,6 +175,13 @@ static int check_response(disorder_client *c, char **rp) { * 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() */ @@ -213,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)); @@ -502,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";