+
+char *auth_sasl_extract_userid(const char *authtype,
+ const char *authdata)
+{
+ struct cram_callback_info cci;
+ char *p;
+ char *t;
+ char *d;
+
+ if (strcmp(authtype, AUTHTYPE_LOGIN) == 0)
+ {
+ char *q;
+
+ p=strdup(authdata);
+
+ if (!p)
+ return NULL;
+
+ q=strchr(p, '\n');
+ if (q) *q=0;
+ return p;
+ }
+
+ if ((t=strdup(authtype)) == NULL)
+ return NULL;
+
+ if ((d=strdup(authdata)) == NULL)
+ {
+ free(t);
+ return NULL;
+ }
+
+ if (auth_get_cram_silent(t, d, &cci))
+ {
+ free(d);
+ free(t);
+ return (NULL);
+ }
+
+ p=strdup(cci.user);
+ free(d);
+ free(t);
+ return p;
+}