-static int connect_sock(void *vc,
- const struct sockaddr *sa,
- socklen_t len,
- const char *ident) {
- const char *username, *password;
- disorder_client *c = vc;
-
- if(!(username = config->username)) {
- error(0, "no username configured");
- return -1;
- }
- password = config->password;
- if(!password) {
- /* Maybe we can read the database */
- /* TODO failure to open the database should not be fatal */
- trackdb_init(TRACKDB_NO_RECOVER|TRACKDB_NO_UPGRADE);
- trackdb_open(TRACKDB_READ_ONLY);
- password = trackdb_get_password(username);
- trackdb_close();
- }
- if(!password) {
- /* Oh well */
- error(0, "no password configured");
- return -1;
- }
- return disorder_connect_sock(c, sa, len, username, password, ident);
-}
-
-int disorder_connect(disorder_client *c) {
- return with_sockaddr(c, connect_sock);
-}
-
-static int check_running(void attribute((unused)) *c,
- const struct sockaddr *sa,
- socklen_t len,
- const char attribute((unused)) *ident) {
- int fd, ret;
-
- if((fd = socket(sa->sa_family, SOCK_STREAM, 0)) < 0)
- fatal(errno, "error calling socket");
- if(connect(fd, sa, len) < 0) {
- if(errno == ECONNREFUSED || errno == ENOENT)
- ret = 0;
- else
- fatal(errno, "error calling connect");
- } else
- ret = 1;
- xclose(fd);
- return ret;
-}
+/** @brief Dequote a result string
+ * @param rc 0 on success, non-0 on error
+ * @param rp Where result string is stored (UTF-8)
+ * @return @p rc
+ *
+ * This is used as a wrapper around disorder_simple() to dequote
+ * results in place.
+ */
+static int dequote(int rc, char **rp) {
+ char **rr;