X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/2bead8292800e9730448cc128a9f9e05f88b17a9..0590cedca75c01811972b2f694f60f24028ee973:/lib/client.c diff --git a/lib/client.c b/lib/client.c index d3ea6c3..c06bdf1 100644 --- a/lib/client.c +++ b/lib/client.c @@ -20,7 +20,7 @@ /** @file lib/client.c * @brief Simple C client * - * See @file lib/eclient.c for an asynchronous-capable client + * See @ref lib/eclient.c for an asynchronous-capable client * implementation. */ @@ -59,11 +59,20 @@ #include "rights.h" #include "trackdb.h" +/** @brief Client handle contents */ struct disorder_client { - FILE *fpin, *fpout; + /** @brief Stream to read from */ + FILE *fpin; + /** @brief Stream to write to */ + FILE *fpout; + /** @brief Peer description */ char *ident; + /** @brief Username */ char *user; + /** @brief Report errors to @c stderr */ int verbose; + /** @brief Last error string */ + char *last; }; /** @brief Create a new client @@ -97,14 +106,23 @@ static int response(disorder_client *c, char **rp) { if(r[0] >= '0' && r[0] <= '9' && r[1] >= '0' && r[1] <= '9' && r[2] >= '0' && r[2] <= '9' - && r[3] == ' ') + && r[3] == ' ') { + c->last = r + 4; return (r[0] * 10 + r[1]) * 10 + r[2] - 111 * '0'; - else { + } else { error(0, "invalid reply format from %s", c->ident); return -1; } } +/** @brief Return last response string + * @param c Client + * @return Last response string (UTF-8, English) or NULL + */ +const char *disorder_last(disorder_client *c) { + return c->last; +} + /** @brief Read and partially parse a response * @param c Client * @param rp Where to store response text (or NULL) (UTF-8) @@ -155,6 +173,10 @@ static int disorder_simple_v(disorder_client *c, const char *arg; struct dynstr d; + if(!c->fpout) { + error(0, "not connected to server"); + return -1; + } if(cmd) { dynstr_init(&d); dynstr_append_string(&d, cmd); @@ -533,6 +555,7 @@ int disorder_playing(disorder_client *c, struct queue_entry **qp) { return 0; } +/** @brief Fetch the queue, recent list, etc */ static int disorder_somequeue(disorder_client *c, const char *cmd, struct queue_entry **qp) { struct queue_entry *qh, **qt = &qh, *q; @@ -725,7 +748,7 @@ static void pref_error_handler(const char *msg, error(0, "error handling 'prefs' reply: %s", msg); } -/** @param Get all preferences for a trcak +/** @brief Get all preferences for a trcak * @param c Client * @param track Track name * @param kp Where to store linked list of preferences @@ -849,7 +872,7 @@ int disorder_random_disable(disorder_client *c) { /** @brief Test whether random play is enabled * @param c Client - * @param existsp Where to store result (non-0 iff enabled) + * @param enabledp Where to store result (non-0 iff enabled) * @return 0 on success, non-0 on error */ int disorder_random_enabled(disorder_client *c, int *enabledp) { @@ -939,7 +962,7 @@ int disorder_part(disorder_client *c, char **partp, /** @brief Resolve aliases * @param c Client - * @param trackkp Where to store canonical name (UTF-8) + * @param trackp Where to store canonical name (UTF-8) * @param track Track name (UTF-8) * @return 0 on success, non-0 on error */ @@ -1108,7 +1131,6 @@ int disorder_edituser(disorder_client *c, const char *user, * @param user Username * @param password Password * @param email Email address (UTF-8) - * @param rights Initial rights or NULL to use default * @param confirmp Where to store confirmation string * @return 0 on success, non-0 on error */ @@ -1126,7 +1148,13 @@ int disorder_register(disorder_client *c, const char *user, * @return 0 on success, non-0 on error */ int disorder_confirm(disorder_client *c, const char *confirm) { - return disorder_simple(c, 0, "confirm", confirm, (char *)0); + char *u; + int rc; + + if(!(rc = dequote(disorder_simple(c, &u, "confirm", confirm, (char *)0), + &u))) + c->user = u; + return rc; } /** @brief Make a cookie for this login @@ -1139,6 +1167,23 @@ int disorder_make_cookie(disorder_client *c, char **cookiep) { cookiep); } +/** @brief Revoke the cookie used by this session + * @param c Client + * @return 0 on success, non-0 on error + */ +int disorder_revoke(disorder_client *c) { + return disorder_simple(c, 0, "revoke", (char *)0); +} + +/** @brief Request a password reminder email + * @param c Client + * @param user Username + * @return 0 on success, non-0 on error + */ +int disorder_reminder(disorder_client *c, const char *user) { + return disorder_simple(c, 0, "reminder", user, (char *)0); +} + /* Local Variables: c-basic-offset:2