#include <pwd.h>
#include <string.h>
#include <stdio.h>
+#include <sys/poll.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
struct authmech *mech;
};
+struct synclogindata
+{
+ int aborted;
+ int err;
+ wchar_t *reason;
+};
+
struct gencbdata
{
void (*callback)(int resp, void *data);
}
};
-static int builtinconv(int type, wchar_t *text, char **resp, void *data)
+int dc_convtty(int type, wchar_t *text, char **resp, void *data)
{
char *buf, *pass;
return(1);
}
+int dc_convnone(int type, wchar_t *text, char **resp, void *data)
+{
+ return(1);
+}
+
static int logincallback(struct dc_response *resp)
{
int i;
data = smalloc(sizeof(*data));
if(conv == NULL)
- conv = builtinconv;
+ conv = dc_convtty;
data->conv = conv;
data->mech = NULL;
data->data = udata;
dc_queuecmd(logincallback, data, L"lsauth", NULL);
}
+static void synclogincb(int err, wchar_t *reason, struct synclogindata *data)
+{
+ if(data->aborted)
+ {
+ free(data);
+ return;
+ }
+ data->err = err;
+ if(reason == NULL)
+ data->reason = NULL;
+ else
+ data->reason = swcsdup(reason);
+}
+
+int dc_login(char *username, int useauthless, int (*conv)(int, wchar_t *, char **, void *), wchar_t **reason)
+{
+ int ret, abort;
+ struct synclogindata *dbuf;
+ struct pollfd pfd;
+
+ dbuf = smalloc(sizeof(*dbuf));
+ memset(dbuf, 0, sizeof(*dbuf));
+ dbuf->err = -1;
+ dc_loginasync(username, useauthless, conv, (void (*)(int, wchar_t *, void *))synclogincb, dbuf);
+ while(dbuf->err == -1)
+ {
+ pfd.fd = dc_getfd();
+ pfd.events = POLLIN;
+ if(dc_wantwrite())
+ pfd.events |= POLLOUT;
+ abort = 0;
+ if(poll(&pfd, 1, -1) < 0)
+ abort = 1;
+ if(!abort && (pfd.revents & POLLIN) && dc_handleread())
+ abort = 1;
+ if(!abort && (pfd.revents & POLLOUT) && dc_handlewrite())
+ abort = 1;
+ if(abort)
+ {
+ dbuf->aborted = 1;
+ return(-1);
+ }
+ }
+ if(reason != NULL)
+ *reason = dbuf->reason;
+ else if(dbuf->reason != NULL)
+ free(dbuf->reason);
+ ret = dbuf->err;
+ free(dbuf);
+ return(ret);
+}
+
static struct dc_fnetpeerdatum *finddatum(struct dc_fnetnode *fn, wchar_t *id)
{
struct dc_fnetpeerdatum *datum;
free(peer->di[i].d.str);
putdatum(peer->fn, peer->di[i].datum);
}
+ free(peer->di);
free(peer);
}